2012-06-04 3 views
0

내 자신의 GestureDetector 클래스를 사용하여 왼쪽/오른쪽 onFling 이벤트를 감지하고 있습니다. 내가 본 모든 것이 제 코드에서 잘 보이지만 아무 일도 일어나지 않습니다 ...?내 SimpleOnGestureListener가 작동하지 않는 이유는 무엇입니까?

열려있는 내 토글 버튼 이외에 추가 된 기능이 필요합니다. 내 조각에서 탐색보기를 닫습니다.

public static AnimationLayout mLayout; 

    // these constants are used for onFling 
    private static final int SWIPE_MIN_DISTANCE = 120; 
    private static final int SWIPE_MAX_OFF_PATH = 250; 
    private static final int SWIPE_THRESHOLD_VELOCITY = 200; 
    private GestureDetector gestureDetector; 

@Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 

     mLayout = (AnimationLayout) findViewById(R.id.animation_layout); 
     gestureDetector = new GestureDetector(this.getApplicationContext(), new MyGestureDetector()); 
     // Set the touch listener for the main view to be our custom gesture 
     // listener 
     mLayout.setOnTouchListener(new View.OnTouchListener() { 
      public boolean onTouch(View v, MotionEvent event) { 
       if (gestureDetector.onTouchEvent(event)) { 
        return true; 
       } 
       return false; 
      } 
     }); 
    } 
     class MyGestureDetector extends SimpleOnGestureListener { 
     @Override 
     public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) { 

      if (Math.abs(e1.getY() - e2.getY()) > SWIPE_MAX_OFF_PATH) { 
       return false; 
      } 
      // right to left swipe 
      if (e1.getX() - e2.getX() > SWIPE_MIN_DISTANCE && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) { 
       Toast.makeText(getApplicationContext(), "right_left", Toast.LENGTH_LONG).show(); 
       Log.i("MyGestureDetector", "R2L!"); 
       mLayout.closeSidebar(); 
       // left to right swipe 
      } else if (e2.getX() - e1.getX() > SWIPE_MIN_DISTANCE && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) { 
       Toast.makeText(getApplicationContext(), "left_right", Toast.LENGTH_LONG).show(); 
       Log.i("MyGestureDetector", "L2R!"); 
       mLayout.openSidebar(); 
      } 

      return false; 
     } 

     // Return true from onDown for the onFling event to register 
     @Override 
     public boolean onDown(MotionEvent e) { 
      return true; 
     } 
    } 
:

public void toggleSidebar() 
{ 
if (mContent.getAnimation() != null) 
{ 
return; 
} 

if (mOpened) 
{ 
/* opened, make close animation */ 
mAnimation = new TranslateAnimation(0, -mSidebarWidth, 0, 0); 
mAnimation.setAnimationListener(mCloseListener); 
} else 
{ 
/* not opened, make open animation */ 
mAnimation = new TranslateAnimation(0, mSidebarWidth, 0, 0); 
mAnimation.setAnimationListener(mOpenListener); 
} 
mAnimation.setDuration(DURATION); 
mAnimation.setFillAfter(true); 
mAnimation.setFillEnabled(true); 
mContent.startAnimation(mAnimation); 
} 

내 주요 활동 onFling (내
public void openSidebar() 
    { 
    if (!mOpened) 
    { 
    toggleSidebar(); 
    } 
    } 

    public void closeSidebar() 
    { 
    if (mOpened) 
    { 
    toggleSidebar(); 
    } 
    } 

가) 토글 부에 전화 ... 다음과 같이 토글 내 AnimationLayout 클래스의 메서드에 호출

이 버튼은 정상적으로 작동합니다.

... 
case R.id.navToggleBtn : { 
       mLayout.toggleSidebar(); 
      } 
... 
+1

'TouchListener'가 전달할 모든 이벤트를 수신하고 있는지 확인할 수 있습니까? 레이아웃에 터치 가능한 어린이가 포함되어있는 경우 부모 (레이아웃)에서 이벤트를 훔칠 수 있습니다. – Devunwired

+0

당신이 맞을 것 같아요. 함수를 자식 레이아웃에 배치하고 보겠습니다. – CelticParser

답변

0

내가 @Devunwired에 신용을 제공하려고 OntouchListener 하나를 구현 한 통해 UR 코드에서 onFling 해당 조건에 만족하지에 그 제스처 일이라고 생각 :

레이아웃에 터치 가능한 자식이 포함되어있는 경우 이 부모 (레이아웃)에서 이벤트를 훔칠 수 있습니다.

그래서 나는 추가 : 이제 멋지고 작동

View swipeView = (View) findViewById(R.id.animation_layout_content); 
swipeView .setOnTouchListener(new View.OnTouchListener() {...}); 

합니다.

+1

또 다른 것은'onInterceptTouchEvent()'를 볼 수 있습니다.이 메소드는'ViewGroups'가 스 와이프와 같이 제스처를 처리해야 할 때 자녀들과 접촉 할 수있게하는 메소드입니다. – Devunwired

1

나는 이유 중 하나는 내가 그 위의 제안이

yourView.setOnTouchListner(onThumbTouch); 




    OnTouchListener onThumbTouch = new OnTouchListener() 
     { 
      float previouspoint = 0 ; 
      float startPoint=0; 
      @Override 
      public boolean onTouch(View v, MotionEvent event) 
      { 
       switch(v.getId()) 
       { 
       case R.id.tvDetailsalaujairiyat: // Give your R.id.sample ... 
       { 
        switch(event.getAction()) 
        { 
        case MotionEvent.ACTION_DOWN: 
        {   
         startPoint=event.getX(); 
         System.out.println("Action down,..."+event.getX()); 
        } 
        break; 
        case MotionEvent.ACTION_MOVE: 
        {  

        }break; 
        case MotionEvent.ACTION_CANCEL: 
        {       

         previouspoint=event.getX(); 
         if(previouspoint > startPoint){ 
          //Right side swape 

         }else{ 
         // Left side swape 
         } 

        }break; 

        } 
        break; 
       } 
       } 
       return true; 
      } 
     };