2017-01-20 195 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; 

}