缩放后寻找新的点位置

3

我在onDraw中按以下方式缩放画布:

canvas.scale(mScaleFactor, mScaleFactor, mScaleFocusX, mScaleFocusY);

我的 onScale 函数如下:

private float mScaleFactor = 1.f;

public boolean onScale(ScaleGestureDetector detector) {
    mScaleFactor *= detector.getScaleFactor();
    mScaleFocusX = detector.getFocusX();
    mScaleFocusY = detector.getFocusY();  
        // Don't let the object get too small or too large.
    mScaleFactor = Math.max(0.1f, Math.min(mScaleFactor, 5.0f));
    invalidate();
    return true;
}

现在我使用onTouchEvent获取更多的点来创建新的path,最终我想要绘制。onTouchEvent给我x和y,但没有考虑缩放发生的情况。我如何知道缩放后x和y的新位置呢?

1个回答

1

根据您的问题,我们不清楚在渲染画布时您如何处理 mScaleFactormScaleFocusXmScaleFocusY。但是,基本上您只需要反向计算以计算触摸(或任何其他形式的交互)的原始坐标。

例如,如果您像这样计算渲染坐标:

float renderX = originalX * mScaleFactor + mScaleFocusX;
float renderY = originalY * mScaleFactor + mScaleFocusY;

所以需要使用。
float correctedTouchX = (touchX - mScaleFocusX) / mScaleFactor;
float correctedTouchY = (touchY - mScaleFocusY) / mScaleFactor;

计算校正(原始)坐标。如果您以其他方式使用mScaleFactormScaleFocusXmScaleFocusY,则需要将其反转。


更新:看起来Canvas.scale()首先使用mScaleFocusXmScaleFocusY定义一个中心点(即偏移),然后再进行缩放。因此,您可能需要使用以下公式(在某个地方将减号更改为加号):

float correctedTouchX = touchX / mScaleFactor - mScaleFocusX;
float correctedTouchY = touchY / mScaleFactor - mScaleFocusY;

我将这些变量发送到 canvas.scale.... 目前我没有以任何其他方式使用它们。 - SharonKo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接