在这个特定问题上我能找到的最好的(虽然我不使用画廊):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/) 和开发 Android (http://developingandroid.blogspot.com/2009/09/implementing-swipe-gesture.html) 上的“基本手势检测”,但我不使用我的应用程序中的 ViewFlipper。当发生 throw 时,我只需更改标签(在末端环绕)。
现在,我的一些选项卡包含 ScrollViews。这些 ScrollViews 显然响应向上/向下滚动,以便让您查看其中的所有数据,这并不奇怪。 问题是这些 ScrollViews 的“滚动”功能会覆盖我的 throw 手势。我不能在 ScrollView 内翻滚(滚动就好),但它在它们之外完美地工作(在同一个选项卡上,在 TableRow 等其他 View 上)。
我快速浏览了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 的文档:
"Called when a touch screen event was not handled by any of the views under it. This is most useful to process touch events that happen outside of your window bounds, where there is no view to receive it."
所以 ScrollView 确实“覆盖”了它 - 我该怎么办?有没有办法确保两者都被检查? ScrollView 处理 onTouchEvent 时未命中的我的 onTouchEvent:
@Override
/** Used for swipe gestures */
public boolean onTouchEvent(MotionEvent event) {
if (gestureDetector.onTouchEvent(event))
return true;
else
return false;
}
下面是更通用的源代码,它可能不是很重要。我的 Tabs 类中的手势检测器及其关联的监听器:
// 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;
}
};
我的手势类是我的 Tabs 类的嵌套类(它扩展了 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;
}
}
最佳答案
我建议您查看 Google I/O 2010 应用程序源代码,因为他们的 FlingableTabHost
实现似乎已经解决了这个问题:
http://iosched.googlecode.com/svn/trunk/src/com/google/android/apps/iosched/ui/ScheduleActivity.java
我认为关键在于扩展 TabHost
并覆盖它的 onInterceptTouchEvent
方法。
关于android - 与 ScrollView 一起滑动/翻转选项卡更改?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5102993/