如何在Android触摸事件(动作事件)中获取起始和结束坐标?

3
我被要求在在线课程的一部分中修改现有代码。目前,该应用程序注册并显示屏幕被触摸的位置的x和y坐标以及以毫秒为单位的时间量。
我想添加获取起始和结束坐标的功能,即手指开始和结束拖动的位置。目前,已注册的坐标似乎只是结束坐标。如何添加两组坐标(例如,如果我想计算运动事件的距离)?这是代码的一部分。感谢您的帮助!
@Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
    }

    Calendar tiempoInicio = null;
    Calendar tiempoFinal = null;

    @Override
    public boolean onTouchEvent(MotionEvent event) {

        int x = (int)event.getX();
        int y = (int)event.getY();
        switch (event.getAction()) {
        case MotionEvent.ACTION_DOWN:
                tiempoInicio = Calendar.getInstance();
                break;
        case MotionEvent.ACTION_MOVE:
            break;
        case MotionEvent.ACTION_UP:
                tiempoFinal = Calendar.getInstance();


                Intent intent = new Intent (
                                   AplicacionSencillaActivity.this,
                                AplicacionSencillaResults.class);
                Bundle bundle = new Bundle();
                bundle.putLong(
                                "TIEMPOPRESIONADO",
                                tiempoFinal.getTimeInMillis() -
                                 tiempoInicio.getTimeInMillis());
                bundle.putInt("X", x);
                bundle.putInt("Y", y);

                intent.putExtras(bundle);
                startActivity(intent);
                break;
2个回答

0
要获取起始坐标,您需要在 ACTION_DOWN 事件期间获取并保存 getX()getY(),因为这表示移动的开始。

0

实际上,你的代码大部分是正确的,ACTION_DOWN会给你开始,ACTION_UP会给你结束。你的错误在于覆盖了onTouchEvent() - 请阅读描述,它说只有在没有任何视图处理触摸时才会被调用,所以你的触摸可能被一些子视图拦截。

改为覆盖dispatchTouchEvent(),你将获得所有的触摸事件。不要忘记调用super.dispatchTouchEvent(),否则你将停止将触摸事件传递给活动中的视图。


谢谢Ivan!然而,应用程序仍然只注册最后一个坐标。我需要在ACTION_DOWN期间获取getX和getY吗,就像下面Geobits所说的那样?如果是这样,我应该把代码放在哪里? - Michelle Worgan
是的,我假设这已经是你正在做的事情 :) 它的工作方式是你接收屏幕给你的所有事件,你的工作就是弄清楚发生了什么。我会使用一个成员变量来存储状态。像 boolean mIsSwiping。当你收到 ACTION_DOWN 时将其设置为 true 并读取起始点坐标。当你收到 ACTION_UP 时:如果 mIsSwipingtrue,则读取结束坐标并将 mIsSwiping 设置为 false,否则 - 无事可做。 - Ivan Bartsov
请参考以下链接:http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/2.3.3_r1/android/widget/ScrollView.java#483 注意在ACTION_DOWN中,他们基本上将mIsBeingDragged(根据子项计数,但这是因为它是ScrollView,除非有子项,否则无法滚动)设置为true,而对于ACTION_UPACTION_CANCEL,他们将mIsBeingDragged设置为false。 - Ivan Bartsov

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接