Java setColorFilter适用于所有按钮

Java setColorFilter适用于所有按钮,java,android,button,custom-controls,android-custom-view,Java,Android,Button,Custom Controls,Android Custom View,我有一个扩展按钮视图的类,我使用它来创建自定义形状的按钮,比如hex按钮,并且只响应实际按钮区域上的点击,而不是视图的默认矩形形状。但是,这部分是有效的,我还希望能够更改按钮的颜色,而无需为每种颜色创建不同的可绘制内容,因此我创建了带有灰度着色的白色按钮图像,并使用setColorFilter设置从xml读取的颜色,效果非常好,但当活动启动或重新启动时,所有按钮都会获得按钮的颜色上次按钮(上次创建或单击)。 单击按钮可手动设置正确的颜色,但当更改活动并返回时,所有按钮都会获得上次按下按钮的颜色

我有一个扩展按钮视图的类,我使用它来创建自定义形状的按钮,比如hex按钮,并且只响应实际按钮区域上的点击,而不是视图的默认矩形形状。但是,这部分是有效的,我还希望能够更改按钮的颜色,而无需为每种颜色创建不同的可绘制内容,因此我创建了带有灰度着色的白色按钮图像,并使用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()
方法中,以在按下和正常状态之间切换绘图。当按下任何一个按钮时,它都可以工作并设置正确的颜色

如果我使用
这个.setBackgroundColor(按钮颜色)着色可以找到(但它会覆盖图像),但是,
setColorFilter
没有按照我的要求工作

有人能帮我吗? 下面是指向整个代码()的链接


这张图片解释了这个问题,左边的是它启动时的样子,而右边的是它应该是什么样子。

我找到了答案。在应用滤色器之前,我需要对绘图进行变异

myDrawable = myDrawable.mutate();
myDrawable.setColorFilter(buttonColor, PorterDuff.Mode.MULTIPLY);