Как заставить фоновое изображение приложения повторяться

314

Я установил фоновое изображение в своем приложении, но фоновое изображение маленькое, и я хочу, чтобы оно повторялось и заполняло весь экран. Что я должен делать?

<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
источник

Ответы:

429

Хорошо, вот что у меня в приложении. Он включает в себя хак, чтобы предотвратить ListViewсхождение черноты во время прокрутки.

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
Попробуйте тоже с этим: android: gravity = "clip_horizontal" --- это позволит избежать деформации изображения
Фелипе
2
Я пробовал это, но видел только одну плитку, растянутую на весь экран :(
Сергей Метлов
Если у меня есть ScrollViewи помещать фон для повторения, и у меня длинный список, не возникнут ли у меня проблемы с исключением OutOfMemory, когда оно ScrollViewстановится очень длинным?
Андрей Богдан
Следует иметь в виду, что у вас должны быть папки drawable-hdpi, drawable-mdpi & drawable-ldpi, вам нужно добавить этот файл backrepeat.xml и соответствующие изображения к каждому из них, чтобы эта функция была в высокой степени, размеры экрана со средним и низким разрешением (точек на дюйм).
сабля tabatabaee yazdi
2
@sabertabatabaeeyazdi Вам нужны только изображения в этих папках. XML можно поместить в drawable(без -*dpi) папку.
Ярослав
176

В отрисовываемом xml есть свойство для этого. андроид: TILEMODE = "повторить"

Смотрите этот сайт: http://androidforbeginners.blogspot.com/2010/06/how-to-tile-background-image-in-android.html

Ласло Лугоши
источник
38
Я действительно не знаю, как это так низко оценено. Стадный инстинкт? Это нативная реализация мозаичного фона
Michał K
5
Этот работает как шарм. Также этот кажется правильным способом сделать это.
JCasso
3
Я согласен, что это должен быть принятый ответ. Это действительно просто и работает отлично!
Хуонг
6
+1 Только одна вещь должна быть исправлена , что упоминается неправильно в статье: 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. Вам нужно только разместить ссылочные чертежи во всех сегментах плотности. Ссылочный XML drawable может быть помещен в drawableпапку, этого достаточно.
caw
Это то, что вы называете объясненным про
Muneeb Мирза
69

Вот чистая Java-реализация повторения фонового изображения:

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

В этом случае наше фоновое изображение должно быть сохранено в res / drawable / bg_image.png.

пахарь
источник
6
android.graphics.Shader
Питер Уилси
Если у меня есть ScrollViewи помещать фон для повторения, и у меня длинный список, не возникнут ли у меня проблемы с исключением OutOfMemory, когда оно ScrollViewстановится очень длинным?
Андрей Богдан
Почему это не должно работать больше? Амортизация означает, что эти команды больше не должны использоваться, потому что они могут быть удалены в будущем. В API 19 это все еще работает, как предложил @plowman. Кроме того, не BitmapDrawable устарела, а только некоторые из его методов. Я отредактировал приведенный выше код, поэтому нам не нужно использовать устаревшие методы.
Оливер Хауслер
16

Расширяя ответ пахаря, вот не осуждаемая версия изменения фонового изображения с помощью 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
источник
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);*/
Мухаммед Мубашир
источник