2013-07-12 68 views
7

Tôi biết rằng SO có đầy đủ các câu hỏi về Ma trận, nhưng tôi không thể tìm thấy câu hỏi mà nó được giải thích đầy đủ. Tôi đoán rằng bất kỳ ImageView nào có Ma trận có trách nhiệm nhân rộng, xoay và vị trí. Nhưng tại sao tôi không thể xoay một hình ảnh bằng cách sử dụng Matrix như thế này:hiểu cách sử dụng Ma trận ImageView

ImageView img = (ImageView)findViewById(R.id.some_imageview); 
img.setScaleType(ScaleType.Matrix); 
Rect bounds = img.getDrawable.getBounds(); 
img.getImageMatrix().postRotate(180f, bounds.width()/2, bounds.height()/2); 

vài câu trả lời gợi ý để làm điều đó như thế này:

ImageView img = (ImageView)findViewById(R.id.some_imageview); 
img.setScaleType(ScaleType.Matrix); 
Rect bounds = img.getDrawable.getBounds(); 
Matrix rotationMatrix = new Matrix(); 
rotationMatrix.postRotate(180f, bounds.width()/2, bounds.height()/2); 
img.setImageMatrix(rotationMatrix); 

TẠI SAO tôi phải tạo ra một ma trận mới mỗi khi tôi muốn xoay? Hơn nữa, nếu tôi đặt Ma trận từ ví dụ thứ hai, Tại sao nó không quay lại (với mức độ ban đầu) nếu tôi đặt lại rotationMatrix? Nếu tôi muốn có được mức độ ban đầu, tôi có thể thiết lập một Ma trận được xây dựng đơn giản. nhưng một lần nữa, tôi KHÔNG hiểu tại sao

img.getImageMatrix().postRotate(180f, bounds.width()/2, bounds.height()/2); 

sẽ không hoạt động.

Lưu ý: Tôi cũng đã thử các phương pháp setRotate mà không quan sát bất kỳ sự khác biệt

EDIT: do một bình luận

Tôi đã hỏi Tại sao tôi phải tạo một mọi Matrix mới, trong đó hàm ý câu hỏi, tại sao Tôi không thể sử dụng Ma trận tại chỗ. Cũng gì tôi nghi ngờ với công việc là này (mà thực sự sẽ không, quá):

ImageView img = (ImageView)findViewById(R.id.some_imageview); 
img.setScaleType(ScaleType.Matrix); 
Rect bounds = img.getDrawable.getBounds(); 
Matrix rotationMatrix = new Matrix(); 
rotationMatrix.postRotate(180f, bounds.width()/2, bounds.height()/2); 
img.setImageMatrix(rotationMatrix); 
//works until here. 

//Then after that successful call 

//assumed to get my Matrix back, which is rotated by 180 degrees 

Matrix matrix = img.getImageMatrix(); 
Rext bounds = img.getDrawable().getBounds() 
//rotate again at 90 degree. It should be now rotated 270 degrees (180 from before, plus 90 now) 
matrix.postRotate(90f, bounds.width()/2, bounds.height()/2); 
//unfortunately NO effect! 
img.setImageMatrix(matrix); 
+0

tài liệu nói rằng bạn không nên sử dụng ma trận được trả về bởi getImageMatrix. Hãy xem [ở đây] (http://developer.android.com/reference/android/widget/ImageView.html#getImageMatrix()) – Blackbelt

+0

@blackbelt Tôi đã yêu cầu giải thích TẠI SAO tôi không nên sử dụng Ma trận này tại chỗ, ít nhất nếu nó không phải là null ..., đặc biệt là nếu tôi đặt nó trước ... –

+1

Thực tế bạn hỏi "Tại sao tôi phải tạo một Ma trận mới mỗi lần tôi muốn xoay?" – Blackbelt

Trả lời

1

Nhìn vào source nó trông giống như trong phương pháp setImageMatrix() tính toán ma trận được áp dụng. Sử dụng ma trận này sau đó (tức là sau khi lấy nó bằng trình lấy) sẽ không có tác dụng nếu tính toán được thực hiện trong phương thức setter.

Các vấn đề liên quan