2013-08-23 108 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