Jak powtórzyć obraz tła aplikacji


314

Ustawiłem obraz tła w mojej aplikacji, ale obraz tła jest mały i chcę, aby powtórzył się i wypełnił cały ekran. Co powinienem zrobić?

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

Odpowiedzi:


429

Ok, oto co mam w mojej aplikacji. Zawiera hack, aby zapobiec sczernieniu ListViews podczas przewijania.

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

wartości / 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
Spróbuj również z tym: android: gravity = "clip_horizontal" --- uniknie deformacji obrazu
Felipe

2
Próbowałem tego, ale widziałem tylko pojedynczy kafelek rozciągnięty na cały ekran :(
Sergey Metlov

Jeśli mam ScrollViewi umieszczam na nim tło do powtórzenia i mam długą długą listę, to czy nie będę miał problemów z wyjątkiem OutOfMemory, gdy ScrollViewstaje się on bardzo długi?
AndreiBogdan

Należy pamiętać, że powinieneś mieć foldery drawable-hdpi, drawable-mdpi i drawable-ldpi, musisz dodać ten plik backrepeat.xml i odpowiednie obrazy do każdego z nich, aby umożliwić tę funkcjonalność na wysokim poziomie, rozmiary ekranu o średniej i niskiej rozdzielczości (punkty na cal).
szabla tabatabaee yazdi

2
@sabertabatabaeeyazdi Potrzebujesz tylko obrazów w tych folderach. XML można umieścić w folderze drawable(withoud -*dpi).
Jaroslav

176

Aby to zrobić, w wysuwanym pliku XML znajduje się właściwość. android: tileMode = "repeat"

Zobacz tę stronę: http://androidforbeginners.blogspot.com/2010/06/how-to-tile-background-image-in-android.html


38
Naprawdę nie wiem, jak to jest tak nisko oceniane. Instynkt stadny? To jest natywna implementacja tła kafelkowego
Michał K

5
Ten działa jak urok. Również ten wydaje się właściwym sposobem na zrobienie tego.
JCasso

3
Zgadzam się, że to powinna być zaakceptowana odpowiedź. To jest naprawdę proste i działa idealnie!
huong

6
+1 Tylko jedna rzecz, że należy skorygować błędnie wspomina w artykule: 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. Musisz umieścić odnośniki do wszystkich koszyków gęstości. Odnośny plik rysunkowy XML można umieścić w drawablefolderze, co wystarczy.
caw

To, co nazywacie wyjaśnione przez profesjonalistę
Muneeb Mirza,

69

Oto implementacja czystego java powtarzającego się obrazu tła:

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

W takim przypadku nasz obraz tła musiałby być przechowywany w res / drawable / bg_image.png.


6
android.graphics.Shader
Peter Willsey

Jeśli mam ScrollViewi umieszczam na nim tło do powtórzenia i mam długą długą listę, to czy nie będę miał problemów z wyjątkiem OutOfMemory, gdy ScrollViewstaje się on bardzo długi?
AndreiBogdan

Dlaczego to nie powinno już działać? Amortyzacja oznacza, że ​​tych poleceń nie należy już używać, ponieważ mogą one zostać wycofane w przyszłości. W API 19 nadal działa to, jak sugerował @plowman. Ponadto nie BitmapDrawable jest przestarzałe, ale tylko niektóre z jego metod. Edytowałem powyższy kod, więc nie musimy używać przestarzałych metod.
Oliver Hausler

16

Rozwijając odpowiedź oracza, oto nieaktualna wersja zmiany obrazu tła za pomocą 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);*/
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.