带按钮的自定义视图实现了OnGestureListener

在过去的几个小时里,我一直在打破我的头脑,用Google搜索谷歌,而StackOverflow或其他地方的例子都没有为我工作,所以在这里……

我有一个自定义视图,它extends LinearLayout and implements GestureDetector.OnGestureListener

在我的自定义布局中,我有3个按钮,每个按钮都有一个点击监听器。 我想要的是能够在视图中随处运行以执行某些操作,但也能够单击按钮。

如果我在视图内部而不是通过其中一个按钮,我的onFlingfunction非常有用。 如果我扔过其中一个按钮,它会在大多数情况下执行单击,或者在某些情况下执行任何操作。

这是我的代码的相关部分:

 @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) { viewFlipper.setInAnimation(slideLeftIn); viewFlipper.setOutAnimation(slideLeftOut); viewFlipper.showNext(); return true; } else if (e2.getX() - e1.getX() > SWIPE_MIN_DISTANCE && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) { viewFlipper.setInAnimation(slideRightIn); viewFlipper.setOutAnimation(slideRightOut); viewFlipper.showPrevious(); return true; } return false; } @Override public boolean onDown(MotionEvent e) { // TODO Auto-generated method stub return true; } @Override public void onLongPress(MotionEvent e) { // TODO Auto-generated method stub } @Override public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) { // TODO Auto-generated method stub return false; } @Override public void onShowPress(MotionEvent e) { // TODO Auto-generated method stub } @Override public boolean onSingleTapUp(MotionEvent e) { // TODO Auto-generated method stub return false; } @Override public boolean onTouchEvent(MotionEvent event) { if (gestureDetector.onTouchEvent(event)) { return gestureDetector.onTouchEvent(event); } return false; } 

尝试任何返回true的组合; 返回虚假; 我能想到…会感激任何帮助! 🙂

谢谢!

这是最终为我解决的问题……(只有我问题中修改过的代码)。 不确定它是否是最佳解决方案,但它有效:

 @Override public boolean onDown(MotionEvent e) { // TODO Auto-generated method stub return false; } @Override public boolean onTouchEvent(MotionEvent e) { return gestureDetector.onTouchEvent(e); } @Override public boolean onInterceptTouchEvent(MotionEvent e) { return onTouchEvent(e); } 

这将允许popup手势,甚至在按钮上也允许简单地单击按钮如果您在此视图后面有另一个带按钮的视图,有时点击将向后传递并执行视图后面的onClick on按钮。 解决方案是将"android:clickable="true"到前视图的根布局(LinearLayout,FrameLayout或其他)。

这是一个可能与您描述的情况相关的答案https://stackoverflow.com/a/9182176/780700

也许你可以使用SurfaceView设置一个叠加层来处理所有的flings: http : //developer.android.com/reference/android/view/SurfaceView.html

使用SurfaceView在顶部,您的按钮仍然可以正常工作,您的flings应该可以毫无问题地克服按钮。