2016-12-15 9 views
6

android私はdrawableがどのように一定の状態を共有しているかに関するいくつかの記事を読んでいます。したがって、ドロアブルを変更すると、同じビットマップにすべて影響します。例えば、あなたが星のドロアブルのリストを持っていたと言うことができます。 1つのアルファを変更すると、すべてのスターのドロワブルアルファが変更されます。 mutateを使用して、共有状態のないドロアブルの独自のコピーを取得することができます。
私が読んでいた記事は私の質問に今hereandroid Drawable - getConstantState.newDrawable()vs mutate()

です:私にとって

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

// vs 

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

彼らは両方として描画可能にクローニングされている:アンドロイドで、次の二つの呼び出しの違いは何

彼らは共に共有状態のないドロアブルを返します。何か不足していますか?

+0

あなたは 'クローン== drawable'が'であることをmutate' 'と気づくでしょう本当です。 – 4castle

+1

私は見るので、mutateは全く同じ描画可能ですが、共有状態はありません。およびdrawable.getConstantState()。newDrawable();実際にメモリに入れられた新しいドロアブルです、正しい? – j2emanue

+0

これは間違いない! – 4castle

答えて

5

@ 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 
+0

あなたは正しいですが、まったく同じ問題を抱えており、それが私のために解決しました。ありがとう! – apmartin1991

関連する問題