缩放 canvas android 后在 canvas 中获得特定位置

Getting a particular position in canvas after zoom the canvas android

我需要单击 canvas 上的特定项目,同时还为 canvas 启用了缩放和移动功能。我可以在移动 canvas 的同时计算矩形位置。在那里我只是通过(CurrenTouchXPosition - StartXPosition)计算触摸移动距离。

public boolean onTouchEvent(MotionEvent event) {
    int action = event.getAction();

    int x = (int) event.getX(); 
    int y = (int) event.getY();

    float moveOffsetX = (event.getX() - start.x);
    float moveOffsetY = (event.getY() - start.y);

然后,

switch (event.getAction() & MotionEvent.ACTION_MASK) {
        case MotionEvent.ACTION_DOWN:
            savedMatrix.set(matrix);
            start.set(event.getX(), event.getY());
            mode = DRAG;
            break;
        case MotionEvent.ACTION_POINTER_DOWN:
            break;
        case MotionEvent.ACTION_UP:
            Log.d(TAG, "action up");
                secondRectUpperX = secondRectUpperX + moveOffsetX;
                secondRectBottomX = secondRectBottomX + moveOffsetX;
                secondRectUpperY = secondRectUpperY + moveOffsetY;
                secondRectBottomY = secondRectBottomY + moveOffsetY;

这可以识别矩形的新canvas位置。这非常有效。我可以通过此逻辑在移动 canvas 时识别特定项目的触摸事件。 但是现在我需要在缩放 canvas 之后计算相对于 canvas 的矩形位置。缩放背后的数学原理是什么。如果有人知道请帮忙。 谢谢。

终于想到了解决办法。

我将触摸位置屏幕坐标转换为 canvas 坐标。

switch (event.getAction() & MotionEvent.ACTION_MASK) {
        case MotionEvent.ACTION_DOWN:
            ...
            break;
        case MotionEvent.ACTION_POINTER_DOWN:
            ...
            break;
        case MotionEvent.ACTION_UP:
            float []m = new float[9];
            matrix.getValues(m);
            float transX = m[Matrix.MTRANS_X] * -1;
            float transY = m[Matrix.MTRANS_Y] * -1;
            float scaleX = m[Matrix.MSCALE_X];
            float scaleY = m[Matrix.MSCALE_Y];
            lastTouchX = (int) ((event.getX() + transX) / scaleX);
            lastTouchY = (int) ((event.getY() + transY) / scaleY);
            lastTouchX = Math.abs(lastTouchX);
            lastTouchY = Math.abs(lastTouchY);

Thanks for Andres Cardenas Pardo's answer here

我可以根据canvas坐标得到触摸位置坐标。由于我知道绘制对象的坐标,因此我检查触摸位置是否在绘制对象的范围内。

if((lastTouchX>=firstRectUpperX && firstRectBottomX>=lastTouchX) && (lastTouchY>=firstRectUpperY && firstRectBottomY>=lastTouchY)) {
    isbtn1Clicked = true;

}