有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java setColorFilter适用于所有按钮

我有一个扩展按钮视图的类,我使用它来创建自定义形状的按钮,比如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()方法中,以在按下和正常状态之间切换可绘制文件。当按下任何一个按钮时,它都可以工作并设置正确的颜色

但是,如果我使用this.setBackgroundColor(buttonColor);着色可以找到(但它会覆盖图像),那么setColorFilter就不能像我所希望的那样工作

有人能帮我吗

下面是指向整个代码(link on github)的链接

enter image description here

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


共 (1) 个答案

  1. # 1 楼答案

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

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