Comment faire répéter l'image d'arrière-plan d'une application

314

J'ai défini une image d'arrière-plan dans mon application, mais l'image d'arrière-plan est petite et je souhaite qu'elle soit répétée et remplisse tout l'écran. Que devrais-je faire?

<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
la source

Réponses:

429

Ok, voici ce que j'ai dans mon application. Il comprend un hack pour empêcher les ListViews de devenir noirs pendant le défilement.

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
la source
1
Essayez aussi ceci: android: gravity = "clip_horizontal" --- il évite la déformation de l'image
Felipe
2
J'ai essayé, mais je n'ai vu qu'une seule tuile étirée sur tout l'écran :(
Sergey Metlov
Si j'ai un ScrollViewet place un arrière-plan pour le répéter et que j'ai une longue longue liste, ne vais-je pas avoir de problèmes avec l'exception OutOfMemory lorsque le ScrollViewdevient très long?
AndreiBogdan
Une chose à garder à l'esprit est que vous devriez avoir des dossiers drawable-hdpi, drawable-mdpi & drawable-ldpi, vous devrez ajouter ce fichier backrepeat.xml et les images pertinentes à chacun d'eux pour permettre cette fonctionnalité en haut, tailles d'écran moyennes et faibles dpi (points par pouce).
sabre tabatabaee yazdi
2
@sabertabatabaeeyazdi Vous n'avez besoin que d'images dans ces dossiers. XML peut être placé dans le dossier drawable(withoud -*dpi).
Jaroslav
176

Il y a une propriété dans le XML dessinable pour le faire. android: tileMode = "répéter"

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

Laszlo Lugosi
la source
38
Je ne sais vraiment pas comment cela est si bas. Instint de meute? Ceci est l'implémentation native de l'arrière
Michał K
5
Celui-ci fonctionne comme un charme. Aussi celui-ci semble être la bonne façon de le faire.
JCasso
3
Je suis d'accord que cela devrait être la réponse acceptée. C'est vraiment simple et fonctionne parfaitement!
huong
6
1 Une seule chose doit être corrigé qui est mentionné à tort dans l'article: 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. Vous n'avez qu'à placer les drawables référencés dans tous les godets de densité. Le dessin XML de référence peut être placé dans un drawabledossier, cela suffit.
caw
C'est ce que vous appelez expliqué par un pro
Muneeb Mirza
69

Voici une implémentation pure java de la répétition de l'image d'arrière-plan:

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

Dans ce cas, notre image d'arrière-plan devrait être stockée dans res / drawable / bg_image.png.

laboureur
la source
6
android.graphics.Shader
Peter Willsey
Si j'ai un ScrollViewet place un arrière-plan pour le répéter et que j'ai une longue longue liste, ne vais-je pas avoir de problèmes avec l'exception OutOfMemory lorsque le ScrollViewdevient très long?
AndreiBogdan
Pourquoi cela ne devrait-il plus fonctionner? L'amortissement signifie que ces commandes ne devraient plus être utilisées car elles pourraient être retirées à un moment donné dans le futur. Dans l'API 19, cela fonctionne toujours comme l'a suggéré @plowman. En outre, BitmapDrawable n'est pas obsolète, mais seulement certaines de ses méthodes. J'ai édité le code ci-dessus afin que nous n'ayons pas à utiliser des méthodes obsolètes.
Oliver Hausler
16

Développant la réponse de Ploughman, voici la version non obsolète de la modification de l'image d'arrière-plan avec 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
la source
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
la source