片段上的手势检测

我有一个Activity持有一个Fragment

 getFragmentManager().beginTransaction().add(android.R.id.content, fragment1).commit(); 

我的问题是,我如何检测手势? 我用OnTouchListener尝试,也用onInterceptTouchEvent方法。 基本上我想要检测刷卡。 我的SwipeGestureDetector看起来像这样:

 public class SwipeGestureDetector extends SimpleOnGestureListener { // ... @Override public boolean onDown(MotionEvent e) { return true; } 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) { // right to left swipe } else if (e2.getX() - e1.getX() > SWIPE_MIN_DISTANCE && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) { // left to right swipe } } catch (Exception e) { // nothing } return false; } } 

然后我注册在我的Activity

  @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // .. SwipeGestureDetector swipeDetector = new SwipeGestureDetector(); final GestureDetector detector = new GestureDetector(this, swipeDetector); findViewById(android.R.id.content).setOnTouchListener(new OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { return detector.onTouchEvent(event); } }); } 

不幸的是,没有检测到滑动手势。 我怎么能做到这一点? 请不要build议使用ViewPager ,我不能使用它。

这是我为这个问题所做的解决方法。

我不得不在我的Activity重写dispatchTouchEvent()方法。 当窗口发生触摸事件时会被调用。

 @Override public boolean dispatchTouchEvent(MotionEvent ev) { boolean handled = swipeDetector.onTouchEvent(ev); if (!handled) { return super.dispatchTouchEvent(ev); } return handled; } 

WonderCsabo的答案并不完全适合我。 我用这个代码的问题是,在我的活动里面,我有一个视图页面和一个片段,里面有几个可点击的视图。 没有任何点击或刷卡处理程序与该代码调用,所以它打破了我的东西。 显然处理是真的太经常。 所以如果(!处理)阻止寻呼机和片段接收他们的触摸事件。

所以我试着把if语句拿出来,现在看来工作起来了。 这是活动课。 它有一个查看传呼机和一个片段

 public class MyActivity extends Activity { private SectionsPagerAdapter sectionsPagerAdapter; private ViewPager viewPager; ArrayList<Class> tabsFragmentClasses = new ArrayList<Class>(); private GestureDetector gestureDetector; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.ride_detail_activity); viewPager = (ViewPager) findViewById(R.id.pager); if (savedInstanceState == null) { getFragmentManager().beginTransaction() .add(R.id.container, new MyFragment(),"MyFragment") .commit(); } gestureDetector = new GestureDetector(this,gestureListener); } GestureDetector.SimpleOnGestureListener gestureListener = new GestureDetector.SimpleOnGestureListener(){ public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) { final int SWIPE_MIN_DISTANCE = 120; final int SWIPE_MAX_OFF_PATH = 250; final int SWIPE_THRESHOLD_VELOCITY = 200; 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) { Log.i("Tag", "Right to Left"); } else if (e2.getX() - e1.getX() > SWIPE_MIN_DISTANCE && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) { Log.i("Tag", "Left to Right"); } } catch (Exception e) { // nothing } return false; } @Override public boolean onDown(MotionEvent event) { return true; } }; 

现在,如果我完成这个像Android检测通用手势文档解释我添加此代码。

 @Override public boolean onTouchEvent(MotionEvent event){ gestureDetector.onTouchEvent(event); return super.onTouchEvent(event); } 

问题是手势检测器只能在没有触摸使能的视图(比如我的视图寻呼机和button)的情况下工作。 通过使用此代码

 @Override public boolean dispatchTouchEvent(MotionEvent event){ this.gestureDetector.onTouchEvent(event); return super.dispatchTouchEvent(event); } 

然后会发生什么是片段中的视图和视图寻呼机像通常那样获得所有的触摸事件,但是我也在我的听众中得到了手势事件。