我想创建一个由三个灯组成的信号灯,它们由相同的资源制成,并以其各自的颜色(红色,黄色,绿色)着色,并由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手机上进行测试(结果相同)。
我知道很多开发人员都有可绘制状态和着色的问题,但显然所有人都可以通过变异和使用我在这里提到的代码来解决,所以在你认为这是一个重复的问题之前请考虑这个。