【问题标题】:Android: detecting fling gesturesAndroid:检测投掷手势
【发布时间】:2009-12-15 21:40:36
【问题描述】:

在我的应用程序中,我尝试在视图上捕获一个 fling 事件(准确地说是 ScrollView,但也尝试使用 LinearLayout)。

通过设置断点,我可以看到MotionEvents 正确发生到onFling() 应该触发的位置。

事件流程如下:

  1. 视图的onTouchEvent
  2. OnGestureListener's onDown
  3. OnGestureListener's onShowPress
  4. OnGestureListener's onLongPress

我不知道如何继续尝试调试类似的东西,而且 Google 搜索并没有出现太多。有什么指点吗?

我还附上了应该处理手势的相关视图:

import android.content.Context;
import android.content.Intent;
import android.view.GestureDetector;
import android.view.MotionEvent;
import android.widget.ScrollView;

public class GestureScrollView extends ScrollView {
    private static int MAJOR_MOVE = 60;
    private GestureDetector gd;

    public GestureScrollView(final Context context) {
        super(context);
        gd = new GestureDetector(context,
                new GestureDetector.OnGestureListener() {

                    @Override
                    public boolean onSingleTapUp(MotionEvent e) {
                        // TODO Auto-generated method stub
                        return false;
                    }

                    @Override
                    public void onShowPress(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 onLongPress(MotionEvent e) {
                        // TODO Auto-generated method stub

                    }

                    @Override
                    public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,
                            float velocityY) {
                        int dx = (int) (e2.getX() - e1.getX());
                        if (Math.abs(dx) > MAJOR_MOVE
                                && Math.abs(velocityX) > Math.abs(velocityY)) {
                            if (velocityX < 0) {
                                Intent intent = new Intent(context, Main.class);
                                context.startActivity(intent);
                            }
                        }
                        return false;
                    }

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

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        return gd.onTouchEvent(event);
    }
}

【问题讨论】:

    标签: android gesture


    【解决方案1】:

    从 Activity 中获取 MotionEvent,而不是从您的 View 中获取。当您的手势检测器基于来自 Activity 的 MotionEvent 时,您将获得 onFling 事件。因此,您必须将 onTouchEvent() 从您的 GestureScrollView 移动到您的 Activity 类。 问候!

    【讨论】:

    • 感谢您花时间回答。实际上它比那更复杂。 Android 的事件冒泡机制有点奇怪。为我解决的问题是让 onTouchEvent() 总是像这样返回 true:@Override public boolean onTouchEvent(MotionEvent event) { gd.onTouchEvent(event);返回真;并添加一个额外的方法:@Override public boolean onInterceptTouchEvent(MotionEvent ev) { return gd.onTouchEvent(ev); } 问候。
    • @javito 你不能发布正确的代码作为答案吗?这是一个没有很好记录的棘手案例
    • @javito +1 关于您解决这个问题的问题。它还帮助我从滚动视图中窃取事件
    猜你喜欢
    • 1970-01-01
    • 2012-02-29
    • 1970-01-01
    • 1970-01-01
    • 2010-12-16
    • 1970-01-01
    • 2011-09-05
    • 1970-01-01
    • 2021-03-30
    相关资源
    最近更新 更多