Android 缩放画布后获取画布中的特定位置

Android 缩放画布后获取画布中的特定位置,android,canvas,position,touch,zooming,Android,Canvas,Position,Touch,Zooming,我需要点击画布上的特定项目,同时缩放和移动功能也可以用于画布。我可以在移动画布时计算矩形的位置。在这里,我只是通过(CurrenTouchXPosition-StartXPosition)计算触摸移动距离 那么 switch (event.getAction() & MotionEvent.ACTION_MASK) { case MotionEvent.ACTION_DOWN: savedMatrix.set(matrix);

我需要点击画布上的特定项目,同时缩放和移动功能也可以用于画布。我可以在移动画布时计算矩形的位置。在这里,我只是通过(CurrenTouchXPosition-StartXPosition)计算触摸移动距离

那么

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;
这可以识别矩形的新画布位置。这很好用。通过此逻辑,我可以在移动画布时识别特定项目的触摸事件。 但是现在我需要在缩放画布之后计算相对于画布的矩形位置。变焦背后的数学是什么。如果有人知道,请帮忙。
谢谢。

最后我想出了一个解决办法

我将触摸屏坐标转换为画布坐标

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);

我可以根据画布坐标得到触摸位置坐标。因为我知道绘制对象的坐标,所以我检查触摸位置是否在绘制对象的范围内

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

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