任何使捏缩放更平滑的方法

时间:2014-09-20 18:04:26

标签: android canvas

有没有办法在不使用矩阵的情况下实现平滑缩放?

我正在构建绘图应用程序,我希望它有缩放缩放。

我获得了缩放的支点:

centerposX = mScaleDetector.getFocusX();
centerposY = mScaleDetector.getFocusY();

然后进行缩放,我使用:

canvas.scale(scaleFactor, scaleFactor, centerposX, centerposY);

但问题是,它会立即将视图置于枢轴点中心,并将其放大,而不是将其用作居中的指南。

我已经看到这个问题已经通过使用矩阵解决了,但是我不想使用它们,因为我需要跟踪偏移,ZoomTranslations是从centerposX / Y和scaleFactor到将图纸放在屏幕上。

那么有没有办法顺利解决这个支点问题?

谢谢!

1 个答案:

答案 0 :(得分:2)

一周之后,我明白我需要使用矩阵并在屏幕上获得绝对坐标,所以我使用手势检测器来设置矩阵比例

matrix.postScale(mScaleFactor, mScaleFactor, focusX, focusY);

在我的onDraw方法中,我使用了canvas.concat(matrix);,所以不仅是Bitmap,而且是WHOLE canvas得到的矩阵变换,并且为了得到真正的屏幕坐标,我使用了在堆栈溢出时找到的方法:

public float[] getAbsolutePosition(float Ax, float Ay) {
        matrix.getValues(m);

        float x = width - ((m[Matrix.MTRANS_X] - Ax) / m[Matrix.MSCALE_X])
                - (width - getTranslationX());

        float y = height - ((m[Matrix.MTRANS_Y] - Ay) / m[Matrix.MSCALE_X])
                - (height - getTranslationY());

        return new float[] { x, y };
    }

我每次都在onTouchEvent()方法中调用它,提供event.getX和event.getY()作为参数。

在那之后,一切都很容易,也是因为这个美丽的方法,我已经摆脱了4-5个变量,我不得不用它来找到真正的触摸位置。