现在回答我的问题:
android中的以下两个调用之间有什么区别:
Drawable clone = drawable.getConstantState().newDrawable();
// vs
Drawable clone = (Drawable) drawable.getDrawable().mutate();
对我来说,他们都克隆了一个drawable,因为他们都返回了一个没有共享状态的drawable。我错过了什么吗?
答案 0 :(得分:11)
正如@ 4castle在注释mutate()
中指出的那样,方法返回与复制的常量drawable状态相同的drawable实例。 Docs说
保证不变的drawable不与任何其他drawable共享其状态
因此,在不影响具有相同状态的drawable的情况下更改drawable是安全的
让我们玩这个drawable - 黑色的形状
<!-- 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()
。它创建了一个新的drawable但具有相同的常量状态。例如。看看BitmapDrawable.BitmapState
:
@Override
public Drawable newDrawable() {
return new BitmapDrawable(this, null);
}
对新drawable的更改不会影响当前drawable,但会更改状态:
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