Como repetir a imagem de plano de fundo de um aplicativo


314

Eu defini uma imagem de plano de fundo no meu aplicativo, mas a imagem de plano de fundo é pequena e quero que seja repetida e preencha a tela inteira. O que devo fazer?

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

Respostas:


429

Ok, aqui está o que eu tenho no meu aplicativo. Ele inclui um hack para impedir que ListViews fiquem pretos durante a rolagem.

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
Tente com isso também: android: gravidade = "clip_horizontal" --- é evitar a imagem de deformação
Felipe

2
Eu tentei isso, mas viu apenas telha única estendeu a toda a tela :(
Sergey Metlov

Se eu tiver um ScrollViewe colocar um plano de fundo para repetir nele e tiver uma longa lista longa, não terei problemas com a exceção OutOfMemory quando o arquivo ScrollViewficar muito longo?
AndreiBogdan

Lembre-se de que você deve ter pastas drawable-hdpi, drawable-mdpi e drawable-ldpi. Você precisará adicionar esse arquivo backrepeat.xml e as imagens relevantes a cada uma delas para permitir essa funcionalidade em alta, tamanhos de tela médio e baixo dpi (pontos por polegada).
sabre tabatabaee Yazdi

2
@sabertabatabaeeyazdi Você só precisa de imagens nessas pastas. O XML pode ser colocado na pasta drawable(sem som -*dpi).
Jaroslav

176

Existe uma propriedade no xml drawable para fazer isso. android: tileMode = "repeat"

Consulte este site: http://androidforbeginners.blogspot.com/2010/06/how-to-tile-background-image-in-android.html


38
Eu realmente não sei como isso é tão baixo. Instinto de rebanho? Esta é a implementação nativa do fundo de azulejos
Michał K

5
Este funciona como um encanto. Além disso, este parece ser o caminho certo para fazê-lo.
JCasso

3
Concordo que esta deve ser a resposta aceita. É realmente simples e funciona perfeitamente!
huong

6
+1 Só uma coisa deve ser corrigido que é mencionado de forma errada no artigo: 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. Você só precisa colocar os drawables referenciados em todos os baldes de densidade. O drawable XML de referência pode ser colocado na drawablepasta, isso é suficiente.
caw

Isto é o que você chama explicado por um profissional
Muneeb Mirza

69

Aqui está uma implementação em java pura da repetição da imagem de plano de fundo:

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

Nesse caso, nossa imagem de plano de fundo teria que ser armazenada em res / drawable / bg_image.png.


6
android.graphics.Shader
Peter Willsey

Se eu tiver um ScrollViewe colocar um plano de fundo para repetir nele e tiver uma longa lista longa, não terei problemas com a exceção OutOfMemory quando o arquivo ScrollViewficar muito longo?
AndreiBogdan

Por que isso não deveria mais funcionar? Depreciação significa que esses comandos não devem mais ser usados ​​porque podem ser desativados em algum momento no futuro. Na API 19, isso ainda funciona como o @plowman sugeriu. Além disso, o BitmapDrawable não está obsoleto, mas apenas alguns de seus métodos. Eu editei o código acima para não precisarmos usar métodos obsoletos.
Oliver Hausler

16

Expandindo a resposta do plowman, aqui está a versão não preterida da alteração da imagem de plano de fundo com 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);*/
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.