2

我正在使用SurfaceHolderandScaleGestureDetector让我的缩放工作。在两者之间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 的值以使代码正常工作。

谢谢

4

1 回答 1

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;

我基本上所做的是将焦点坐标转换为未缩放的单位(除法部分),然后计算每个坐标中有多少已超出屏幕(如果为负数,则进入屏幕)。

于 2013-04-30T08:27:40.250 回答