2010-10-07 54 views
10

我想創建一個圖片庫。 畫廊內的圖像應該是可縮放和平移的。我可以捏合縮放圖像,但無法設置縮放限制並防止圖像被移出屏幕。 我用下面的代碼來縮放圖像: http://code.google.com/p/4chan-image-browser/source/browse/src/se/robertfoss/MultiTouch/TouchImageView.java?spec=svnd3e623ddeb6f9e97d9eba2c7aaa7c4567a3822b5&r=d3e623ddeb6f9e97d9eba2c7aaa7c4567a3822b5ImageView捏合縮放比例限制和平移範圍

第一種方法: 我用TouchImageView提供圖像畫廊,這讓我捏變焦,但 不能滾動畫廊。即我不能區分'單選項卡事件'和'選項卡滾動事件'。

第二種方法: 使用ImageView將圖像提供給圖庫,如果用戶單擊任何圖庫項目,則在TouchImageView中顯示所選圖像,其中用戶可捏合縮放圖像。但是這也阻止了我滾動圖庫視圖。還有如何設置所選圖像的縮放限制和平移範圍?

回答

3

您可以通過添加這些行ACTION_MOVE設置變焦極限,模式== 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; 

同樣,添加命令行來ACTION_MOVE,模式==拖動考慮到圖像的原始位置,翻譯的長度,然後將它們與邊界進行比較。

+0

你有正確的想法調用'matrix.getValues(f);'。但是,解決方案不會返回true,因爲這會簡單地凍結屏幕。如果縮放值將要超過MAX_SCALE,則將縮放值設置爲MAX_SCALE。使用這種方法查看下面的答案以獲得完整的實現。 – 2011-10-04 08:18:49

2

我提供了一個答案here,它將平移,縮放和邊界檢測添加到ImageView。

20

這爲我解決了縮放限制問題。在圖像放大/縮小到極限之後,它會停止進一步。它也很流暢,沒有滯後。 0.7和2.0是最小和最大縮放級別。

.... 
} 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

親愛的你救我一天!應該接受答案! – 2015-09-24 07:00:59

3

有使用下面這段代碼嘗試,雖然它的作品,我發現這是造成小的增量值反式X和跨ÿ導致畫面緩慢移動屏幕外聚集。

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,0,0,0,1,0,0,0,1),其存儲的原始矩陣和矩陣復位回這些值每當的scaleX < 1.希望這有助於別人有一天:)

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); 
}