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">
virsir
źródło

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">
//
Janchenko
źródło
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

Laszlo Lugosi
źródło
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.

oracz
źródło
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);
}
użytkownik3763868
źródło
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
źródło