缩放后找到新的点位置

时间:2013-12-25 16:34:17

标签: java android scaling

我按照以下(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)来创建最终我想要绘制的新pathonTouchEvent给了我x和y,但没有考虑到出现了比例。 如何知道缩放后x和y的新位置在哪里?

1 个答案:

答案 0 :(得分: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;