11

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

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

事件流程如下:

  1. 观点onTouchEvent
  2. OnGestureListener's onDown
  3. OnGestureListener's onShowPress
  4. OnGestureListener's onLongPress

我不知道如何继续尝试调试类似的东西,而谷歌搜索并没有出现太多。任何指针?

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

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);
    }
}
4

1 回答 1

2

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

于 2009-12-16T14:25:09.550 回答