2012-10-25 46 views
12

我有一個ImageView。在它的onClick我得到它的繪製對象:可繪製的深度副本

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

並將其設置爲一個對話框的ImageView的:

zoomedImage.setImageDrawable(dr); 

但是當我關閉對話框或活動恢復。原始位置的圖像被拉伸並顯示爲大於其大小,導致在ImageView中只能看到圖像的一部分。

這是一個深拷貝的情況還是有另一個問題? 如果是這樣,我該如何深度複製原始Drawable,以便我可以將副本設置爲縮放圖像?

在此先感謝。

回答

26

最後我成功了! 我有類似的問題,當我用彩色濾光片我繪製它改變了繪製,它非常接近這裏的其他人的解決方案,但只有這個工作對我來說:

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

這對我有用.. – Neela

+1

最後!這是創建繪圖的自主副本的解決方案。改變()原始可繪製不是一個好的解決方案,它並不總是工作。從drawable的緩存創建新副本(即getContantState())。此評論爲其他人花了幾個小時對這個未成熟/未完成的API。 – carl

-3

你或許應該叫dr.clone,然後調用mutate()對象

上這將使繪製不共享任何狀態

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

編輯:也許只是

Drawable newdr = dr.mutate(); 

會工作。同時試一試

+3

變異不會複製繪製。它返回相同的對象。並Drawable沒有'克隆()' – ernazm

1

使用BitmapFactory將drawable轉換爲位圖,分別對其進行修改或執行更改。

9

我設法複製使用繪製下面的代碼:

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

這裏mutate()使得繪製可變的,以避免其共享狀態,並且getConstantState().newDrawable()創建一個新的副本。

因此不同ImageView s使用不同的drawables,沒有伸展。