2017-01-20 150 views
0

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

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; 

这可以识别矩形的新画布位置。这工作完美。通过此逻辑移动画布时,我可以识别特定项目的触摸事件。 但是现在我需要在放大画布之后计算相对于画布的矩形位置。什么是变焦背后的数学。如果有人知道,请在这帮助。 谢谢。

回答

0

最后我想出了一个解决方案。

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

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

我能抽到了触摸位置坐标根据画布坐标。由于我知道绘制对象的坐标,因此我检查触摸位置是否在绘制对象的范围内。

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

}