在保持中心的同时缩放画布

时间:2013-02-21 09:07:32

标签: android android-layout

我正在使用SurfaceHolderScaleGestureDetector进行缩放工作。在SurfaceHolder.lockCanvas()surfaceHolder.unLockCanvasAndPost(canvas)之间执行缩放操作。

canvas.scale(mScaleFactor, mScaleFactor, scalePointX,scalePointY);

在onScaleMethod中,我执行以下

public boolean onScale(ScaleGestureDetector detector) {

            mScaleFactor *= detector.getScaleFactor();
            // Don't let the object get too small or too large.
            mScaleFactor = Math.max(1.0f, Math.min(mScaleFactor, 35f));
            scalePointX=(detector.getFocusX());
            scalePointY=(detector.getFocusY());
            Log.i("Zoom",mScaleFactor+""); 
         return true; 
}

但画布不会在两个手指之间的中心缩放。我应该如何调整scalePointX和scalePointY的值以使代码生效。

由于

1 个答案:

答案 0 :(得分:0)

我认为这是一个相当古老的问题,但让我们至少回答它。

代码中的问题是焦点坐标基本上是在视图上单击的像素坐标。这是你通常从动作事件中得到的那个。换句话说 - 它不是图像上的坐标(或者你正在缩放的​​任何东西)。

这是我的解决方案:

我不使用缩放点,而是分别翻译整个画布。我以1.0的比例(不缩放​​)保持单位的平移坐标。如果你想使用比例中心,你只需要像我一样将起始坐标改为中心而不是左上角。这是我的onScale函数的一部分(我还更新了比例因子并添加了一些限制,但这是与维护中心有关的唯一部分):

float sf = mScaleGestureDetector.getScaleFactor();
float x = (mScaleGestureDetector.getFocusX() / mScaleFactor) * (1 - sf);
float y = (mScaleGestureDetector.getFocusY() / mScaleFactor) * (1 - sf);

mTranslateX += x;
mTranslateY += y;

我基本上做的是将焦点坐标转换为未缩放的单位(分割部分),然后计算每个坐标离开屏幕的数量(或者如果它是负数则进入屏幕)。