2012-09-06 3 views
3

그래서 화면을 터치 할 때 손가락을 움직이는 방향을 감지하고 싶습니다. 현재 3 방향으로 작동하지만 "위로"움직임이 호출되지 않습니다.모션 이벤트에 손가락이 끼어있는 방향을 확인하십시오. 안드로이드

@Override 
public boolean onTouchEvent(MotionEvent event) { 

switch (event.getAction()) { 
case MotionEvent.ACTION_DOWN: { 
    // store the X value when the user's finger was pressed down 
    downXValue = event.getX(); 
    downYValue = event.getY(); 
    break; 
} 

case MotionEvent.ACTION_UP: { 
    // Get the X value when the user released his/her finger 
    float currentX = event.getX(); 
    float currentY = event.getY(); 
     //check if horizontal or vertical movement was bigger 
    if (Math.abs(downXValue - currentX) > Math.abs(downYValue) 
     - currentY) { 
    Log.e("motionevent", "x"); 
    // going backwards: pushing stuff to the right 
    if (downXValue < currentX) { 
     Log.e("motionevent", "right"); 

    } 

    // going forwards: pushing stuff to the left 
    if (downXValue > currentX) { 
     Log.e("motionevent", "left"); 

    } 

    } else { 
    Log.e("motionevent", "y"); 
    if (downYValue < currentY) { 
     Log.e("motionevent", "up"); 

    } 
    if (downYValue > currentY) { 
     Log.e("motionevent", "down"); 

    } 
    } 
    break; 
} 
} 

    return true; 
} 

수평과 수직 이동 확인에 문제가 있습니다 :

이 내 코드? 왜냐하면 내가 위로 움직임을 할 때마다 오른쪽이나 왼쪽이 호출되기 때문입니다. 아래로 잘 작동합니다.

답변

16

운동 계산에 오류가 있습니다. 나는 그것을 고쳤다, 그 ok 지금.

switch (event.getAction()) { 

       case MotionEvent.ACTION_DOWN: { 
        // store the X value when the user's finger was pressed down 
        downXValue = event.getX(); 
        downYValue = event.getY(); 
        Log.v("", "= " + downYValue); 
        break; 
       } 

       case MotionEvent.ACTION_UP: { 
        // Get the X value when the user released his/her finger 
        float currentX = event.getX(); 
        float currentY = event.getY(); 
        // check if horizontal or vertical movement was bigger 

        if (Math.abs(downXValue - currentX) > Math.abs(downYValue 
          - currentY)) { 
         Log.v("", "x"); 
         // going backwards: pushing stuff to the right 
         if (downXValue < currentX) { 
          Log.v("", "right"); 

         } 

         // going forwards: pushing stuff to the left 
         if (downXValue > currentX) { 
          Log.v("", "left"); 

         } 

        } else { 
         Log.v("", "y "); 

         if (downYValue < currentY) { 
          Log.v("", "down"); 

         } 
         if (downYValue > currentY) { 
          Log.v("", "up"); 

         } 
        } 
        break; 
       } 

      } 
+0

위와 같이 정답을 찾아 주시면 오른쪽에 표시하십시오. –

+0

예'if (Math.abs (downXValue - currentX)> Math.abs (downYValue) -currentY)'줄에 잘못 붙인 대괄호가 있습니다. –

3

당신은 터치 이벤트를 감지하는 여러 가지 방법을 제공합니다 GestureDetector.OnGestureListener 인터페이스를 사용할 수 있습니다 등을 스크롤, 별거를

사용법 : 지금부터

@Override 
public boolean onTouchEvent(MotionEvent event) { 
    if (detector == null) { 
     detector = new GestureDetector(this); 
    } 
    return detector.onTouchEvent(event); 
} 

모든 이벤트가 인식하고 지정된 메서드에 전달됩니다.

+0

나는 작은 것을 요구한다. 나는 정말로 gesturedetector를 사용하고 싶지 않았다. (정말 혼란 스러웠다.) 내 코드는 감지하기 위해 작동합니다. 단지 논리적 인 문제가있는 것 같아서 motionevent가 작동하지 않습니다. 그리고 제 생각으로는 제스처 감지기를 사용해도 ID는 여전히 그의 플립 방식이 어떤 방향인지 확인해야합니다. –

+0

몇 가지 방법은 어떻습니까? slope = tangent of (y2 - y1)/(x2 - x1) –