暂时改变可绘制的颜色

Vek*_*r88 6 java android

在我正在开发的一个应用程序中,我正在尝试以编程方式创建一个ImageButton所选的副本ImageButton,但图像以不同的方式着色,让我们说是红色.

如果我使用PowerDuff.Mode.MULTIPLY:

clonebutton.getDrawable().setColorFilter(0xFFFF0000,Mode.MULTIPLY);
Run Code Online (Sandbox Code Playgroud)

然后,即使是原版也ImageButton将其颜色变为红色,因为它们共享相同的颜色drawable.有没有办法只在克隆按钮上应用过滤器而不使用两个不同的drawables?例如,有可能在某种程度上将一个着色层放在克隆按钮的顶部而不编辑drawable

更新 我将drawable设置为可变:

Drawable d = swipebutton.getDrawable();
d.mutate();
d.setColorFilter(0xFFFF0000,Mode.MULTIPLY);
swipebutton.setImageDrawable(d);
Run Code Online (Sandbox Code Playgroud)

这可以防止我的clonebutton将其状态共享drawable给其他人views.

Tri*_*ode 14

Drawable buttonBackground = clonebutton.getDrawable();
buttonBackground = buttonBackground.mutate();
buttonBackground.setColorFilter(0xFFFF0000,Mode.MULTIPLY);
Run Code Online (Sandbox Code Playgroud)

使这个drawable可变.此操作无法逆转.一个可变的drawable保证不与任何其他drawable共享其状态.当您需要修改从资源加载的drawable的属性时,这尤其有用.默认情况下,从同一资源加载的所有drawables实例共享一个公共状态; 如果修改一个实例的状态,则所有其他实例将收到相同的修改.在可变的Drawable上调用此方法将不起作用.