4

스 와이프 제스처에 응답하기 위해 선형 레이아웃에 터치 이벤트를 추가하여 잘 작동합니다. 그러나 레이아웃에 버튼을 추가하면 상위 라이너 레이아웃이 무시됩니다. 어떻게 이런 일이 일어나지 않도록해야합니까?버튼으로 채워진 라이너 레이아웃을위한 터치 리스너 추가

LinearLayout ln2 = (LinearLayout) findViewById(R.id.fr2); 
ln2.setOnTouchListener(swipe); 

onInterceptTouch은 어떻게 사용합니까?

답변

10

레이아웃을 직접 만들고 레이아웃의 onInterceptTouchEvent (MotionEvent ev) 메서드를 재정의해야합니다. onInterceptTouchEvent는 항상 true를 반환의 때문에 예를 들어

내가

 @Override 
     public boolean onInterceptTouchEvent(MotionEvent ev) { 
     return true; // With this i tell my layout to consume all the touch events from its childs 
     } 

    @Override 
    public boolean onTouchEvent(MotionEvent event) { 
     switch (event.getAction()) { 
     case MotionEvent.ACTION_DOWN: 
     // Log.d(TAG, String.format("ACTION_DOWN | x:%s y:%s", 
      break; 
     case MotionEvent.ACTION_MOVE: 
     //Log.d(TAG, String.format("ACTION_MOVE | x:%s y:%s", 
      break; 
     case MotionEvent.ACTION_UP: 
      break; 
     } 
     return true; 
    } 

을 RelativeLayout의 확장 내 자신의 레이아웃을 생성 그리고 난 내 레이아웃에 버튼을 둘 때, 심지어 난 그 버튼을 클릭, 내 레이아웃은 모든 touchEvent 소비 . onclick을 = "tapEvent를"당신이 클릭을하려는 레이아웃 :

희망이 당신이

+0

감사합니다. 시도해 보겠습니다. –

+0

코드에서 onInterceptTouchEvent를 재정의하는 방법을 알지 못했습니다. 모든 버튼 또는 부모 레이아웃에 대해이 작업을 수행해야합니까? –

+0

부모 레이아웃 용으로 만 사용해야합니다. 30 분 정도 기다려야 만 내 대답을 편집 할 수 있습니다. 지금 당장 출근해야합니다 –

0

안드로이드를 추가 도움이 될 것입니다. MAX_TAP_COUNT 값을 변경하면 원하는만큼의 탭을 사용할 수 있습니다.

private long thisTime = 0; 
private long prevTime = 0; 
private int tapCount = 0; 
private static final int MAX_TAP_COUNT = 5; 
protected static final long DOUBLE_CLICK_MAX_DELAY = 500; 


public void tapEvent(View v){ 

     if (SystemClock.uptimeMillis() > thisTime) { 
      if ((SystemClock.uptimeMillis() - thisTime) > DOUBLE_CLICK_MAX_DELAY * MAX_TAP_COUNT) { 
       Log.d(TAG, "touch event " + "resetting tapCount = 0"); 
       tapCount = 0; 
      } 
      if (tapCount()) { 
       //DO YOUR LOGIC HERE 
      } 
     } 

} 

private Boolean tapCount(){ 

     if (tapCount == 0) { 
      thisTime = SystemClock.uptimeMillis(); 
      tapCount++; 
     } else if (tapCount < (MAX_TAP_COUNT-1)) { 
      tapCount++; 
     } else { 
      prevTime = thisTime; 
      thisTime = SystemClock.uptimeMillis(); 

      //just incase system clock reset to zero 
      if (thisTime > prevTime) { 

       //Check if times are within our max delay 
       if ((thisTime - prevTime) <= DOUBLE_CLICK_MAX_DELAY * MAX_TAP_COUNT) { 
        //We have detected a multiple continuous tap! 
        //Once receive multiple tap, reset tap count to zero for consider next tap as new start 
        tapCount = 0; 
        return true; 
       } else { 
        //Otherwise Reset tapCount 
        tapCount = 0; 
       } 
      } else { 
       tapCount = 0; 
      } 
     } 
     return false; 

}