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">

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">
//

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


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.


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);
}

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);*/
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.