Android GestureDetector不会捕获所有运动事件

Android GestureDetector不会捕获所有运动事件,android,motionevent,Android,Motionevent,我对安卓开发还很陌生。我正在尝试制作一个应用程序,从触摸屏数据中捕捉用户的刷卡行为。我遵循了Android中“检测所有支持的手势”一节中的代码示例。当我使用该应用程序时,我可以看到记录器输出对我的触摸输入响应良好。具体而言,在onScroll函数中,我有一行: Log.d(DEBUG_TAG, "onScroll: " + event1.toString() + event2.toString()); 正如预期的那样,它向我展示了连接的两个事件。这是一个ACTION_DOWN事件和一个ACTI

我对安卓开发还很陌生。我正在尝试制作一个应用程序,从触摸屏数据中捕捉用户的刷卡行为。我遵循了Android中“检测所有支持的手势”一节中的代码示例。当我使用该应用程序时,我可以看到记录器输出对我的触摸输入响应良好。具体而言,在onScroll函数中,我有一行:

Log.d(DEBUG_TAG, "onScroll: " + event1.toString() + event2.toString());
正如预期的那样,它向我展示了连接的两个事件。这是一个ACTION_DOWN事件和一个ACTION_MOVE事件,我猜它们分别代表了开始刷卡的点和最后注册的点

问题是:在所有函数中,我只是简单地将MotionEvent添加到ArrayList中,目的是捕获活动的所有事件,最后,当用户单击按钮时,我想对事件列表执行一些操作。我尝试在这一点上进行调试(即onClick),以检查ArrayList的状态,我注意到它缺少所有的ACTION\u MOVE事件,即来自onScroll的event2,记录器在前面正确显示了它

我对此感到非常困惑。我错过了什么?为什么我不能捕获记录器显示的所有事件?这是活动生命周期导致的问题吗?我的代码粘贴在下面。谢谢你的帮助

public class MainActivity extends AppCompatActivity implements
        GestureDetector.OnGestureListener,
        GestureDetector.OnDoubleTapListener {

    private static final String DEBUG_TAG = "MyGestures";
    private static final String LOG_TAG = "MyLogs";
    private GestureDetectorCompat mDetector;

    private ArrayList<MotionEvent> activityData;

    // Called when the activity is first created.
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        // Instantiate the gesture detector with the
        // application context and an implementation of
        // GestureDetector.OnGestureListener
        mDetector = new GestureDetectorCompat(this, this);
        // Set the gesture detector as the double tap
        // listener.
        mDetector.setOnDoubleTapListener(this);


        activityData = new ArrayList<>();
    }


    @Override
    protected void onDestroy() {
        super.onDestroy();
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        this.mDetector.onTouchEvent(event);
        // Be sure to call the superclass implementation
        return super.onTouchEvent(event);
    }

    @Override
    public boolean onDown(MotionEvent event) {
        Log.d(DEBUG_TAG, "onDown: " + event.toString());
        activityData.add(event);
        return true;
    }

    @Override
    public boolean onFling(MotionEvent event1, MotionEvent event2,
                           float velocityX, float velocityY) {
        Log.d(DEBUG_TAG, "onFling: " + event1.toString() + event2.toString());
        activityData.add(event1);
        activityData.add(event2);
        return true;
    }

    @Override
    public void onLongPress(MotionEvent event) {
        Log.d(DEBUG_TAG, "onLongPress: " + event.toString());
        activityData.add(event);
    }

    @Override
    public boolean onScroll(MotionEvent event1, MotionEvent event2, float distanceX, float distanceY) {
        Log.d(DEBUG_TAG, "onScroll: " + event1.toString() + event2.toString());
        activityData.add(event1);
        activityData.add(event2);
        return true;
    }

    @Override
    public void onShowPress(MotionEvent event) {
        Log.d(DEBUG_TAG, "onShowPress: " + event.toString());
        activityData.add(event);
    }

    @Override
    public boolean onSingleTapUp(MotionEvent event) {
        Log.d(DEBUG_TAG, "onSingleTapUp: " + event.toString());
        activityData.add(event);
        return true;
    }

    @Override
    public boolean onDoubleTap(MotionEvent event) {
        Log.d(DEBUG_TAG, "onDoubleTap: " + event.toString());
        activityData.add(event);
        return true;
    }

    @Override
    public boolean onDoubleTapEvent(MotionEvent event) {
        Log.d(DEBUG_TAG, "onDoubleTapEvent: " + event.toString());
        activityData.add(event);
        return true;
    }

    @Override
    public boolean onSingleTapConfirmed(MotionEvent event) {
        Log.d(DEBUG_TAG, "onSingleTapConfirmed: " + event.toString());
        activityData.add(event);
        return true;
    }

    public void onClickNext(View view) {

        JSONObject tester = new JSONObject();
        try {
            tester = eventsToJson(activityData);
        } catch (JSONException e) {
            e.printStackTrace();
        }

        String urlString = getString(R.string.server_url);

        new PostRequestHandler(this).execute(tester.toString(), urlString);


        //TODO: Handle response
    }

    private JSONObject eventsToJson(ArrayList<MotionEvent> activityData) throws JSONException {
        JSONObject userEventsObj = new JSONObject();
        JSONArray userEvents = new JSONArray();

        for (MotionEvent event : activityData) {
            JSONObject temp = new JSONObject();
            temp.put("Action", event.getAction());
            temp.put("X", (int) event.getX());
            temp.put("Y", (int) event.getY());
            temp.put("EventTime", event.getEventTime());
            temp.put("DownTime", event.getDownTime());    

            userEvents.put(temp);
        }

        userEventsObj.put("UserEvents", userEvents);

        return userEventsObj;
    }

}
试试这个

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        this.mDetector.onTouchEvent(event);
        // Be sure to call the superclass implementation
        if(event.action == MotionEvent.ACTION_MOVE){
              Log.d("here");
        }

        return super.onTouchEvent(event);
    }
试试这个

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        this.mDetector.onTouchEvent(event);
        // Be sure to call the superclass implementation
        if(event.action == MotionEvent.ACTION_MOVE){
              Log.d("here");
        }

        return super.onTouchEvent(event);
    }

我建议你采取一些小的步骤并尝试一下。很可能你会找到你的解决方案。你能在日志中公布你得到了什么吗?谢谢。我已经用部分日志更新了这个问题。如您所见,有一个ACTION_MOVE事件,但我无法将其添加到列表中。请尝试对onScroll的日志进行注释并检查..@Shubham在这种情况下,日志记录器仅显示3个事件:onDown、onShowPress和onFlingI建议采取小步骤并尝试。很可能你会找到你的解决方案。你能在日志中公布你得到了什么吗?谢谢。我已经用部分日志更新了这个问题。如您所见,有一个ACTION_MOVE事件,但我无法将其添加到列表中。请尝试对onScroll的日志进行注释并检查..@Shubham。在这种情况下,日志记录器仅显示3个事件:onDown、onShowPress和onFlingHmm。我这样做了,记录器显示了我预期的动作和移动事件。但是,如果我再次尝试添加到我的列表中,我在调试时不会在列表中得到这些事件。但是,因为在你的情况下onScroll是可用的,我认为ActionMove不会起作用。但这仍然是我的直觉。我这样做了,记录器显示了我预期的动作和移动事件。但是,如果我再次尝试添加到我的列表中,我在调试时不会在列表中得到这些事件。但是,因为在你的情况下onScroll是可用的,我认为ActionMove不会起作用。但这仍然是我的直觉。