setColorFilter适用于所有按钮

时间:2016-02-17 01:04:40

标签: java android button custom-controls android-custom-view

我有一个扩展按钮视图的类,我用它来创建自定义形状的按钮,如十六进制按钮,只响应实际按钮区域的点击而不是视图的默认矩形形状。但是,我希望能够更改按钮的颜色而不为每种颜色创建不同的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

的链接

enter image description here

这张照片解释了问题,左边的那个是它开始时的样子,而右边的那个是应该的样子。

1 个答案:

答案 0 :(得分:0)

我找到了答案。我需要在应用滤色器之前改变drawable。

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