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

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

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


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.


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

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);*/
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.