2010-03-29 7 views
11

내 수업은 View를 확장하고 계속 터치 이벤트를 가져와야합니다.지속적인 터치 이벤트를 얻는 방법?

내가 사용하는 경우 :

public boolean onTouchEvent(MotionEvent me) { 

    if(me.getAction()==MotionEvent.ACTION_DOWN) { 
     myAction(); 
    } 
    return true; 
} 

이 ... 터치 이벤트는 한 번 캡처됩니다.

손가락을 움직이지 않고 계속 닿을 필요가 있다면 어떻게해야합니까? 제발, 스레드 나 타이머를 사용할 필요가 없다고 말해주세요. 내 앱이 너무 무거워.

감사합니다.

답변

15

if(me.getAction() == MotionEvent.ACTION_MOVE)을 사용하십시오. 손가락을 100 % 완전하게 화면에 유지하는 것은 불가능하므로 손가락이 움직일 때마다 Action_Move가 호출됩니다. 단 1 픽셀 또는 2 픽셀 인 경우에도 호출됩니다.

me.getAction() == MotionEvent.ACTION_UP도들을 수 있습니다. 그렇게 될 때까지 사용자는 계속 손가락을 화면에 올려야합니다.

+2

수정, 나는 ACTION_DOWN에 플래그를 설정하고 플래그가 설정 될 때까지 것을 사용하는 솔루션을 선호 ACTION_UP에 거짓으로 – WarrenFaith

+0

정말로 감사합니다. – daliz

+0

나는 이것이 모든 곳에서 언급되는 것을 본다. 그러나 그것은 나에게 어울리지 않는 것처럼 보인다. 계속 누르고 있으면 계속 ACTION_MOVE 이벤트가 발생하지 않습니다. ACTION_MOVE는 내 손가락을 한쪽이나 다른쪽으로 기울이면 트리거되는 것 같습니다. 전화를 덜 민감하게 유지하는 설정 일 수 있습니까? – clusterflux

3

Her은 continue 터치 이벤트를 처리하는 방법을 보여주는 간단한 코드 스 니펫입니다. 장치를 누르고 터치를 잡고 파인더를 움직이면 터치 이동 동작이 수행됩니다.

@Override 
public boolean onTouchEvent(MotionEvent event) { 
    float x = event.getX(); 
    float y = event.getY(); 
    if(isTsunami){ 
    switch (event.getAction()) { 
     case MotionEvent.ACTION_DOWN: 
      // Write your code to perform an action on down 
      break; 
     case MotionEvent.ACTION_MOVE: 
      // Write your code to perform an action on contineus touch move 
      break; 
     case MotionEvent.ACTION_UP: 
      // Write your code to perform an action on touch up 
      break; 
    } 
    } 
    return true; 
} 
1

시도해보십시오. 그것은 나에게 맞는 것입니다 :

public static OnTouchListener loadContainerOnTouchListener() { 
    OnTouchListener listener = new OnTouchListener(){ 
    @Override 
    public boolean onTouch(View v, MotionEvent event) { 
     LinearLayout layout = (LinearLayout)v; 
     for(int i =0; i< layout.getChildCount(); i++) 
     { 
      View view = layout.getChildAt(i); 
      Rect outRect = new Rect(view.getLeft(), view.getTop(), view.getRight(), view.getBottom()); 
      if(outRect.contains((int)event.getX(), (int)event.getY())) 
      { 
       Log.d(this.getClass().getName(), String.format("Over view.id[%d]", view.getId())); 
      } 
     } 

    } 

기억 : 당신이 설정하는 수신기는 그리드, 상대, 선형이어야합니다. , 아니라면 클릭 = "true"를 바로 아래 조치를 생산 : = 포커스 "true"로 안드로이드 :

LinearLayout layout = findViewById(R.id.yourlayoutid); 
layout.setOnTouchListener(HelperClass.loadContainerOnTouchListener()); 
5

당신은 요소 안드로이드이 속성을 설정해야합니다.

0

엄지 컨트롤로 사용되는 사용자 지정보기로 게임을 만들고있었습니다. . . 여기에 내가

float x = 0, y = 0; 

@Override 
public boolean onTouchEvent(MotionEvent event) { 
    x = event.getX(); 
    y = event.getY(); 

    // handle touch events with 
    switch(event.getActionMasked()) { 
     case MotionEvent.ACTION_DOWN : 
      if(cont) 
      { 
       // remove any previous callbacks 
       removeCallbacks(contin); 

       // post new runnable 
       postDelayed(contin, 10); 
      } 
      invalidate(); 
      return true; 
     case MotionEvent.ACTION_MOVE : 
      if(!cont && thumbing != null) 
      { 
       // do non-continuous operations here 
      } 
      invalidate();  
      return true; 
     case MotionEvent.ACTION_UP : 

      // set runnable condition to false 
      x = 0; 

      // remove the callbacks to the thread 
      removeCallbacks(contin); 
      invalidate(); 
      return true; 
     default : 
      return super.onTouchEvent(event); 
    } 
} 

public boolean cont = false; 

// sets input to continuous 
public void set_continuous(boolean b) { cont = b; } 


public Runnable contin = new Runnable() 
{ 

    @Override 
    public void run() { 
     if(x != 0) 
     { 
      // do continuous operations here 
      postDelayed(this, 10); 
     } 
    } 

}; 

빠른 메모 그러나,이보기를 호출하여 주요 활동에 확인을 무슨 짓을 일시 정지하는 경우

@Override 
protected void onPause() { 
    if(left.cont) left.removeCallbacks(left.contin); 
    if(right.cont) right.removeCallbacks(left.contin); 
    super.onPause(); 
} 

그 방법을 다음과 같이 onPause 방법을 통해 수동으로 콜백을 제거 돌아온 터치 이벤트는 두 번 처리되지 않으며 뷰는 스레드의 오버 헤드로부터 자유 롭습니다.

** **

0

이 모든 대답에 하드웨어 가속과 삼성 갤럭시 S3 테스트는 부분적으로 정확하지만 그들은 문제를 올바른 방법으로 해결되지 않습니다.

우선 이벤트가 ACTION_MOVE 일 때 추적하기로 결정한 모든 사람에게. 글쎄 그게 언제쯤 일하는거야? 사용자가 손가락을 움직일 때, 사용자 정의 엄지 손가락 컨트롤을 구현하기로 결정했다면 괜찮을 수 있지만, 그렇지 않은 일반 사용자 정의 버튼의 경우에는 그렇게 할 수 있습니다.

둘째, ACTION_UP에서 그것을 ACTION_DOWN 내부 플래그를 사용하고 확인하는 것은 그것을 할 수있는 로직 방법을 보이지만, 당신은 당신이 문제에 붙어 받아보기 while(!up_flag) 로직을 구현하는 경우 Clusterfux로 찾아)

따라서 적절한 방법 어떻게 여기에 언급되어

Continuous "Action_DOWN" in Android

그냥 당신이 연속 눌러 동안 쓸거야 논리가 어떤 방식으로 UI를 수정하는 경우, 당신은에서 할 필요가 있음을 염두에 두어야 다른 모든 경우의 주 스레드는 다른 스레드를 사용하는 것이 더 좋습니다. 이 같은이 도움이 될

0

, 부모 뷰에

requestDisallowInterceptTouchEvent(true); 

-

 @Override 
     public boolean onTouch(View view, MotionEvent motionEvent) { 
      view.getParent().requestDisallowInterceptTouchEvent(true); 
      switch(motionEvent.getActio){ 
      } 

      return false; 

     } 
관련 문제