android - 与 ScrollView 一起滑动/翻转选项卡更改?

标签 android scrollview swipe

在这个特定问题上我能找到的最好的(虽然我不使用画廊):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/同样,它提供了一种实现 Horizo​​ntalScrollView 的方法。但它仍然通过扩展 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/

相关文章:

android - 如何在 Google Autocomplete place API 中使用代码获取所有机场名单

android - fragment 中的 ScrollView

swift - 向上或向下滚动时增加或减少 imageView 的高度

Android ScrollView 在 SeekBar 移动时重置

java - 通过滑动切换屏幕/Activity Android Java

ios - 在 UISwipeActionsConfiguration iOS 11 中更改文本和图像的颜色 - Xamarin/Swift

android - android中现有类中的java.lang.NoClassDefFoundError

android - 您是此应用的 Beta 测试员,未出现在 Google Play 商店中

android - MvxListView 不水平显示

android - 如何在android中使用fancycoverflow获取位置