平铺的背景推动它的视图大小

我有一个平铺的位图,我用作View背景。 这个View ,比方说,有android:layout_height="wrap_content" 。 问题是背景中使用的位图的高度参与视图的测量,增加了View高度。 当View的内容大小小于用作平铺背景的位图的高度时,可以注意到这一点。

让我给你看一个例子。 瓦片位图:

在这里输入图像说明

位图可绘制( 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> 

它看起来像:

在这里输入图像说明

TextView的高度最终成为位图的高度。 我期望的是位图被剪裁到View的大小。

有没有办法做到这一点?

笔记:

  • 我不能使用9patch drawables,因为背景需要以瓦片的方式重复,拉伸不是一个选项。
  • 我不能为View设置一个固定的高度,这取决于孩子(我在ViewGroup使用这个)
  • 这种奇怪的行为发生在我之前解释过,当View的大小小于位图的大小,否则位图被重复正确剪辑(即,如果视图大小是位图大小的1.5倍,则最终看到1.5倍的位图)。
  • 这个例子处理高度,但使用宽度是相同的。

Solutions Collecting From Web of "平铺的背景推动它的视图大小"

您需要一个从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; } } 

当然你不能(AFAIK)在XML中声明自定义drawable,所以你必须实例化和设置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中移除背景属性:

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

我testing了这个,它似乎工作。