2017-01-20 6 views
0

Мне нужно щелкнуть по определенному элементу на холсте, в то время как масштабирование и перемещение функций также позволяют использовать холст. Я могу вычислить положение прямоугольника при перемещении холста. Там я просто вычислил расстояние движения касания (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; 

Это может определить новое положение холста прямоугольника. Это прекрасно работает. Я могу идентифицировать событие касания конкретного элемента при перемещении холста по этой логике. Но теперь мне нужно вычислить положение прямоугольника относительно холста, после увеличения холста. Каковы математики за масштабированием. Если кто-нибудь знает, пожалуйста, помогите в этом. Спасибо.

ответ

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; 

}

Смежные вопросы