2012-10-25 23 views
12

私はImageViewを持っています。Drawableのディープコピー

Drawable dr = ((ImageView) v).getDrawable(); 

を、ダイアログのImageViewのに設定します:そのonClickので、私はそのDrawableのを取得

zoomedImage.setImageDrawable(dr); 

をしかし、私は、ダイアログを閉じるとき、または活動が再開されます。元の位置にある画像は引き伸ばされ、そのサイズより大きく表示され、画像の一部のみがImageViewに表示されます。

これはディープコピーのケースですか、別の問題がありますか? もしそうなら、オリジナルのDrawableを深くコピーして、コピーを拡大したイメージに設定するにはどうすればいいですか?

ありがとうございます。

答えて

26

最後に私は成功します!

Drawable drwNewCopy = dr.getConstantState().newDrawable().mutate(); 
+0

これは私のために働きます.. – Neela

+1

最後に!これは、ドロウアブルの自律コピーを作成するソリューションです。 mutate()するには元のドロアブルは良い解決策ではありませんが、常に機能するとは限りません。ドロアブルのキャッシュ(つまり、getContantState())から新しいコピーを作成することができます。この未熟/未完成のAPIで数時間を費やしている他の人のためのこのコメントFYI。 – carl

-3

おそらくdr.cloneを呼び出してから、これは描画可能で

Drawable newdr = dr.clone(); 
newdr = newdr.mutate(); 

は編集任意の状態を共有しないようになりますオブジェクト

mutate()を呼び出す必要があります:たぶんちょうど

Drawable newdr = dr.mutate(); 

が動作します。両方を試してみてください

+3

に変異がコピーされません: 私は私の描画可能にカラーフィルタを使用する場合には、描画可能な、ここで他の人の溶液への非常に近くを変更しましたが、これだけは私のために働いた、同様の問題がありましたドロアブル同じオブジェクトを返します。 Drawableは 'clone()'を持っていません – ernazm

1

BitmapFactoryを使用して、描画可能なビットマップを個別に作成したり、変更を行ったりしてください。

9

は、私は次のコードを使用して描画可能をコピーするために管理:ここで

drawable.mutate().getConstantState().newDrawable(); 

mutate()はその状態を共有避けるために描画可能に可変になり、そしてgetConstantState().newDrawable()は新しいコピーを作成します。

したがって、異なるImageViewは、異なるドロウアブルを使用し、伸びはありません。

関連する問題