So wiederholen Sie das Hintergrundbild einer App

314

Ich habe in meiner App ein Hintergrundbild festgelegt, aber das Hintergrundbild ist klein und ich möchte, dass es wiederholt wird und den gesamten Bildschirm ausfüllt. Was sollte ich tun?

<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:background="@drawable/bg"
    android:tileMode="repeat">
virsir
quelle

Antworten:

429

Ok, hier ist was ich in meiner App habe. Es enthält einen Hack, um zu verhindern, dass ListViews beim Scrollen schwarz wird.

drawable / app_background.xml :

<?xml version="1.0" encoding="utf-8"?>
    <bitmap xmlns:android="http://schemas.android.com/apk/res/android"
        android:src="@drawable/actual_pattern_image"
        android:tileMode="repeat" />

values ​​/ styles.xml :

<?xml version="1.0" encoding="utf-8"?>
<resources>

  <style name="app_theme" parent="android:Theme">
    <item name="android:windowBackground">@drawable/app_background</item>
    <item name="android:listViewStyle">@style/TransparentListView</item>
    <item name="android:expandableListViewStyle">@style/TransparentExpandableListView</item>
  </style>

  <style name="TransparentListView" parent="@android:style/Widget.ListView">
    <item name="android:cacheColorHint">@android:color/transparent</item>
  </style>

  <style name="TransparentExpandableListView" parent="@android:style/Widget.ExpandableListView">
    <item name="android:cacheColorHint">@android:color/transparent</item>
  </style>

</resources>

AndroidManifest.xml :

//
<application android:theme="@style/app_theme">
//
yanchenko
quelle
1
Versuchen Sie es auch damit: android :vity = "clip_horizontal" --- es vermeidet Bildverformungen
Felipe
2
Ich habe es versucht, aber nur eine einzige Kachel auf dem gesamten Bildschirm gesehen :(
Sergey Metlov
Wenn ich ScrollVieweinen Hintergrund habe, den ich wiederholen möchte, und eine lange, lange Liste habe, habe ich dann keine Probleme mit der OutOfMemory-Ausnahme, wenn die ScrollViewsehr lang wird?
AndreiBogdan
Eine Sache zu beachten ist, dass Sie Ordner drawable-hdpi, drawable-mdpi & drawable-ldpi haben sollten. Sie müssen diese backrepeat.xml-Datei und die relevanten Bilder zu jedem dieser hinzufügen, um diese Funktionalität in hohem Maße zu ermöglichen. Bildschirmgrößen mit mittlerer und niedriger Auflösung (Punkte pro Zoll).
Säbel tabatabaee yazdi
2
@sabertabatabaeeyazdi Sie benötigen nur Bilder in diesen Ordnern. XML kann in drawable(ohne -*dpi) Ordner abgelegt werden .
Jaroslav
176

Es gibt eine Eigenschaft in der zeichnbaren XML, um dies zu tun. android: tileMode = "wiederholen"

Siehe diese Website: http://androidforbeginners.blogspot.com/2010/06/how-to-tile-background-image-in-android.html

Laszlo Lugosi
quelle
38
Ich weiß wirklich nicht, wie das so schlecht bewertet ist. Herdentrieb? Dies ist die native Implementierung des gekachelten Hintergrunds
Michał K
5
Dieser funktioniert wie ein Zauber. Auch dieser scheint der richtige Weg zu sein.
JCasso
3
Ich bin damit einverstanden, dass dies die akzeptierte Antwort sein sollte. Es ist wirklich einfach und funktioniert perfekt!
Huong
6
+1 Es muss nur eines korrigiert werden, das im Artikel falsch erwähnt wird : you'll need to add this backrepeat.xml file and the relevant images to each of these to allow this functionality in high, medium and low dpi. Sie müssen nur die referenzierten Zeichen in alle Dichteeimer legen. Das referenzierende XML-Zeichen kann in einem drawableOrdner abgelegt werden , das reicht aus.
Caw
Dies ist, was Sie nennen, erklärt von einem Pro
Muneeb Mirza
69

Hier ist eine reine Java-Implementierung der Wiederholung von Hintergrundbildern:

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    Bitmap bmp = BitmapFactory.decodeResource(getResources(), R.drawable.bg_image);
    BitmapDrawable bitmapDrawable = new BitmapDrawable(bmp);
    bitmapDrawable.setTileModeXY(Shader.TileMode.REPEAT, Shader.TileMode.REPEAT);
    LinearLayout layout = new LinearLayout(this);
    layout.setBackgroundDrawable(bitmapDrawable);
}

In diesem Fall müsste unser Hintergrundbild in res / drawable / bg_image.png gespeichert werden.

Pflüger
quelle
6
android.graphics.Shader
Peter Willsey
Wenn ich ScrollVieweinen Hintergrund habe, den ich wiederholen möchte, und eine lange, lange Liste habe, habe ich dann keine Probleme mit der OutOfMemory-Ausnahme, wenn die ScrollViewsehr lang wird?
AndreiBogdan
Warum sollte das nicht mehr funktionieren? Abschreibung bedeutet, dass diese Befehle nicht mehr verwendet werden sollten, da sie möglicherweise in Zukunft eingestellt werden. In API 19 funktioniert dies weiterhin wie von @plowman vorgeschlagen. Außerdem ist nicht BitmapDrawable veraltet, sondern nur einige seiner Methoden. Ich habe den obigen Code bearbeitet, damit wir keine veralteten Methoden verwenden müssen.
Oliver Hausler
16

Hier ist die nicht veraltete Version des Änderns des Hintergrundbilds mit Java.

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    Bitmap bmp = BitmapFactory.decodeResource(getResources(),
            R.drawable.texture);
    BitmapDrawable bitmapDrawable = new BitmapDrawable(getResources(),bmp);
    bitmapDrawable.setTileModeXY(Shader.TileMode.REPEAT,
            Shader.TileMode.REPEAT);
    setBackground(bitmapDrawable);
}
user3763868
quelle
3
// Prepared By Muhammad Mubashir.
// 26, August, 2011.
// Chnage Back Ground Image of Activity.

package com.ChangeBg_01;

import com.ChangeBg_01.R;

import android.R.color;
import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.view.View;
import android.widget.ImageView;
import android.widget.TextView;

public class ChangeBg_01Activity extends Activity
{
    TextView tv;
    int[] arr = new int[2];
    int i=0;

    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        tv = (TextView)findViewById(R.id.tv);
        arr[0] = R.drawable.icon1;
        arr[1] = R.drawable.icon;

     // Load a background for the current screen from a drawable resource
        //getWindow().setBackgroundDrawableResource(R.drawable.icon1) ;

        final Handler handler=new Handler();
        final Runnable r = new Runnable()
        {
            public void run() 
            {
                //tv.append("Hello World");
                if(i== 2){
                    i=0;            
                }

                getWindow().setBackgroundDrawableResource(arr[i]);
                handler.postDelayed(this, 1000);
                i++;
            }
        };

        handler.postDelayed(r, 1000);
        Thread thread = new Thread()
        {
            @Override
            public void run() {
                try {
                    while(true) 
                    {
                        if(i== 2){
                            //finish();
                            i=0;
                        }
                        sleep(1000);
                        handler.post(r);
                        //i++;
                    }
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        };


    }
}

/*android:background="#FFFFFF"*/
/*
ImageView imageView = (ImageView) findViewById(R.layout.main);
imageView.setImageResource(R.drawable.icon);*/

// Now get a handle to any View contained 
// within the main layout you are using
/*        View someView = (View)findViewById(R.layout.main);

// Find the root view
View root = someView.getRootView();*/

// Set the color
/*root.setBackgroundColor(color.darker_gray);*/
Muhammad Mubashir
quelle