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

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

Laszlo Lugosi
fonte
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.

lavrador
fonte
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);
}
user3763868
fonte
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
fonte