2016-12-15 9 views
6

в android Я прочитал несколько статей о том, как drawables совместно используют постоянное состояние. поэтому, если вы вносите изменения в drawable, это влияет на все одинаковые растровые изображения. например, скажем, у вас есть список звездных чертежей. изменение альфы на одном изменит все звездные символы альфа. но вы можете использовать mutate, чтобы получить свою собственную копию с возможностью переноса без общего состояния.
В статье я читал это hereandroid Drawable - getConstantState.newDrawable() vs mutate()

Теперь на мой вопрос:

чем разница между следующими двумя вызовами в андроиде:

Drawable clone = drawable.getConstantState().newDrawable(); 

// vs 

Drawable clone = (Drawable) drawable.getDrawable().mutate(); 

Для меня они оба клонирования Drawable как они оба возвращают доступный, который не имеет общего состояния. Я что-то упускаю ?

+0

Вы заметите с '' mutate', что клон == drawable' является ' true'. – 4castle

+1

Я вижу, поэтому mutate - это то же самое, что и выведенное, но без общего состояния. и drawable.getConstantState(). newDrawable(); на самом деле это новый способный поместиться в память, правильно? – j2emanue

+0

Это правильно! – 4castle

ответ

5

Как @ 4castle указал в комментарии mutate() метод возвращает тот же экземпляр с возможностью копирования с скопированным постоянным допустимым состоянием. Docs говорит, что

Изменяемая вытяжка гарантирована не разделяет его состояние с любым другим вытяжкой

Так безопасно изменить вытяжку, не затрагивая вводимый коэффициент в том же состоянии

Позволяет играть с этим 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(). Он создает новый доступный, но с тем же постоянным состоянием. Например. посмотреть на 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 
+0

Ты, сэр, прав, имел ту же самую проблему, и решил это для меня. Благодаря! – apmartin1991