Cara membuat gambar latar belakang aplikasi diulang

314

Saya telah menetapkan gambar latar belakang di aplikasi saya, tetapi gambar latar belakangnya kecil dan saya ingin itu diulang dan mengisi seluruh layar. Apa yang harus saya lakukan?

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

Jawaban:

429

Ok, inilah yang saya dapatkan di aplikasi saya. Ini termasuk peretasan untuk mencegah agar tidak ListViewmenjadi hitam saat menggulir.

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
sumber
1
Coba juga dengan ini: android: gravity = "clip_horizontal" --- ia menghindari deformasi gambar
Felipe
2
Saya sudah mencoba ini tetapi hanya melihat ubin tunggal membentang ke semua layar :(
Sergey Metlov
Jika saya memiliki ScrollViewdan menempatkan latar belakang untuk mengulanginya dan saya memiliki daftar panjang yang panjang, tidak akankah saya memiliki masalah dengan pengecualian OutOfMemory ketika ScrollViewmenjadi sangat lama?
AndreiBogdan
Satu hal yang perlu diingat adalah bahwa Anda harus memiliki folder drawable-hdpi, drawable-mdpi & drawable-ldpi, Anda harus menambahkan file backrepeat.xml ini dan gambar yang relevan ke masing-masing folder ini untuk memungkinkan fungsionalitas ini tinggi, ukuran layar dpi (titik per inci) sedang dan rendah.
saber tabatabaee yazdi
2
@sabertabatabaeeyazdi Anda hanya perlu gambar di folder itu. XML dapat ditempatkan di folder drawable(tanpa suara -*dpi).
Jaroslav
176

Ada properti di xml yang dapat ditarik untuk melakukannya. android: tileMode = "repeat"

Lihat situs ini: http://androidforbeginners.blogspot.com/2010/06/how-to-tile-background-image-in-android.html

Laszlo Lugosi
sumber
38
Saya benar-benar tidak tahu bagaimana ini dinilai sangat rendah. Insting kawanan? Ini adalah implementasi asli dari latar belakang ubin
Michał K
5
Yang ini bekerja seperti pesona. Juga yang ini sepertinya cara yang tepat untuk melakukannya.
JCasso
3
Saya setuju bahwa ini harus menjadi jawaban yang diterima. Ini sangat sederhana dan bekerja dengan sempurna!
huong
6
1 Hanya satu hal yang harus dikoreksi yang disebutkan salah dalam artikel: 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. Anda hanya perlu menempatkan drawable yang direferensikan di semua bucket density. Referensi XML yang dapat ditarik dapat ditempatkan di drawablefolder, itu sudah cukup.
gak
Inilah yang Anda sebut dijelaskan oleh pro
Muneeb Mirza
69

Berikut ini adalah implementasi java-murni dari pengulangan gambar latar:

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

Dalam hal ini, gambar latar belakang kita harus disimpan di res / drawable / bg_image.png.

pembajak tanah
sumber
6
android.graphics.Shader
Peter Willsey
Jika saya memiliki ScrollViewdan menempatkan latar belakang untuk mengulanginya dan saya memiliki daftar panjang yang panjang, tidak akankah saya memiliki masalah dengan pengecualian OutOfMemory ketika ScrollViewmenjadi sangat lama?
AndreiBogdan
Mengapa ini tidak berfungsi lagi? Depresiasi berarti perintah-perintah ini tidak boleh digunakan lagi karena mereka mungkin akan dihentikan beberapa waktu di masa depan. Di API 19, ini masih berfungsi seperti yang disarankan @plowman. Juga, bukan BitmapDrawable sudah usang, tetapi hanya beberapa metodenya. Saya telah mengedit kode di atas sehingga kami tidak harus menggunakan metode yang sudah usang.
Oliver Hausler
16

Memperluas jawaban bajak, di sini adalah versi non-usang mengubah gambar latar belakang dengan 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);
}
pengguna3763868
sumber
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
sumber