我按照以下(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的新位置在哪里?
答案 0 :(得分:1)
根据您的问题,在渲染画布时,您对mScaleFactor
,mScaleFocusX
,mScaleFocusY
的操作不清楚。
但是,基本上你只需要反转这个过程来计算触摸的原始坐标(或任何其他形式的交互)。
因此,例如,如果您计算渲染坐标,如下所示:
float renderX = originalX * mScaleFactor + mScaleFocusX;
float renderY = originalY * mScaleFactor + mScaleFocusY;
所以需要使用
float correctedTouchX = (touchX - mScaleFocusX) / mScaleFactor;
float correctedTouchY = (touchY - mScaleFocusY) / mScaleFactor;
计算校正(原始)坐标。如果您以其他方式使用mScaleFactor
,mScaleFocusX
,mScaleFocusY
,则需要撤消该操作。
更新:似乎Canvas.scale()首先使用mScaleFocusX
和mScaleFocusY
来定义枢轴点(即偏移量),然后进行缩放。所以你可能需要这些公式(可能在某处将负号改为加号):
float correctedTouchX = touchX / mScaleFactor - mScaleFocusX;
float correctedTouchY = touchY / mScaleFactor - mScaleFocusY;