在mutate()和getConstantState()之后无法编辑drawable.newDrawable()不提供独立的drawable

时间:2018-02-16 10:07:29

标签: java android user-interface view drawable

我想创建一个由三个灯组成的信号灯,它们由相同的资源制成,并以其各自的颜色(红色,黄色,绿色)着色,并由java代码控制。但是,看起来我不能变异并创建源drawable的独立实例。

                <LinearLayout
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:orientation="horizontal">

                    <ImageView
                        android:id="@+id/light1"
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        app:srcCompat="@android:drawable/presence_invisible" />

                    <ImageView
                        android:id="@+id/light2"
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        app:srcCompat="@android:drawable/presence_invisible" />

                    <ImageView
                        android:id="@+id/light3"
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        app:srcCompat="@android:drawable/presence_invisible" />
                </LinearLayout>

尝试:

        ImageView iv1 = (ImageView)findViewById(light1res);
        Drawable dw = ContextCompat.getDrawable(activity, android.R.drawable.presence_invisible);
        dw.mutate();
        dw.setColorFilter(Color.RED, PorterDuff.Mode.SRC_IN);
        iv1.setImageDrawable(dw);

结果:三个imageView中没有一个被染色。如果我删除dw.mutate(),那么所有三个imageView都会被染色。如果我用dw=dw.getConstantState().newDrawable()替换dw.mutate(),那么所有的imageView都会被着色。如果我dw.mutate().getConstantState().newDrawable(),结果与.mutate()相同(对可绘制的编辑没有影响),因此没有任何颜色。如果我dw.getConstantState().newDrawable().mutate(),那么所有的ImageView都会得到相同的变化,所以它就像根本不做变异一样。我可以在任何一行做所有这些和类似的事情,结果保持不变。

在换行后使用函数setColorFilter(...)或DrawableCompat.tint(...)并不重要,结果行为与上述完全相同。

所以它看起来像在执行mutate()之后,drawable上的更改没有任何效果和.getConstantState()。newDrawable()提供了一个drawable,它仍然与原始状态共享其状态。

通过iv1.getDrawable()获取drawable也没有区别。

任何想法是什么以及如何解决这个特殊的奇怪问题?

我正在使用构建工具25.0.3(编译sdk版本api 25 Android 7.1.1)并在Android 5和Android 7手机上进行测试(结果相同)。

我知道很多开发人员都有可绘制状态和着色的问题,但显然所有人都可以通过变异和使用我在这里提到的代码来解决,所以在你认为这是一个重复的问题之前请考虑这个。

0 个答案:

没有答案