与ScrollView一起改变?

我可以在这个特定的问题上找到最好的(虽然我不使用图库):ScrollView和Gallery干扰 - 虽然没有给出具体的答案。 显然,我的实现并不使用Gallery。

跳到下一个有趣部分的大胆部分

所以我得到了Fling / Swipe / Flick /不管你想在我的应用程序上工作一段时间。 灵感来自几个不同的地方,其中一些是Stack Overflow(网格布局上的Fling手势检测),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在我的应用程序中。 当发生投掷时,我只需更改选项卡(在末端环绕)。

现在,我的一些标签包含ScrollViews。 这些ScrollViews显然会响应上/下卷轴,以便让您查看其中的所有数据,这并不令人意外。 问题在于它会出现这些ScrollView的“滚动”功能,会覆盖我的投掷手势。 我不能在ScrollView中滚动(滚动得很好),但它在他们之外完美地工作(在同一个选项卡上,在其他视图上,如TableRow或其他)。

我也快速浏览了http://blog.velir.com/index.php/2010/11/17/android-snapping-horizo​​ntal-scroll/,它提供了一种实现Horizo​​ntalScrollView的方法。 但它仍然通过扩展SimpleOnGestureListener(并覆盖onFling)的类来处理手势,这与我的实现相同(这导致我相信它不会真正起作用)。 Google的ScrollView源代码:http://google.com/codesearch/p?hl=zh-CN#uX1GffpyOZk/core/java/android/widget/ScrollView.java&d=3

有没有办法让我的Swipe和ScrollView的实现毫不费力地一起工作?

我猜这是问题所在。 ScrollView.java也使用了一个名为onTouchEvent的方法和onTouchEvent for Activity状态的文档:

“当触摸屏事件不是由它下面的任何视图处理时调用,这对于处理发生在窗口范围之外的触摸事件非常有用,在这些事件中,没有视图可以接收它。”

所以ScrollView会“覆盖”它 - 我该怎么做? 有没有办法确保两者都被检查? 我的onTouchEvent在通过ScrollView处理onTouchEvent时未被命中:

@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;
        }
    };

我的手势类是我的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方法。


在寻求解决我遇到的类似问题时,我遇到了这样一个问题:

eventsInterceptionEnabled:当设置为true时,该属性告知叠加层一旦知道用户真的正在绘制手势,就会从其子项中窃取事件。 这在覆盖层下有可滚动视图时非常有用,可避免在用户绘制手势时滚动基础子项

在Android Dev站点上,它讨论了在布局文件的<android.gesture.GestureOverlayView> Root中使用此属性。


对于它的价值,我发现onFling方法非常不可靠。 我重写SimpleGestureDetector中的onScroll方法,并将我的onInterceptTouchEvent定义为:

@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
    //Call super first because it does some hidden motion event handling
    boolean result = super.onInterceptTouchEvent(ev);
    if (this.mGestureScanner.onTouchEvent(ev)) return true;
    return result;
}
链接地址: http://www.djcxy.com/p/16205.html

上一篇: changing in conjunction with ScrollView?

下一篇: Android: How to handle right to left swipe gestures