缩放 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;
}
我需要单击 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;
}