onTouchListener 总是得到相同的 MotionEvent ACTION_UP

onTouchListener always getting the same MotionEvent ACTION_UP

起初我总是收到 ACTION_DOWN 消息,所以我用谷歌搜索,发现最后我必须 return TRUE。所以我改变了它,我开始总是 ACTION_UP。我不明白为什么。

linearLayoutDraggable.setOnTouchListener(new View.OnTouchListener() {
            @Override
            public boolean onTouch(View v, MotionEvent event) {
                //ConstraintLayout.LayoutParams par = (ConstraintLayout.LayoutParams)v.getLayoutParams();
                CardView.LayoutParams par = (CardView.LayoutParams)v.getLayoutParams();


                switch (event.getAction()) {

                    case MotionEvent.ACTION_UP: {
                        //par.height = 40;
                        Toast.makeText(MagMainNewActivity.this, "UP", Toast.LENGTH_SHORT).show();
//                                par.height=300;
//                                par.topMargin = (int) event.getRawY() - (v.getHeight());
//                                par.leftMargin = (int) event.getRawX() - (v.getWidth() / 2);
//                                v.setLayoutParams(par);

                        break;
                    } //inner case UP
                    case MotionEvent.ACTION_DOWN: {
                        Toast.makeText(MagMainNewActivity.this, "DOWN", Toast.LENGTH_SHORT).show();
//                                par.height = 115;
//                                //par.width = 60;
//                                v.setLayoutParams(par);
                        break;
                    } //inner case UP
                } //inner switch

                return true;
            }
        });

onTouchListener 接收动作手势,因此(在返回 true 时)如果您收到 ACTION_DOWN,您将收到每个 ACTION_MOVE 最后确定的只有一个 ACTION_UP表示此时指针(手指)已从屏幕上移开。

单击操作由 ACTION_DOWN 加 ACTION_UP 表示,而没有 UP 的 ACTION_DOWN 表示长按。

也许您看到的只是来自 toast 的 UP 消息,因为这两个事件都是按顺序触发的,并且第二个 toast 覆盖了第一个,如果您添加 Log.v("MMNA", "DOWN"),您可以在 Logcat 处检查两者

因为在手指向上之前,手指先向下,这意味着 MotionEvent.ACTION_DOWN 是先来的。它检查事件动作,如果手指触摸屏幕动作是 MotionEvent.ACTION_DOWN 并且它会中断。抱歉英语不好