使用ImageView转换矩阵而不是canvas.scale(float,float,float,float)

时间:2013-08-23 16:58:59

标签: android matrix android-imageview android-canvas

我需要改变缩放的方式并将我的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说无法修改矩阵。任何帮助都会很棒!

2 个答案:

答案 0 :(得分:1)

好的,我发现了问题所在。我使用setImageMatrix(m)来应用于整个ImageView子类,而不是为画布设置矩阵,如下所示:

@Override
protected void onDraw(Canvas canvas){

    ...
    canvas.concat(transform);

}

我不确定这两者之间有什么区别,如果有人知道看到difference bewteen imageMatrix and matrix

编辑:使用canvas.setMatrix(transform)搞砸了滚动;建议使用canvas.concat(transform)来做这个技巧

答案 1 :(得分:0)

如果你尝试怎么办?

m.setScale(scaleFactor, scaleFactor);
m.postTranslate(zoomCenter[0], zoomCenter[1]);

我也相信不需要child.setScaleType(ScaleType.MATRIX)。至少我的编码没有它。