我正在使用SurfaceHolder
和ScaleGestureDetector
进行缩放工作。在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的值以使代码生效。
由于
答案 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;
我基本上做的是将焦点坐标转换为未缩放的单位(分割部分),然后计算每个坐标离开屏幕的数量(或者如果它是负数则进入屏幕)。