2013-12-23 3 views
0

이 코드에 무슨 문제가 있습니까? 화면을 아래에서 위로 swype 할 때 "아래"라는 텍스트를 쓰고 다른 쪽을 원하겠습니다.하지만 에뮬레이터에서는 아무 것도 변경되지 않습니다. 무엇이 문제입니까?onTouchEvent를 사용하는 방법?

public class Draw extends View{ 
int ratioX = 50; 
int ratioY = 350; 
float dx = 0; 
float dy = 0; 
int newX; 
int newY; 
String dir="Hello"; 

public Draw(Context context) { 
    super(context); 
    // TODO Auto-generated constructor stub 
} 

public boolean onTouchEvent(MotionEvent event){ 
    float touchX = 0; 
    float touchY = 0; 
    switch(event.getAction()){ 
    case MotionEvent.ACTION_DOWN: 
     touchX = event.getX(); 
     touchY = event.getY(); 
     return true; 
    case MotionEvent.ACTION_UP: 
     dx = touchX - event.getX(); 
     dy = touchY - event.getY(); 
     if(Math.abs(dy) > Math.abs(dx)){ 
      if(dy > 0){ 
       dir = "DOWN";     
      } 
      else{     
       dir = "UP";     
      } 
     } 
     else{ 
      if(dx > 0){ 
       dir = "RIGHT"; 
      } 
      else{ 
       dir = "LEFT"; 
      } 
     } 
    } 
    return true; 
} 
public void onDraw(Canvas c){ 
    //Rect myRect = new Rect(); 
    //myRect.set(ratioX,c.getHeight()/8,ratioY,c.getWidth()/8);  
    Paint p = new Paint(); 
    p.setStyle(Paint.Style.FILL); 
    p.setColor(Color.BLACK); 
    c.drawPaint(p);  
    //p.setColor(Color.WHITE); 
    //c.drawRect(myRect, p); 
    p.setColor(Color.WHITE); 
    p.setTextSize(18); 
    c.drawText(dir, 200, 360, p); 
} 

} 나는 화면을 swype 때

아무런 반응이 없습니다! 또는 다른 방법을 사용해야합니까?

+0

onTouch onDraw가 실행됩니까? 먼저 dir의 값이 무엇인지 확인한 다음 스 와이프 후 onDraw가 실행되는지 여부를 확인합니다. – AbhinavRanjan

+0

예, GestureDetector – pskink

답변

0

내용을 변경하려면 invalidate()보기가 필요합니다. 아래 스 니펫이 도움이 될 것입니다.

public boolean onTouchEvent(MotionEvent event) { 
    // Other parts of method omitted for brevity 
     case MotionEvent.ACTION_UP: 
      dx = touchX - event.getX(); 
      dy = touchY - event.getY(); 
      String newDir = dir; 
      if(Math.abs(dy) > Math.abs(dx)){ 
       if(dy > 0){ 
        newDir = "DOWN";     
       } 
       else{     
        newDir = "UP";     
       } 
      } 
      else{ 
       if(dx > 0){ 
        newDir = "RIGHT"; 
       } 
       else{ 
        newDir = "LEFT"; 
       } 
      } 

      if (newDir != dir) { 
       dir = newDir; 
       // We only want to invalidate the view when your 'dir' value has changed. 
       // onDraw() will then be triggered. 
       invalidate(); 
      } 
    } 
    return true; 
} 
+0

을 사용해야합니다. 답변이 도움이되었습니다.하지만 투표 할 수있는 등급이 충분하지 않습니다.))) Anyway Thanks) – yuraArmenian

0

당신의 onTouchEvent가 호출 될 때마다, 지역 수레 touchXtouchY 0으로 초기화됩니다.

dx = touchX - event.getX(); 
dy = touchY - event.getY(); 

if(Math.abs(dy) > Math.abs(dx)){ 
    if(dy > 0){ 
     dir = "DOWN";     
    } else {     
     dir = "UP";     
    } 
} 

dxdy 말까지이 -x되는 각각 -y :이 ACTION_UP를 처리하는 논리에서 결과를 초래한다. Math.abs()이 호출 된 후에는 화면에서 손가락이 화면보다 멀리 떨어져 있는지 테스트합니다.

초기 변수를 멤버 변수로 저장하고 ACTION_DOWN 동안 설정하십시오.

+0

죄송합니다. 코드에 표시 할 수 있습니까? ? – yuraArmenian

+0

onTouchEvent 메서드 내에서 두 개의 부동 소수점 (touchX 및 touchY)을 선언했습니다. onTouchEvent에 대한 모든 새로운 호출이 매번 다시 작성되고 0으로 초기화되는 이유를 알고 있습니까? 대신 클래스 정의의 맨 위에 변수로 선언하십시오. –

+0

아 ... 나는 너무 어리 석다))) 나는 얻었다 !!! 감사) – yuraArmenian