2013-08-23 152 views
0

我需要改變我縮放和移動我的imageview到使用矩陣,而不是調用canvas.scale(,,,,),但我無法弄清楚正確的呼叫來做到這一點。使用ImageView變換矩陣,而不是canvas.scale(浮動,浮動,浮動,浮動)

這在我的ScaleListener監聽器類的onScale方法

public boolean onScale(ScaleGestureDetector detector) { 

    ...//determining zoom level and pivot points offset 

    child.zoom(scaleFactor, zoomCenter[0], zoomCenter[1]); 
} 

我在孩子的ImageView onDraw方法有

protected void onDraw(Canvas canvas){ 

    super.onDraw(canvas); 
    canvas.scale(mScaleFactor, mScaleFactor, mPosX, mPosY); 
    ... 
    //do all the drawing here 
} 

public void zoom(float scaleFactor, float zoomCenterX, float zoomCenterY) { 
    mScaleFactor = scaleFactor; 
    mPosX = zoomCenterX; 
    mPosY = zoomCenterY; 

    //redraw and remeasure the mapview after zooming in 
    invalidate(); 

} 

我想在onScale這樣的事情方法:

public boolean onScale(ScaleGestureDetector detector) { 
     ...//calculating scale and offsets 

     Matrix m = child.getImageMatrix(); 
     m.reset(); 
     m.postScale(scaleFactor, scaleFactor); 
     m.postTranslate(zoomCenter[0], zoomCenter[1]); 
     child.setScaleType(ScaleType.MATRIX); 
     child.setImageMatrix(m); 

     child.invalidate(); 


     return true; 
    } 

但是這似乎沒有做任何事情......我在這裏錯過了什麼嗎?我嘗試使用child.getMatrix()代替,但通過IllegalStateException表示矩陣不能修改。任何幫助將是偉大的!

回答

1

好吧,我想清楚是什麼問題。我用setImageMatrix(m)適用於整個ImageView的子類,而不是爲畫布設置矩陣,就像這樣:

@Override 
protected void onDraw(Canvas canvas){ 

    ... 
    canvas.concat(transform); 

}

我不知道有什麼區別兩者之間雖然,如果有人知道看difference bewteen imageMatrix and matrix

編輯:使用canvas.setMatrix(transform)弄亂了滾動; canvas.concat(transform)被推薦,而不是這個技巧

+0

謝謝!你節省了我幾個小時的時間! – Tomasz

0

如果您嘗試,該怎麼辦?我也相信child.setScaleType(ScaleType.MATRIX)是不需要的。至少我的編碼沒有它。

+0

postScale()和setScale()之間有什麼區別?另外,我注意到有一個setScale(float,float,float,float),我可以使用它來做基本相同的事情。但有了我上面的代碼,沒有什麼更新 – kburbach

+0

據我所知,「後」是應用於矩陣的最後一個操作。它只能是一個「後期」操作。 –

+1

這個問題有很好的答案,爲我清除差異:http://stackoverflow.com/questions/3855578/android-matrix-what-is-the-different-between-preconcat-and-postconcat – kburbach