2010-04-25 48 views
294

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 lặp lại và điền vào toàn bộ màn hình. Tôi nên làm gì?Cách tạo hình nền của ứng dụng lặp lại

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

Trả lời

401

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 chặn ListView s từ đi màu đen trong khi di chuyể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ị/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

Hãy thử với điều này quá: android: trọng lực = "clip_horizontal" --- nó tránh hình ảnh biến dạng –

+2

Tôi đã thử điều này, nhưng chỉ thấy ngói đơn kéo dài tới tất cả các màn hình :( –

+0

Nếu tôi có một 'ScrollView' và đặt nền để 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 đề gì với ngoại lệ OutOfMemory khi' ScrollView' trở nên rất dài? – AndreiBogdan

67

Đây là một thực hiện thuần java của hình nền lặp đi lặp lại:

@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 ảnh nền của chúng tôi sẽ phải được lưu trữ trong res/drawable/bg_image.png.

+4

Shader là gì? –

+6

android.graphics.Shader –

+0

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

159

Có một thuộc tính trong xml có thể vẽ để làm điều đó. android: TILEMODE = "lặp lại"

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

+32

Tôi thực sự không biết mức giá này quá thấp. Bản năng bầy đàn? Đây là việc thực hiện bản địa của nền lát gạch –

+4

Điều này hoạt động như một sự quyến rũ. Ngoài ra điều này có vẻ giống như cách đúng để làm điều đó. – JCasso

+3

Tôi đồng ý rằng đây phải 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! –

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);*/ 
14

Mở rộng về câu trả lời của cày, đây là phiên bản không bị phản đối thay đổi hình nền với 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); 
} 
Các vấn đề liên quan