【问题标题】:Using an ImageView transform matrix instead of canvas.scale(float, float, float, float)使用 ImageView 变换矩阵而不是 canvas.scale(float, float, float, float)
【发布时间】:2013-08-23 16:58:59
【问题描述】:

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

【问题讨论】:

    标签: android matrix android-imageview android-canvas


    【解决方案1】:

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

    @Override
    protected void onDraw(Canvas canvas){
    
        ...
        canvas.concat(transform);
    

    }

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

    编辑:使用canvas.setMatrix(transform) 搞砸了滚动;建议使用canvas.concat(transform),这可以做到这一点

    【讨论】:

    • 谢谢!您为我节省了数小时的时间!
    【解决方案2】:

    如果你尝试呢?

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

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

    【讨论】:

    • postScale() 和 setScale() 有什么区别?另外,我注意到有一个我可以使用的 setScale(float, float, float, float) 基本上做同样的事情。但是使用我上面的代码,什么都没有更新
    • 据我了解,“post”是应用于矩阵的最后一个操作。它只能是一个“发布”操作。
    • 这个问题有很好的答案,为我消除了差异:stackoverflow.com/questions/3855578/…
    猜你喜欢
    • 2021-12-07
    • 2011-10-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-17
    相关资源
    最近更新 更多