我在这个问题上找到的最佳答案(尽管我并没有使用画廊):ScrollView and Gallery interfering - 虽然并没有给出具体的答案。我的实现显然没有使用画廊。
跳到下一个粗体部分以获取有趣的内容。
所以我一段时间前在我的应用程序上使Fling/Swipe/Flick或您想称之为的东西正常工作了。灵感来自于多个地方,其中一些是 Stack Overflow 上的“基本手势检测”(Fling gesture detection on grid layout)、Code Shogun(http://www.codeshogun.com/blog/2009/04/16/how-to-implement-swipe-action-in-android/)和 Developing Android(http://developingandroid.blogspot.com/2009/09/implementing-swipe-gesture.html),但是我没有在我的应用程序中使用 ViewFlipper。当发生 Fling 时,我只是更改选项卡(在两端环绕)。
现在,我的一些选项卡包含 ScrollView。这些 ScrollView 显然会响应上/下滚动以让您查看其中的所有数据,这并不奇怪。 问题在于,似乎这些 ScrollView 的“滚动”功能覆盖了我的 Fling 手势。我无法在 ScrollView 内部进行 Fling(滚动很好),但在外部它可以完美地工作(在同一选项卡中,在其他视图上,比如 TableRow 或任何其他视图)。
我也快速查看了http://blog.velir.com/index.php/2010/11/17/android-snapping-horizontal-scroll/,它提供了一种实现 HorizontalScrollView 的方法。但是它仍然通过扩展 SimpleOnGestureListener (并覆盖 onFling)处理手势,这与我的实现相同(这使我相信它并不能真正帮助解决问题)。来自 Google 的 ScrollView 源代码:http://google.com/codesearch/p?hl=en#uX1GffpyOZk/core/java/android/widget/ScrollView.java&d=3 有没有办法让我实现 Swipe 和 ScrollView 一起轻松工作呢?
我想问题就出在这里。ScrollView.java 也使用一个名为 onTouchEvent 的方法,Activity 的 onTouchEvent 文档则是这样的:
“调用当触摸屏事件不被它下面的任何视图处理时。这在处理发生在窗口边界之外的触摸事件时最有用,因为没有视图接收到它。“
所以 ScrollView 确实“覆盖”了它——我该怎么办?没有办法确保两者都被检查吗?我的 onTouchEvent 没有被 ScrollView 处理时会怎样?
跳到下一个粗体部分以获取有趣的内容。
所以我一段时间前在我的应用程序上使Fling/Swipe/Flick或您想称之为的东西正常工作了。灵感来自于多个地方,其中一些是 Stack Overflow 上的“基本手势检测”(Fling gesture detection on grid layout)、Code Shogun(http://www.codeshogun.com/blog/2009/04/16/how-to-implement-swipe-action-in-android/)和 Developing Android(http://developingandroid.blogspot.com/2009/09/implementing-swipe-gesture.html),但是我没有在我的应用程序中使用 ViewFlipper。当发生 Fling 时,我只是更改选项卡(在两端环绕)。
现在,我的一些选项卡包含 ScrollView。这些 ScrollView 显然会响应上/下滚动以让您查看其中的所有数据,这并不奇怪。 问题在于,似乎这些 ScrollView 的“滚动”功能覆盖了我的 Fling 手势。我无法在 ScrollView 内部进行 Fling(滚动很好),但在外部它可以完美地工作(在同一选项卡中,在其他视图上,比如 TableRow 或任何其他视图)。
我也快速查看了http://blog.velir.com/index.php/2010/11/17/android-snapping-horizontal-scroll/,它提供了一种实现 HorizontalScrollView 的方法。但是它仍然通过扩展 SimpleOnGestureListener (并覆盖 onFling)处理手势,这与我的实现相同(这使我相信它并不能真正帮助解决问题)。来自 Google 的 ScrollView 源代码:http://google.com/codesearch/p?hl=en#uX1GffpyOZk/core/java/android/widget/ScrollView.java&d=3 有没有办法让我实现 Swipe 和 ScrollView 一起轻松工作呢?
我想问题就出在这里。ScrollView.java 也使用一个名为 onTouchEvent 的方法,Activity 的 onTouchEvent 文档则是这样的:
“调用当触摸屏事件不被它下面的任何视图处理时。这在处理发生在窗口边界之外的触摸事件时最有用,因为没有视图接收到它。“
所以 ScrollView 确实“覆盖”了它——我该怎么办?没有办法确保两者都被检查吗?我的 onTouchEvent 没有被 ScrollView 处理时会怎样?
@Override
/** Used for swipe gestures */
public boolean onTouchEvent(MotionEvent event) {
if (gestureDetector.onTouchEvent(event))
return true;
else
return false;
}
下面是更一般的源代码,它可能不是非常重要。Tabs类中的gestureDetector及其相关的监听器:
// Gestures
gestureDetector = new GestureDetector(new MyGestureDetector());
gestureListener = new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
if (gestureDetector.onTouchEvent(event)) {
return true;
}
return false;
}
};
我的手势类是我的选项卡类的嵌套类(继承自TabActivity) - 它与您在此主题上找到的任何其他代码相同:
/** GestureDetector used to swipe between classes */
class MyGestureDetector extends SimpleOnGestureListener {
TabHost tabHost = getTabHost();
@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) {
// my tab code
return true;
} else if (e2.getX() - e1.getX() > SWIPE_MIN_DISTANCE && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) {
// my tab code
return true;
}
} catch (Exception e) {
Log.e("MyGestureDetector onFling", e.toString());
}
return false;
}
}