Come ripetere l'immagine di sfondo di un'app


314

Ho impostato un'immagine di sfondo nella mia app, ma l'immagine di sfondo è piccola e voglio che venga ripetuta e riempia l'intero schermo. Cosa dovrei fare?

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

Risposte:


429

Ok, ecco cosa ho nella mia app. Include un hack per impedire che le ListViews diventino nere durante lo scorrimento.

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

valori / 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
Prova anche con questo: android: gravity = "clip_horizontal" --- evita la deformazione dell'immagine
Felipe,

2
Ci ho provato ma ho visto solo una singola tessera estesa su tutto lo schermo :(
Sergey Metlov

Se ho un ScrollViewe posiziono uno sfondo da ripetere su di esso e ho un lungo elenco, non avrò problemi con l'eccezione OutOfMemory quando ScrollViewdiventa molto lungo?
AndreiBogdan,

Una cosa da tenere a mente è che dovresti avere le cartelle drawable-hdpi, drawable-mdpi e drawable-ldpi, dovrai aggiungere questo file backrepeat.xml e le immagini pertinenti a ciascuna di queste per consentire questa funzionalità in alto, dimensioni dello schermo medio e basso dpi (punti per pollice).
sabre tabatabaee yazdi,

2
@sabertabatabaeeyazdi Hai solo bisogno di immagini in quelle cartelle. XML può essere inserito nella cartella drawable(withoud -*dpi).
Jaroslav

176

C'è una proprietà nel file XML disegnabile per farlo. Android: TILEMODE = "repeat"

Vedi questo sito: http://androidforbeginners.blogspot.com/2010/06/how-to-tile-background-image-in-android.html


38
Davvero non so come sia così basso. L'istinto del gregge? Questa è l'implementazione nativa di sfondo piastrellato
Michał K

5
Questo funziona come un fascino. Anche questo sembra il modo giusto per farlo.
JCasso,

3
Sono d'accordo che questa dovrebbe essere la risposta accettata. È davvero semplice e funziona perfettamente!
huong

6
+1 Solo una cosa deve essere corretto menzionato erroneamente nell'articolo: 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. Devi solo posizionare i drawable di riferimento in tutti i bucket di densità. Il drawable XML di riferimento può essere inserito in una drawablecartella, questo è sufficiente.
Caw

Questo è ciò che chiami spiegato da un pro
Muneeb Mirza il

69

Ecco un'implementazione pure-java della ripetizione dell'immagine di sfondo:

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

In questo caso, la nostra immagine di sfondo dovrebbe essere memorizzata in res / drawable / bg_image.png.


6
android.graphics.Shader
Peter Willsey,

Se ho un ScrollViewe posiziono uno sfondo da ripetere su di esso e ho un lungo elenco, non avrò problemi con l'eccezione OutOfMemory quando ScrollViewdiventa molto lungo?
AndreiBogdan,

Perché questo non dovrebbe più funzionare? L'ammortamento significa che questi comandi non dovrebbero più essere utilizzati perché potrebbero essere ritirati in futuro. In API 19, funziona ancora come suggerito da @plowman. Inoltre, BitmapDrawable è obsoleto, ma solo alcuni dei suoi metodi. Ho modificato il codice sopra quindi non dobbiamo usare metodi deprecati.
Oliver Hausler,

16

Espandendo la risposta di Ploughman, ecco la versione non deprecata di cambiare l'immagine di sfondo 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);
}

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);*/
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.