我有一个扩展按钮视图的类,我用它来创建自定义形状的按钮,如十六进制按钮,只响应实际按钮区域的点击而不是视图的默认矩形形状。但是,我希望能够更改按钮的颜色而不为每种颜色创建不同的drawable,因此我创建了带有灰度阴影的白色按钮图像,并使用setColorFilter设置我读取的颜色从xml开始,除了当活动开始或重新启动时,所有按钮都获得最后一个按钮的颜色(最后创建或单击),它的效果很好。 手动单击按钮可以设置正确的颜色,但是当更改活动并返回时,所有按钮都会获得最后按下按钮的颜色。
这是我初始化颜色的地方:
@Override
protected void onFinishInflate() {
super.onFinishInflate();
// Set the button background and color
updateButton(normalButton);
}
private void updateButton(Drawable background) {
if (background == null) return;
//Set button background
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
this.setBackground(background);
} else {
//noinspection deprecation
this.setBackgroundDrawable(background);
}
this.getBackground().setColorFilter(buttonColor, PorterDuff.Mode.MULTIPLY);
//this.setBackgroundColor(buttonColor);
}
函数updateButton()
也用于onTouch()
方法,用于在按下状态和正常状态之间切换可绘制对象。当按下任何按钮时,它可以正常工作并设置正确的颜色。
如果我使用this.setBackgroundColor(buttonColor);
着色作品找到(但它会覆盖图像),但setColorFilter
无法正常工作。
以下是整个代码(link on github)
的链接这张照片解释了问题,左边的那个是它开始时的样子,而右边的那个是应该的样子。
答案 0 :(得分:0)
我找到了答案。我需要在应用滤色器之前改变drawable。
myDrawable = myDrawable.mutate();
myDrawable.setColorFilter(buttonColor, PorterDuff.Mode.MULTIPLY);