Làm thế nào để lặp lại hình nền của ứng dụng


314

Tôi đã đặt hình nền trong ứng dụng của mình, nhưng hình nền nhỏ và tôi muốn nó được lặp lại và điền vào toàn bộ màn hình. Tôi nên làm gì?

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

Câu trả lời:


429

Ok, đây là những gì tôi đã có trong ứng dụng của mình. Nó bao gồm một hack để ngăn ListViews khỏi bị đen khi cuộn.

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

giá trị / style.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
Cũng thử với điều này: android: vity = "clip_horizontal" --- nó tránh biến dạng hình ảnh
Felipe

2
Tôi đã thử điều này nhưng chỉ thấy một ô duy nhất kéo dài đến tất cả màn hình :(
Sergey Metlov

Nếu tôi có một ScrollViewvà đặt một nền tảng để lặp lại trên đó và tôi có một danh sách dài, tôi sẽ không gặp vấn đề với ngoại lệ OutOfMemory khi nó ScrollViewtrở nên rất dài?
AndreiBogdan

Một lưu ý là bạn nên có các thư mục drawable-hdpi, drawable-mdpi & drawable-ldpi, bạn sẽ cần thêm tệp backrepeat.xml này và các hình ảnh có liên quan vào từng tệp này để cho phép chức năng này ở mức cao, kích thước màn hình trung bình và thấp dpi (chấm trên mỗi inch).
saber tabatabaee yazdi

2
@sabertabatabaeeyazdi Bạn chỉ cần hình ảnh trong các thư mục đó. XML có thể được đặt trong thư mục drawable(withoud -*dpi).
Jaroslav

176

Có một tài sản trong xml drawable để làm điều đó. android: brickMode = "lặp lại"

Xem trang web này: http://androidforbeginners.blogspot.com/2010/06/how-to-tile-background-image-in-android.html


38
Tôi thực sự không biết làm thế nào là đánh giá thấp như vậy. Bản năng bầy đàn? Đây là cách thực hiện riêng của nền lát gạch
Michał K

5
Điều này làm việc như một nét duyên dáng. Ngoài ra điều này có vẻ như đúng cách để làm điều đó.
JCasso

3
Tôi đồng ý rằng đây sẽ là câu trả lời được chấp nhận. Nó thực sự đơn giản và hoạt động hoàn hảo!
huong

6
+1 Chỉ có một điều phải được sửa chữa được đề cập sai trong bài viết : 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. Bạn chỉ phải đặt các ngăn kéo được tham chiếu trong tất cả các thùng mật độ. Có thể đặt XML tham chiếu có thể được đặt trong drawablethư mục, thế là đủ.
caw

Đây là những gì bạn gọi được giải thích bởi một pro
Muneeb Mirza

69

Đây là một triển khai java thuần túy của việc lặp lại hình ảnh nền:

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

Trong trường hợp này, hình nền của chúng tôi sẽ phải được lưu trữ trong res / drawable / bg_image.png.


6
android.graphics.Shader
Peter Willsey

Nếu tôi có một ScrollViewvà đặt một nền tảng để lặp lại trên đó và tôi có một danh sách dài, tôi sẽ không gặp vấn đề với ngoại lệ OutOfMemory khi nó ScrollViewtrở nên rất dài?
AndreiBogdan

Tại sao điều này không nên làm việc nữa? Khấu hao có nghĩa là các lệnh này không nên được sử dụng nữa bởi vì chúng có thể bị loại bỏ một thời gian trong tương lai. Trong API 19, điều này vẫn hoạt động như @plowman đề xuất. Ngoài ra, không phải BitmapDrawable bị phản đối mà chỉ có một số phương thức của nó. Tôi đã chỉnh sửa mã ở trên để chúng tôi không phải sử dụng các phương pháp không dùng nữa.
Oliver Hausler

16

Mở rộng về câu trả lời của người cày, đây là phiên bản không bị thay đổi trong việc thay đổi hình nền bằng 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);*/
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.