2012-04-04 3 views
4

Я пытаюсь внедрить жестов в моем приложении. Я сделал почти весь код, но он не работает.Android - проблема с саблейным жестом

Вот код, у меня есть в моей деятельности:

// Swipe detector 
gestureDetector = new GestureDetector(new SwipeGesture(this)); 
gestureListener = new OnTouchListener() { 
    public boolean onTouch(View v, MotionEvent event) 
    { 
     Log.e("", "It works"); 
     return gestureDetector.onTouchEvent(event); 
    } 
}; 

LinearLayout root = (LinearLayout) findViewById(R.id.rules_root); 
root.setOnTouchListener(gestureListener); 

Когда я прикасаюсь к экрану, то LogCat отображает it works.

Вот он мой код класса SwipeGesture:

public class SwipeGesture extends SimpleOnGestureListener 
{ 
    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 Activity activity; 

    public SwipeGesture(Activity activity) 
    { 
     super(); 
     this.activity = activity; 
    } 

    @Override 
    public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) 
    { 
     Log.e("", "Here I am"); 
     try 
     { 
      if (Math.abs(e1.getY() - e2.getY()) > SWIPE_MAX_OFF_PATH) return false; 
      if(e1.getX() - e2.getX() > SWIPE_MIN_DISTANCE && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) 
      { 
       if (((TabActivity) activity.getParent()).getTabHost() != null) 
       { 
        TabHost th = ((TabActivity) activity.getParent()).getTabHost(); 
        th.setCurrentTab(th.getCurrentTab() - 1); 
       } 
       else 
       { 
        activity.finish(); 
       } 
       Log.e("", "Swipe left"); 
      } 
      else if (e2.getX() - e1.getX() > SWIPE_MIN_DISTANCE && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) 
      { 
       if (((TabActivity) activity.getParent()).getTabHost() != null) 
       { 
        TabHost th = ((TabActivity) activity.getParent()).getTabHost(); 
        th.setCurrentTab(th.getCurrentTab() + 1); 
       } 
       Log.e("", "Swipe right"); 
      } 
     } 
     catch (Exception e) 
     { 
      e.printStackTrace(); 
     } 
     return false; 
    } 
} 

Log.e("", "Here I am"); Линия никогда не отображается. Поэтому я полагаю, что метод onFling никогда не называется.

Любые идеи, почему это не работает?

Спасибо.

С уважением.

В.

ответ

6

В вашем SimpleOnGestureListener переопределите onDown, чтобы ваши жесты регистрировались. Он может просто вернуться верно, но это должно быть определено, как это ..

@Override 
    public boolean onDown(MotionEvent e) { 
      return true; 
    } 

.... See this link.. and the comment below the answer..

+0

Спасибо, это работает! – Manitoba

+0

Ohhh man, я был почти два часа с этой же проблемой, +1 спасибо за объективность –

5

Вам нужно изменить пару вещей, вот пример.

Установите OnTouchListener:

root.setOnTouchListener(new View.OnTouchListener() { 
      public boolean onTouch(View v, MotionEvent event) { 
       if (gestureDetector.onTouchEvent(event)) { 
        return false; 
       } 
       return false; 
      } 
     }); 

SwipeGesture класса:

class SwipeGesture extends SimpleOnGestureListener { 
    @Override 
    public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, 
      float velocityY) { 

     try { 
      if (Math.abs(e1.getY() - e2.getY()) > SWIPE_MAX_OFF_PATH) 
       return false; 
      if (e1.getX() - e2.getX() > SWIPE_MIN_DISTANCE 
        && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) { 
//Do something 

       return true; 
      } else if (e2.getX() - e1.getX() > SWIPE_MIN_DISTANCE 
        && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) { 
//Do something 
       return true; 

      } 

     } catch (Exception e) { 
      Log.e("Fling", "There was an error processing the Fling event:" 
        + e.getMessage()); 
     } 
     return true; 
    } 

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

Похоже, вы ударяя между Tabs. Использование Fragments и ViewPager намного проще и гладко для ваших пользователей.

Смежные вопросы