正如@4castle注释中指出的那样,方法返回具有复制的常量可绘制状态的可绘制对象的相同实例。文档说mutate()
可变可绘制对象保证不会与任何其他可绘制对象共享其状态
因此,在不影响具有相同状态的可绘制对象的情况下更改可绘制对象是安全的
让我们玩这个可画 - 黑色形状
<!-- shape.xml -->
<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle">
<solid android:color="@android:color/black" />
</shape>
view1.setBackgroundResource(R.drawable.shape); // set black shape as a background
view1.getBackground().mutate().setTint(Color.CYAN); // change black to cyan
view2.setBackgroundResource(R.drawable.shape); // set black shape background to second view
相反的方法是 。它将创建一个新的可绘制对象,但具有相同的常量状态。例如,查看:newDrawable()
BitmapDrawable.BitmapState
@Override
public Drawable newDrawable() {
return new BitmapDrawable(this, null);
}
对新可绘制对象的更改不会影响当前可绘制对象,但会更改状态:
view1.setBackgroundResource(R.drawable.shape); // set black shape as background
Drawable drawable = view1.getBackground().getConstantState().newDrawable();
drawable.setTint(Color.CYAN); // view still black
view1.setBackground(drawable); // now view is cyan
view2.setBackgroundResource(R.drawable.shape); // second view is cyan also