2010-10-07 50 views
10

Tôi muốn tạo một bộ sưu tập với hình ảnh. Các hình ảnh trong thư viện phải có thể thu phóng và có thể chỉnh sửa được. Tôi có thể thu nhỏ hình ảnh nhưng không thể đặt giới hạn thu phóng và ngăn hình ảnh bị rớt khỏi màn hình. tôi đã sử dụng đoạn mã sau để phóng to hình ảnh: http://code.google.com/p/4chan-image-browser/source/browse/src/se/robertfoss/MultiTouch/TouchImageView.java?spec=svnd3e623ddeb6f9e97d9eba2c7aaa7c4567a3822b5&r=d3e623ddeb6f9e97d9eba2c7aaa7c4567a3822b5ImageView Pinch-zoom Quy mô giới hạn và giới hạn pan

cách tiếp cận thứ nhất: tôi đã sử dụng TouchImageView để cung cấp hình ảnh vào thư viện, điều này cho phép tôi véo zoom nhưng không thể di chuyển thư viện. tức là tôi không thể phân biệt giữa 'sự kiện tab đơn lẻ' và 'tab để cuộn sự kiện'.

Cách tiếp cận thứ hai: Đã sử dụng ImageView để cung cấp hình ảnh cho thư viện và nếu người dùng nhấp vào bất kỳ mục nào của thư viện hiển thị hình ảnh được chọn trong TouchImageView, nơi người dùng có thể thu nhỏ hình ảnh. Nhưng điều này cũng ngăn tôi di chuyển chế độ xem thư viện. Và cũng làm thế nào để thiết lập giới hạn zoom và giới hạn chảo trên hình ảnh được chọn?

Trả lời

3

Bạn có thể thiết lập giới hạn zoom bằng cách thêm các dòng để ACTION_MOVE, chế độ == ZOOM:

float[] f = new float[9]; 
matrix.getValues(f); 

float scaleX = f[Matrix.MSCALE_X]; 
float scaleY = f[Matrix.MSCALE_Y]; 
if (scaleX > MAX_SCALE || scaleY > MAX_SCALE) return true; 

Tương tự như vậy, thêm dòng để ACTION_MOVE, chế độ == KÉO mà sẽ đưa vào tài khoản của vị trí ban đầu của hình ảnh của bạn, chiều dài đã dịch và sau đó so sánh chúng với giới hạn.

+0

Bạn có ý tưởng đúng gọi 'matrix.getValues ​​(f);'. Tuy nhiên, giải pháp không phải là để trở về sự thật, vì điều này sẽ chỉ đóng băng màn hình. Thay vào đó nếu giá trị chia tỷ lệ sắp vượt qua MAX_SCALE, thì hãy đặt giá trị chia tỷ lệ bằng MAX_SCALE. Kiểm tra câu trả lời của tôi dưới đây để thực hiện đầy đủ bằng cách sử dụng phương pháp này. –

2

Tôi đã cung cấp câu trả lời here để thêm tính năng quét, thu phóng và phát hiện ranh giới cho ImageView.

20

Điều này đã khắc phục sự cố giới hạn thu phóng đối với tôi. Sau khi hình ảnh được phóng to/thu nhỏ đến giới hạn, nó sẽ dừng lại xa hơn. Nó cũng trơn tru và không có độ trễ. 0,7 và 2,0 là mức thu phóng tối thiểu và tối đa.

.... 
} else if (mode == ZOOM) { 
    float[] f = new float[9]; 

    float newDist = spacing(event); 
    if (newDist > 10f) { 
      matrix.set(savedMatrix); 
      float tScale = newDist/dist; 
      matrix.postScale(tScale, tScale, mid.x, mid.y); 
    } 

    matrix.getValues(f); 
    float scaleX = f[Matrix.MSCALE_X]; 
    float scaleY = f[Matrix.MSCALE_Y]; 

    if(scaleX <= 0.7f) { 
      matrix.postScale((0.7f)/scaleX, (0.7f)/scaleY, mid.x, mid.y); 
    } else if(scaleX >= 2.5f) { 
      matrix.postScale((2.5f)/scaleX, (2.5f)/scaleY, mid.x, mid.y); 
    } 
} 
....   
+1

bạn tiết kiệm ngày thân yêu của tôi! nên được chấp nhận trả lời! –

3

Đã thử sử dụng mã này bên dưới và mặc dù hoạt động của tôi thấy rằng nó đã gây ra các giá trị gia tăng nhỏ để tích lũy trong Trans X và Trans Y dẫn đến hình ảnh từ từ di chuyển khỏi màn hình.

if(scaleX <= 0.7f) 
      matrix.postScale((0.7f)/scaleX, (0.7f)/scaleY, mid.x, mid.y); 
    else if(scaleX >= 2.5f) 
      matrix.postScale((2.5f)/scaleX, (2.5f)/scaleY, mid.x, mid.y); 

tôi cố định này được lưu trữ một ma trận ban đầu trong một float [] (1,0,0,0,1,0,0,0,1) và đặt lại ma trận trở lại những giá trị bất cứ khi nào scaleX < 1. Hy vọng điều này sẽ giúp người khác một ngày :)

if(scaleX <= 1.0f) {         
    float[] originalmatrixvalues = new float[] {1f, 0f, 0f, 0f, 1f, 0f, 0f, 0f, 1f}; 
    matrix.setValues(originalmatrixvalues); 
} else if(scaleX >= 2.5f) { 
    matrix.postScale((2.5f)/scaleX, (2.5f)/scaleY, mid.x, mid.y); 
}