วิธีทำให้รูปภาพพื้นหลังของแอปซ้ำ


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

คำตอบ:


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" --- มันหลีกเลี่ยงการเสียรูป
Felipe

2
ฉันได้ลองแล้ว แต่เห็นกระเบื้องเพียงแผ่นเดียวยืดออกไปทุกหน้าจอ :(
Sergey Metlov

หากฉันมี a ScrollViewและวางพื้นหลังเพื่อทำซ้ำและมีรายการยาว ๆ ฉันจะไม่มีปัญหากับข้อยกเว้น OutOfMemory ScrollViewหรือไม่เมื่อการเปลี่ยนแปลงนั้นยาวมาก?
AndreiBogdan

สิ่งหนึ่งที่ต้องจำไว้คือคุณควรมีโฟลเดอร์ drawable-hdpi, drawable-mdpi & drawable-ldpi คุณจะต้องเพิ่มไฟล์ backrepeat.xml นี้และรูปภาพที่เกี่ยวข้องลงในแต่ละไฟล์เหล่านี้เพื่อให้ฟังก์ชันนี้มีประสิทธิภาพสูง ขนาดหน้าจอขนาดกลางและต่ำ dpi (จุดต่อนิ้ว)
saber tabatabaee yazdi

2
@sabertabatabaeeyazdi คุณต้องการเฉพาะภาพในโฟลเดอร์เหล่านั้นเท่านั้น XML สามารถวางในโฟลเดอร์drawable(withoud -*dpi)
Jaroslav

176

มีคุณสมบัติใน xml ที่สามารถทำได้คือ หุ่นยนต์: tileMode = "ทำซ้ำ"

ดูเว็บไซต์นี้: http://androidforbeginners.blogspot.com/2010/06/how-to-tile-background-image-in-android.html


38
ฉันไม่รู้จริง ๆ ว่าคะแนนนี้ต่ำแค่ไหน สัญชาตญาณฝูง? นี่คือการดำเนินการตามพื้นหลังของกระเบื้อง
Michał K

5
อันนี้ใช้งานได้อย่างมีเสน่ห์ หนึ่งนี้ดูเหมือนว่าวิธีที่ถูกต้องที่จะทำ
JCasso

3
ฉันยอมรับว่านี่ควรเป็นคำตอบที่ยอมรับได้ มันง่ายมากและใช้งานได้อย่างสมบูรณ์แบบ!
huong

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เพียงสิ่งเดียวที่จะต้องได้รับการแก้ไขที่ถูกกล่าวถึงอย่างผิดพลาดในบทความ: คุณต้องวาง drawable ที่อ้างอิงในถังความหนาแน่นทั้งหมด XML drawable อ้างอิงสามารถวางในdrawableโฟลเดอร์นั่นก็เพียงพอแล้ว
caw

นี่คือสิ่งที่คุณเรียกโดยผู้เชี่ยวชาญ
Muneeb Mirza

69

นี่คือการใช้งานจาวาบริสุทธิ์ของการทำซ้ำภาพพื้นหลัง:

@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
Peter Willsey

หากฉันมี a ScrollViewและวางพื้นหลังเพื่อทำซ้ำและมีรายการยาว ๆ ฉันจะไม่มีปัญหากับข้อยกเว้น OutOfMemory ScrollViewหรือไม่เมื่อการเปลี่ยนแปลงนั้นยาวมาก?
AndreiBogdan

เหตุใดจึงไม่ควรทำงานอีกต่อไป ค่าเสื่อมราคาหมายถึงคำสั่งเหล่านี้ไม่ควรใช้อีกต่อไปเพราะอาจถูกยกเลิกในอนาคต ใน API 19 ยังคงใช้งานได้ตามที่ @plowman แนะนำ นอกจากนี้ไม่ใช่ BitmapDrawable ที่เลิกใช้ แต่มีเพียงบางวิธีเท่านั้น ฉันได้แก้ไขโค้ดด้านบนเพื่อให้เราไม่ต้องใช้วิธีการที่เลิกใช้แล้ว
Oliver Hausler

16

ขยายคำตอบของนักไถนี่เป็นเวอร์ชันที่ไม่สนับสนุนการเปลี่ยนภาพพื้นหลังด้วยจาวา

@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);*/
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.