Vik*_*ram 11 android button material-design rippledrawable
我一直试图追踪这个问题一段时间了.我想我前段时间确实找到了解释.不幸的是,它丢失了代码注释.
我正在尝试Material Borderless-Button用Java 创建一个.首先,这是按钮在框架中的样子:
按钮bg(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>
Run Code Online (Sandbox Code Playgroud)
在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>
Run Code Online (Sandbox Code Playgroud)
Java等价于inset-drawable(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);
}
Run Code Online (Sandbox Code Playgroud)
该color参数从主题的获得attr/colorButtonNormal-与使用相同的颜色android:tint的XML定义.
以RippleDrawable编程方式创建:
@TargetApi(Build.VERSION_CODES.LOLLIPOP)
Drawable createButtonRippleBg(Context context,
int colorButtonNormal,
int colorControlHighlight) {
return new RippleDrawable(ColorStateList.valueOf(colorControlHighlight),
null, createButtonShape(context, colorButtonNormal));
}
Run Code Online (Sandbox Code Playgroud)
我知道即使蒙版颜色/形状没有在视觉上呈现,它的alpha 确实会影响RippleDrawable.这不是问题 - 用于面具的所有颜色都有完整的alpha.
我还确认从属性中读取的颜色colorControlHighlight & colorButtonNormal- 对于正在播放的主题是正确的.
然而,结果是:
Xml演绎:

在Java中:

有趣的是,这发生在API 21上.在API 22上,两种方法都产生相同的结果.
问题:
我确信这是API 21上的一个错误.如果有人可以追踪它,我们可能会找到alpha/color值的乘数来抵消这种视觉差异.
除了一般的善意,我还承诺给予赏金,因为我已经花了相当多的时间在这上面.
尝试这个替代构造函数new RippleDrawable(ColorStateList.valueOf(colorRipple), backgroundDrawable, null);
| 归档时间: |
|
| 查看次数: |
2688 次 |
| 最近记录: |