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

时间:2012-01-12 21:22:24

标签: android android-layout

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

让我举个例子。 tile位图:

enter image description here

位图drawable(<?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

它看起来如何:

enter image description here

View的高度最终是位图的高度。我期待的是位图被裁剪为View的大小。

有没有办法实现这个目标?

注意:

  • 我无法使用9patch drawables,因为背景需要以平铺的方式重复,拉伸不是一种选择。
  • 我无法为ViewGroup设置固定的高度,这取决于孩子们(我在View中使用此内容)
  • 这种奇怪的行为发生在我之前解释的{{1}}的大小小于位图的大小时,否则位图会被正确剪裁重复(即,如果视图大小是1.5倍大小)在位图中,你最终看到的是位图的1.5倍。)
  • 该示例处理高度,但使用宽度相同。

1 个答案:

答案 0 :(得分:14)

您需要一个自定义BitmapDrawable,它从getMinimumHeight()和getMinimumWidth()返回0。这是一个我命名为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" />

我已经对此进行了测试,似乎有效。