2011-11-03 31 views
10

Bối cảnh: Tôi có một ImageView mà tôi đã sửa đổi để cuộn (kéo) và thu phóng. Tôi đã sử dụng kỹ thuật chính xác được đề cập trong cuốn sách ấn bản thứ 3 "Xin chào, Android" cũng có thể được tìm thấy here. Kỹ thuật này sử dụng phép biến đổi ma trận để xử lý cả cuộn và thu phóng.Android ImageView - Nhận tọa độ của vòi (nhấp) bất kể vị trí cuộn hoặc tỷ lệ thu phóng

Vấn đề của tôi: Khi người dùng nhấn vào hình ảnh, tôi muốn tọa độ của vòi đó liên quan đến chính hình ảnh, bất kể hình ảnh đã được cuộn hoặc phóng to như thế nào. Ví dụ: nếu hình ảnh của tôi là 1000x2000 và tôi cuộn và thu phóng hình ảnh. Sau đó, tôi gõ vào hình ảnh tại một điểm nhất định, tôi muốn biết điểm đó là gì liên quan đến 1000x2000, không chỉ là khu vực màn hình. Tôi có thể làm cái này như thế nào?

Trả lời

29

Tôi đã tìm thấy giải pháp cho điều này bằng cách sử dụng các bit thông tin mà tôi đã ghép nối với nhau từ các câu hỏi khác trên trang web này. Để trả lại cho cộng đồng, tôi nghĩ rằng đó chỉ là quyền chia sẻ những gì tôi đã học được. Hy vọng điều này sẽ giúp ai đó:

// Get the values of the matrix 
float[] values = new float[9]; 
matrix.getValues(values); 

// values[2] and values[5] are the x,y coordinates of the top left corner of the drawable image, regardless of the zoom factor. 
// values[0] and values[4] are the zoom factors for the image's width and height respectively. If you zoom at the same factor, these should both be the same value. 

// event is the touch event for MotionEvent.ACTION_UP 
float relativeX = (event.getX() - values[2])/values[0]; 
float relativeY = (event.getY() - values[5])/values[4]; 

Nhờ những nguồn: source 1source 2

+0

bạn có thể xin vui lòng gửi làm thế nào các yếu tố zoom được tính toán? Tôi muốn hiểu nếu nó có thể được cả hai nhỏ hơn và lớn hơn 1 (rõ ràng là không cùng một lúc ...). – Matteo

+0

Rất hữu ích cho tôi. Thanh danh! –

+3

"' Hy vọng điều này sẽ giúp ai đó "- hoàn toàn – topher

2

Bạn cũng có thể tính toán ma trận nghịch đảo và sử dụng mapPoints() phương pháp:

// Get the inverse matrix 
Matrix inverseMatrix = new Matrix(); 
matrix.invert(inverseMatrix); 

// Transform to relative coordinates 
float[] point = new float[2]; 
point[0] = e.getX(); 
point[1] = e.getY(); 
inverseMatrix.mapPoints(point); 
Các vấn đề liên quan