2010-04-25 15 views
294

He establecido 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. ¿Que debería hacer?Cómo hacer que la imagen de fondo de una aplicación se repita

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

Respuesta

401

Ok, esto es lo que tengo en mi aplicación. Incluye un truco para evitar que ListView s se ponga negro mientras se desplaza.

dibujable/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"> 
// 
+1

Pruebe con esto también: android: gravedad = "clip_horizontal" --- es evitar deformación de la imagen –

+2

He intentado esto pero sólo vio sola baldosa se extendía a toda la pantalla :( –

+0

Si tengo una 'ScrollView' y coloca un fondo para repetirlo y tengo una larga lista larga, ¿no tendré problemas con la excepción OutOfMemory cuando el' ScrollView' sea muy largo? – AndreiBogdan

67

Aquí es una aplicación Java pura de la imagen de fondo repitiendo:

@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 tendría que ser almacenados en res/estirable/bg_image.png.

+4

¿Qué es Shader? –

+6

android.graphics.Shader –

+0

Si tengo un 'ScrollView' y coloco un fondo para repetirlo y tengo una larga lista larga, ¿no tendré problemas con la excepción OutOfMemory cuando el' ScrollView' sea muy largo? – AndreiBogdan

159

Hay una propiedad en el xml dibujable para hacerlo. androide: TILEMODE = "repetir"

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

+32

Realmente no sé cómo es esta calificación tan baja. ¿Instinto de manada? Esta es la implementación nativa del fondo de mosaico –

+4

Este funciona como un amuleto. También este parece ser el camino correcto para hacerlo. – JCasso

+3

Acepto que esta debería ser la respuesta aceptada. ¡Es realmente simple y funciona perfectamente! –

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);*/ 
14

Ampliando la respuesta de labrador, aquí está la versión no obsoleto 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); 
} 
Cuestiones relacionadas