gpt4 book ai didi

android - 平铺背景正在插入它的 View 大小

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:01:37 26 4
gpt4 key购买 nike

我有一个平铺位图用作View 背景。这个 View ,比方说,有android:layout_height="wrap_content"。问题是背景中使用的位图的高度参与了 View 的测量,增加了 View 高度。当 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 可绘制对象,因为背景需要以平铺方式重复,拉伸(stretch)不是一种选择。
  • 我无法为 View 设置固定高度,这取决于子项(我在 ViewGroup 中使用它)
  • View 的大小小于位图的大小时,就会出现这种奇怪的行为,否则位图会重复并正确裁剪(即,如果 View 大小为 1.5 x 位图的大小,您最终看到的是位图的 1.5 倍)。
  • 该示例处理高度,但使用宽度也是一样。

最佳答案

您需要一个从 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 中删除了背景属性:

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

我已经测试过了,它似乎有效。

关于android - 平铺背景正在插入它的 View 大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8842484/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com