2010-01-29 59 views
4

我正在爲android編寫一個應用程序(儘管我認爲這是一個普通問題),我需要顯示一個可以滾動和縮放的大圖像(在ImageView中)。我設法通過捕獲觸摸事件和執行矩陣轉換來實現滾動工作,並且我正在進行縮放。圖像縮放的正確轉換

如果我只是對圖像應用比例變換,它會放大原點,即屏幕的左上角。我想放大屏幕的中心。 從我讀過的,這意味着我需要一個轉換,使原點爲屏幕的中心。我認爲,所需要的是類似以下各項假設屏幕的中心是(5,5)爲簡單起見...

-Translate by (-5, -5)
-Scale by the zoom factor
-Translate by (+5, +5)*zoomfactor

不幸的是,這似乎沒有工作 - 變焦似乎走任何地方,但中心......有人可以幫我在這裏?

編輯:這是現在工作

Matrix zoommatrix = new Matrix(); 
    float[] centerpoint = {targetimageview.getWidth()/2.0f, targetimageview.getHeight()/2.0f}; 

    zoommatrix.postScale(zoomfactor, zoomfactor, centerpoint[0], centerpoint[1]); 
    zoommatrix.preConcat(targetimageview.getImageMatrix()); 

    targetimageview.setImageMatrix(zoommatrix); 
    targetimageview.invalidate(); 
+0

你可以發表你的轉換代碼? – AGrunewald 2010-01-29 16:32:50

回答

3

檢查ImageViewTouchBase在Android源代碼的相機應用的代碼;其「zoomTo」的方法做到這一點:

protected void zoomTo(float scale, float centerX, float centerY) { 
    if (scale > mMaxZoom) { 
     scale = mMaxZoom; 
    } 

    float oldScale = getScale(); 
    float deltaScale = scale/oldScale; 

    mSuppMatrix.postScale(deltaScale, deltaScale, centerX, centerY); 
    setImageMatrix(getImageViewMatrix()); 
    center(true, true); 
} 

該中心的方法是可能是你真正關心的一點:

protected void center(boolean horizontal, boolean vertical) { 
    if (mBitmapDisplayed.getBitmap() == null) { 
     return; 
    } 

    Matrix m = getImageViewMatrix(); 

    RectF rect = new RectF(0, 0, 
      mBitmapDisplayed.getBitmap().getWidth(), 
      mBitmapDisplayed.getBitmap().getHeight()); 

    m.mapRect(rect); 

    float height = rect.height(); 
    float width = rect.width(); 

    float deltaX = 0, deltaY = 0; 

    if (vertical) { 
     int viewHeight = getHeight(); 
     if (height < viewHeight) { 
      deltaY = (viewHeight - height)/2 - rect.top; 
     } else if (rect.top > 0) { 
      deltaY = -rect.top; 
     } else if (rect.bottom < viewHeight) { 
      deltaY = getHeight() - rect.bottom; 
     } 
    } 

    if (horizontal) { 
     int viewWidth = getWidth(); 
     if (width < viewWidth) { 
      deltaX = (viewWidth - width)/2 - rect.left; 
     } else if (rect.left > 0) { 
      deltaX = -rect.left; 
     } else if (rect.right < viewWidth) { 
      deltaX = viewWidth - rect.right; 
     } 
    } 

    postTranslate(deltaX, deltaY); 
    setImageMatrix(getImageViewMatrix()); 
} 
+0

優秀!我需要的是postScale()的重載以及一個磅秤。現在的縮放代碼看起來像這樣... 好吧,它不適合,我會編輯我的問題,包括它。所需要的只是將當前變換矩陣乘以四個參數形式的scale()生成的矩陣() – 2010-01-30 01:07:17