如何重复应用的背景图片


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

Answers:


429

好的,这就是我在应用程序中所拥有的。它包括一个防止ListViews在滚动时变黑的技巧。

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_horizo​​ntal” ---避免图像变形
Felipe

2
我已经尝试过了,但是只看到一块瓷砖延伸到了整个屏幕:(
谢尔盖·梅特洛夫

如果我有一个ScrollView背景并在上面重复,而我的清单很长,那么当清单ScrollView变得很长时,我会不会遇到OutOfMemory异常的问题?
2012年

要记住的一件事是,您应该拥有drawable-hdpi,drawable-mdpi和drawable-ldpi文件夹,您需要将此backrepeat.xml文件和相关图像添加到其中的每个文件夹中,以使此功能具有较高的功能,中低dpi(每英寸点数)屏幕尺寸。
军刀tabatabaee yazdi 2013年

2
@sabertabatabaeeyazdi您只需要这些文件夹中的图像。XML可以放在drawable(withoud -*dpi)文件夹中。
Jaroslav

176

在drawable xml中有一个属性可以执行此操作。android:tileMode =“ repeat”

请访问此网站:http : //androidforbeginners.blogspot.com/2010/06/how-to-tile-background-image-in-android.html


38
我真的不知道这个评价如何低。牛群本能?这是本机实现平铺背景的
米哈尔ķ

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文件夹中,这就足够了。
caw

这就是你所说的专业人士的解释
Muneeb Mirza

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背景并在上面重复,而我的清单很长,那么当清单ScrollView变得很长时,我会不会遇到OutOfMemory异常的问题?
2012年

为什么这应该不再起作用了?折旧意味着这些命令不应再使用,因为它们将来可能会淘汰。在API 19中,这仍然按照@plowman建议的方式工作。另外,不建议不要使用BitmapDrawable,而不要使用其中的某些方法。我已经编辑了上面的代码,因此我们不必使用不推荐使用的方法。
奥利弗·豪斯勒

16

扩展plowman的答案,这是使用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);*/
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.