gpt4 book ai didi

android - 以编程方式创建的 RippleDrawable 看起来与其 xml 对应物不同

转载 作者:塔克拉玛干 更新时间:2023-11-02 07:50:15 24 4
gpt4 key购买 nike

一段时间以来,我一直在尝试追踪这个问题。我想我前段时间确实找到了解释。不幸的是,它在某处的代码注释中丢失了。

我正在尝试用 Java 创建一个 Material Borderless-Button。首先,这是按钮在框架中的样子:

按钮背景(button_borderless_material.xml):

<?xml version="1.0" encoding="utf-8"?>
<ripple xmlns:android="http://schemas.android.com/apk/res/android"
android:color="?attr/colorControlHighlight">
<item android:id="@id/mask"
android:drawable="@drawable/btn_default_mtrl_shape" />
</ripple>

用作 mask 的 drawable (btn_default_mtrl_shape.xml):

<?xml version="1.0" encoding="utf-8"?>
<!-- Used as the canonical button shape. -->
<inset xmlns:android="http://schemas.android.com/apk/res/android"
android:insetLeft="@dimen/button_inset_horizontal_material"
android:insetTop="@dimen/button_inset_vertical_material"
android:insetRight="@dimen/button_inset_horizontal_material"
android:insetBottom="@dimen/button_inset_vertical_material">
<shape android:shape="rectangle"
android:tint="?attr/colorButtonNormal">
<corners android:radius="@dimen/control_corner_material" />
<solid android:color="@color/white" />
<padding android:left="@dimen/button_padding_horizontal_material"
android:top="@dimen/button_padding_vertical_material"
android:right="@dimen/button_padding_horizontal_material"
android:bottom="@dimen/button_padding_vertical_material" />
</shape>
</inset>

inset-drawable 的 Java 等价物(btn_default_mtrl_shape.xml):

Drawable createButtonShape(Context context, int color) {
Resource res = context.getResources();
int radius = res
.getDimensionPixelSize(R.dimen.control_corner_material);
int paddingH = res
.getDimensionPixelSize(R.dimen.button_padding_horizontal_material);
int paddingV = res
.getDimensionPixelSize(R.dimen.button_padding_vertical_material);
int insetH = context.getResources()
.getDimensionPixelSize(R.dimen.button_inset_horizontal_material);
int insetV = res
.getDimensionPixelSize(R.dimen.button_inset_vertical_material);

float[] outerRadii = new float[8];
Arrays.fill(outerRadii, radius);

RoundRectShape r = new RoundRectShape(outerRadii, null, null);

ShapeDrawable shapeDrawable = new ShapeDrawable(r);
shapeDrawable.getPaint().setColor(color);
shapeDrawable.setPadding(paddingH, paddingV, paddingH, paddingV);

return new InsetDrawable(shapeDrawable,
insetH, insetV, insetH, insetV);
}

color 参数是从主题的 attr/colorButtonNormal 获得的——与 xml 定义中的 android:tint 使用的颜色相同。

以编程方式创建的 RippleDrawable:

@TargetApi(Build.VERSION_CODES.LOLLIPOP)
Drawable createButtonRippleBg(Context context,
int colorButtonNormal,
int colorControlHighlight) {
return new RippleDrawable(ColorStateList.valueOf(colorControlHighlight),
null, createButtonShape(context, colorButtonNormal));
}

我知道即使 mask-color/shape 没有在视觉上呈现,它的 alpha 确实会影响 RippleDrawable。这在这里不是问题 - 用于 mask 的所有颜色都具有完整的 alpha。

我还确认从属性中读取的颜色 - colorControlHighlight 和 colorButtonNormal - 对于正在播放的主题是正确的。

然而,结果是:

Xml 格式:

enter image description here

在 Java 中:

enter image description here

有趣的是,这发生在 API 21 上。在 API 22 上,两种方法产生相同的结果。

问题:

我确定这是 API 21 上的错误。如果有人能找到它,我们或许可以找到 alpha/颜色值的乘数来抵消这种视觉差异。

除了一般的善意外,我还 promise 赏金,因为我已经在这上面花了很多时间。

最佳答案

试试这个替代构造函数 new RippleDrawable(ColorStateList.valueOf(colorRipple), backgroundDrawable, null);

关于android - 以编程方式创建的 RippleDrawable 看起来与其 xml 对应物不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30143043/

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