0

我需要更改缩放和移动图像视图的方式,以使用矩阵而不是调用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 说不能修改矩阵。任何帮助都会很棒!

4

2 回答 2

1

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

@Override
protected void onDraw(Canvas canvas){

    ...
    canvas.concat(transform);

}

我不确定两者之间有什么区别,如果有人知道的话,看看imageMatrix 和 matrix 之间的区别

编辑:使用canvas.setMatrix(transform)搞砸了滚动;canvas.concat(transform)被推荐了,这就是这个技巧

于 2013-08-23T22:08:23.073 回答
0

如果你试试呢?

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

我也相信child.setScaleType(ScaleType.MATRIX)不需要。至少我的编码可以在没有它的情况下工作。

于 2013-08-23T17:11:57.173 回答