2012-01-12 74 views
10

我有一個平鋪的位圖,我用作View背景。這個View,比方說,有android:layout_height="wrap_content"。問題是背景中使用的位圖高度參與視圖的測量,增加了高度。當View的內容的大小小於用作瓦片背景的位圖的高度時,可以注意到這一點。平鋪背景推着它的視圖尺寸

讓我給你看一個例子。瓷磚位圖:

enter image description here

位圖繪製(tile_bg.xml):

<?xml version="1.0" encoding="utf-8"?> 
<bitmap xmlns:android="http://schemas.android.com/apk/res/android" 
    android:src="@drawable/tile" 
    android:tileMode="repeat"/> 

佈局:

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:orientation="vertical" 
    android:background="#FFFFFF"> 

    <TextView 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:background="@drawable/tile_bg" 
     android:text="@string/hello" 
     android:textColor="#000000" /> 

</LinearLayout> 

它的樣子:

enter image description here

TextView的高度最終成爲位圖的高度。我期望的是位圖被剪裁到View的大小。

有什麼辦法可以達到這個目的嗎?

注:

  • ,因爲背景需要在瓷磚時尚的方式來重複,拉伸,我不能使用9patch繪項目是不是一種選擇。
  • 我不能設置一個固定的高度爲View,這取決於孩子的
  • 這種奇怪的行爲發生,因爲我當View的大小小於之前解釋(我在ViewGroup使用本)位圖的大小,否則位圖會被正確重複剪切(即,如果視圖大小是位圖大小的1.5倍,則最終會看到位圖的1.5倍)。
  • 該示例處理高度,但使用寬度相同。

回答

14

您需要一個從getMinimumHeight()和getMinimumWidth()返回0的自定義BitmapDrawable。這裏有一個我命名BitmapDrawableNoMinimumSize該做的工作:

import android.content.res.Resources; 
import android.graphics.drawable.BitmapDrawable; 

public class BitmapDrawableNoMinimumSize extends BitmapDrawable { 

    public BitmapDrawableNoMinimumSize(Resources res, int resId) { 
     super(res, ((BitmapDrawable)res.getDrawable(resId)).getBitmap()); 
    } 

    @Override 
    public int getMinimumHeight() { 
     return 0; 
    } 
    @Override 
    public int getMinimumWidth() { 
     return 0; 
    } 
} 

當然,你不能(據我所知)在XML聲明自定義可繪,所以你必須實例化正是如此設置的TextView的背景:

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 

    BitmapDrawable bmpd =new BitmapDrawableNoMinimumSize(getResources(), R.drawable.tile); 
    bmpd.setTileModeX(TileMode.REPEAT); 
    bmpd.setTileModeY(TileMode.REPEAT); 
    findViewById(R.id.textView).setBackgroundDrawable(bmpd); 
} 

當然,您從佈局XML background屬性:

<TextView 
    android:id="@+id/textView" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:text="Testing testing testing" 
    android:textColor="#000000" /> 

我測試過這一點,它似乎工作。

+0

優秀的答案,謝謝! – aromero 2012-01-20 20:13:37