Cómo hacer que se repita la imagen de fondo de una aplicación

314

He configurado una imagen de fondo en mi aplicación, pero la imagen de fondo es pequeña y quiero que se repita y complete toda la pantalla. ¿Qué tengo que hacer?

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

Respuestas:

429

Ok, esto es lo que tengo en mi aplicación. Incluye un truco para evitar que los ListViews se pongan negros mientras se desplaza.

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

valores / 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
fuente
1
Pruebe con esto también: android: gravity = "clip_horizontal" --- evita la deformación de la imagen
Felipe
2
He intentado esto, pero vi solo un mosaico extendido a toda la pantalla :(
Sergey Metlov
Si tengo ScrollViewun fondo y lo repito y tengo una lista larga y larga, ¿no tendré problemas con la excepción OutOfMemory cuando se ScrollViewvuelva muy larga?
AndreiBogdan
Una cosa a tener en cuenta es que debe tener carpetas drawable-hdpi, drawable-mdpi y drawable-ldpi, deberá agregar este archivo backrepeat.xml y las imágenes relevantes a cada una de ellas para permitir esta funcionalidad en alto, tamaños de pantalla de ppp medio y bajo (puntos por pulgada).
saber tabatabaee yazdi
2
@sabertabatabaeeyazdi Solo necesita imágenes en esas carpetas. XML se puede colocar en la carpeta drawable(withoud -*dpi).
Jaroslav
176

Hay una propiedad en el xml dibujable para hacerlo. android: tileMode = "repetir"

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

Laszlo Lugosi
fuente
38
Realmente no sé cómo es esto tan bajo. ¿Instinto de manada? Esta es la implementación nativa del fondo en mosaico
Michał K,
55
Este funciona como un encanto. También este parece ser la forma correcta de hacerlo.
JCasso
3
Estoy de acuerdo en que esta debería ser la respuesta aceptada. ¡Es realmente simple y funciona perfectamente!
huong
66
1 Sólo una cosa debe ser corregido que se menciona erróneamente en el artículo: 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. Solo tiene que colocar los elementos dibujables referenciados en todos los depósitos de densidad. El dibujo de referencia XML se puede colocar en la drawablecarpeta, eso es suficiente.
caw
Esto es lo que llamas explicado por un profesional
Muneeb Mirza
69

Aquí hay una implementación puramente java de la imagen de fondo que se repite:

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

En este caso, nuestra imagen de fondo debería almacenarse en res / drawable / bg_image.png.

arador
fuente
66
android.graphics.Shader
Peter Willsey
Si tengo ScrollViewun fondo y lo repito y tengo una lista larga y larga, ¿no tendré problemas con la excepción OutOfMemory cuando se ScrollViewvuelva muy larga?
AndreiBogdan
¿Por qué esto ya no debería funcionar? La depreciación significa que estos comandos ya no deben usarse porque pueden retirarse en algún momento en el futuro. En API 19, esto todavía funciona como sugirió @plowman. Además, no BitmapDrawable está en desuso, sino solo algunos de sus métodos. He editado el código anterior para que no tengamos que usar métodos obsoletos.
Oliver Hausler
16

Ampliando la respuesta de plowman, aquí está la versión no obsoleta de cambiar la imagen de fondo con 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);
}
usuario3763868
fuente
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
fuente