2012-10-25 18 views
12

Tôi có một ImageView. Trong onClick của nó tôi nhận được drawable của nó:Bản sao sâu của bản vẽ

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

Và đặt nó vào ImageView một hộp thoại:

zoomedImage.setImageDrawable(dr); 

Nhưng khi tôi đóng hộp thoại hoặc các hoạt động thi đấu trở lại. Hình ảnh ở vị trí ban đầu được kéo dài và được hiển thị lớn hơn kích thước của nó, dẫn đến chỉ một phần của hình ảnh hiển thị trong ImageView.

Đây có phải là trường hợp bản sao sâu hoặc có vấn đề khác không? Nếu có, làm cách nào để tôi có thể sao chép sâu Bản vẽ gốc để tôi có thể đặt bản sao để thu phóng hình ảnh?

Xin cảm ơn trước.

Trả lời

26

Cuối cùng tôi thành công! Tôi có vấn đề tương tự, khi tôi sử dụng bộ lọc màu trên drawable của tôi nó đã thay đổi drawable, nó rất gần với các giải pháp của những người khác ở đây, nhưng chỉ này làm việc cho tôi:

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

làm việc này cho tôi .. – Neela

+1

CUỐI CÙNG! Đây là giải pháp để tạo ra một bản sao tự trị của một drawable. Để biến đổi() các drawable ban đầu không phải là một giải pháp tốt, nó không phải luôn luôn làm việc. Tạo bản sao mới từ bộ nhớ cache của đối tượng có thể vẽ (tức là getContantState()) hoạt động. Nhận xét này FYI cho những người khác đã dành hàng giờ đồng hồ trên api chưa trưởng thành/nonfinished này. – carl

-3

Bạn có lẽ nên gọi dr.clone và sau đó gọi mutate() trên đối tượng

này sẽ làm cho drawable không chia sẻ bất cứ tiểu bang

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

Edit: Có lẽ chỉ

Drawable newdr = dr.mutate(); 

sẽ làm việc. Cung cấp cho cả hai thử

+3

đột biến không sao chép một có thể vẽ được. Nó trả về cùng một đối tượng. Và Drawable không có 'clone()' – ernazm

1

Sử dụng BitmapFactory để chuyển đổi bản vẽ thành bitmap riêng biệt thực hiện hoặc thực hiện thay đổi trên đó.

9

tôi quản lý để sao chép drawable sử dụng đoạn mã sau:

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

đây mutate() làm cho có thể thay đổi drawable để tránh chia sẻ trạng thái của nó, và getConstantState().newDrawable() tạo ra một bản sao mới.

Vì vậy, khác nhau ImageView s sử dụng các bản vẽ khác nhau và không có kéo dài.