2012-04-04 114 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方法永远不会被调用。

任何想法,为什么这不起作用?

谢谢。

问候。

V.

回答

6

在您的SimpleOnGestureListener中,重写onDown以注册您的手势。它可以只返回true,但它必须是这样定义..

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

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

+0

谢谢,这个作品! – Manitoba 2012-04-04 09:43:30

+0

哦,男人,我差不多两个小时都遇到同样的问题,+1谢谢你的客观性 – 2013-05-01 13:45:42

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之间滑动。使用FragmentsViewPager对您的用户来说更容易和更顺畅。