gpt4 book ai didi

android - 绘制包含 InsetDrawable 的层时意外的 LayerDrawable 行为

转载 作者:塔克拉玛干 更新时间:2023-11-02 22:03:28 25 4
gpt4 key购买 nike

我正在尝试在 xml 中构建一个 LayerDrawable,其中上层有时会完全遮盖下层。为了使下层更小,我使用 InsetDrawable 包裹另一个可绘制对象,使其小于 View 的完整尺寸。然而,我出乎意料地发现,放置在包含插图的图层顶部的任何图层也应用了插图。我找不到支持此行为的文档,并且很困惑为什么会这样。

在下面的示例中,我制作了一个包含 3 层的 LayerDrawable。底层和顶层包含椭圆形的可绘制对象,旨在占据整个 View 。中间层是 InsetDrawable 内部的矩形可绘制对象。代码如下:

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android" >

<item>
<shape android:shape="oval" >
<solid android:color="#00ff00" />
</shape>
</item>
<item>
<inset
android:insetBottom="4dp"
android:insetLeft="4dp"
android:insetRight="4dp"
android:insetTop="4dp" >
<shape android:shape="rectangle" >
<solid android:color="#ff0000" />
</shape>
</inset>
</item>
<item>
<shape android:shape="oval" >
<solid android:color="#0000ff" />
</shape>
</item>

</layer-list>

在我的 View 中调用 setBackgroundDrawable(getResources().getDrawable(drawableId)); 会产生一个绿色椭圆,按预期填充整个 View ,并按预期插入 4dp 的红色矩形,但蓝色顶层的椭圆也是内嵌 4dp 并完全绘制在红色矩形的边界内。

我希望蓝色椭圆完全遮住绿色椭圆和大部分红色矩形,但它嵌入了红色矩形内。有什么方法可以让蓝色圆圈填满 View 并保持在顶部?

最佳答案

我也没有看到它在哪里记录,但是 LayerDrawable 中的填充是累积的。也就是说,一层的填充会影响所有更高层的边界。这是来自 the source for LayerDrawable :

@Override
protected void onBoundsChange(Rect bounds) {
final ChildDrawable[] array = mLayerState.mChildren;
final int N = mLayerState.mNum;
int padL=0, padT=0, padR=0, padB=0;
for (int i=0; i<N; i++) {
final ChildDrawable r = array[i];
r.mDrawable.setBounds(bounds.left + r.mInsetL + padL,
bounds.top + r.mInsetT + padT,
bounds.right - r.mInsetR - padR,
bounds.bottom - r.mInsetB - padB);
padL += mPaddingL[i];
padR += mPaddingR[i];
padT += mPaddingT[i];
padB += mPaddingB[i];
}
}

(LayerDrawable.getPadding(Rect) 遵循相同的逻辑。)由于 InsetDrawable 使用其插图作为填充(如 documented ),这解释了您的行为看见了。

我认为这是一个糟糕的设计决定,但恐怕你有点坚持下去了。我不认为它可以被覆盖。

关于android - 绘制包含 InsetDrawable 的层时意外的 LayerDrawable 行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9029270/

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