2010-07-13 3 views
5

Android에서 게임을 만들고있어 사용자가 화면을 길게 누르려고 할 때 특정 작업을 수행해야합니다. 불행히도 사용자 지정 SurfaceView와 직접 작동하는 메서드를 찾지 못했습니다. 그런 메서드가 있는지 알려주시겠습니까? :)화면에서 길게 터치 (안드로이드)

그래서 나는 onTouch 이벤트 수신기에서 장시간 터치 감지를 구현하기로 결정했습니다.

여기 내 코드입니다 :

@Override 
    public boolean onTouch(View v, MotionEvent event) 
    { 
     long touchDuration = 0; 


      if (event.getAction() == MotionEvent.ACTION_DOWN) 
      { 
       //Start timer 
       touchTime = System.currentTimeMillis(); 


      }else if (event.getAction() == MotionEvent.ACTION_UP) 
      { 
       //stop timer 
       touchDuration = System.currentTimeMillis() - touchTime; 

       if (touchDuration < 800) 
       { 
        onShortTouch(event,touchDuration); 
       }else 
       { 
        onLongTouch(event,touchDuration); 
       } 
      } 
     } 

     return true; 

이 작동하지만, 언론이 길게 누르면 않았거나하지 않을 경우 사용자가 전화 접촉을 중지하는 경우에만 나는 감지 할 수 있습니다. 그래서 내가 원하는 것만은 아닙니다. 사용자가 처음 화면을 터치 할 때 타이머가 시작되고 800 밀리 초가 지나면 LongTouch() 메서드가 호출되는 것을 선호합니다. 다시 말해 ACTION_DOWN 이후 ACTION_UP이 경과 한 시간을 확인하지 않아도됩니다. 내가 말한 타이머에 대한 스레드를 사용해야한다고 생각하지만 그것을 작동하게 만들 수 없습니다. 다음 코드를 사용하면 화면을 터치하자마자 디버그 메시지가 표시됩니다.

 @Override 
    public boolean onTouch(View v, MotionEvent event) 
    { 
     long touchDuration = 0; 

      TouchThread touchThread = new TouchThread(); 

      if (event.getAction() == MotionEvent.ACTION_DOWN) 
      { 
       //Start timer 
       touchTime = System.currentTimeMillis(); 
       touchThread.setEvent(event); 
       touchThread.run(); 
      } 

     return true; 
    } 


    private class TouchThread extends Thread 
    { 

      public MotionEvent event = null; 

      public void setEvent(MotionEvent e) 
      { 
       event = e; 
      } 

      @Override 
      public void run() 
      { 
       long startTime = System.currentTimeMillis(); 
       long time = 0; 

       while(event.getAction() == MotionEvent.ACTION_DOWN) 
       { 
        time = System.currentTimeMillis() - startTime; 
        if(time > 800) 
        { 
         System.out.println("LOOONG CLICK!!"); 
         return; 
        } 
       } 
      } 
    } 

누구 아이디어가 있습니까? 다른 해결책도 환영합니다.

감사합니다. , http://developer.android.com/reference/android/view/GestureDetector.html

내가 생성자에 GestureDetector 인스턴스를 만드는 것입니다 사용 방법, 내가 관심이 방법을 구현 :

답변

3

당신은 또한 몇 가지 수동 이벤트 처리를하고 싶은 좋은 옵션은 GestureDetector 클래스입니다 제스처는 터치 처리의 나머지를 중단이 감지되면 다음 대부분의 경우에 의미

if (gestureDetector.onTouchEvent(event)) { 
     return true; 
    } 

: 다음 onTouchEvent() 메소드의 시작 부분에서 그런 짓을. 그러나 긴 누름 방법은 값을 반환하지 않기 때문에 길게 누름이 약간 다릅니다. 이 경우에는 필자는 필요하다면 나중에 긴급 버튼을 눌러서 터치 이벤트 처리 방법을 확인할 때 설정 한 부울을 어딘가에 가지고 있습니다.

1

SurfaceView에서 OnLongClickListener를 설정할 수 있습니다. 실제로, 그것은 아주 쉽게

public boolean onTouchEvent(MotionEvent event) { 
    super.onTouchEvent(event); 
    return true; 
} 
3

:

mySurfaceView.setOnLongClickListener(l); 

는 그런 다음 서피스 뷰 SurfaceView에, 당신은 onTouchEvent를 오버라이드 (override) 할 필요가있다.)

@Override 
    public boolean onTouchEvent(MotionEvent event) { 
     super.onTouchEvent(event); 
    } 

그리고 당신은 설정하고 :

setOnLongClickListener(new View.OnLongClickListener() 
{ 
    public boolean onLongClick(View v) { 
     Log.v("debug", "LONG CLICK!"); 
     return true; 
    } 
    } 
); 

그런 다음 onTouchEvent를 오버라이드 (override) :보기의 생성자에서이 작업을 수행.

관련 문제