Android onTouchEvent的MotionEvent.ACTION_UP

本博客同步发布于XueLong的博客

在使用OnTouchListener()方法时,发现竟然只能监听到MotionEvent.ACTION_DOWN操作,而无法监听到其他的操作,如:MotionEvent.ACTION_UPMotionEvent.ACTION_MOVE等,都监测不到。代码如下:

linearLayout.setOnTouchListener(new View.OnTouchListener() {

            @Override
            public boolean onTouch(View v, MotionEvent event) {
                int action = event.getAction();
                switch (action){
                    case MotionEvent.ACTION_DOWN:
                        Log.e(TAG, "onTouch: down");
                       
                        break;
                    case MotionEvent.ACTION_UP:
                        Log.e(TAG, "onTouch: up");
                        
                        break;
                    case MotionEvent.ACTION_MOVE:
                        Log.e(TAG, "onTouch: move");
                        
                        break;
                }
                return ActionUpActivity.super.onTouchEvent(event);
            }
        });

Log输出如下:

E/ActionUpActivity: onTouch: down
E/ActionUpActivity: onTouch: down
E/ActionUpActivity: onTouch: down

感觉这样写没有问题啊,但是为什么就是只能监听到MotionEvent.ACTION_DOWN呢?

In onTouchEvent, ACTION_UP doesn't work

原来是return ActionUpActivity.super.onTouchEvent(event);实际上返回的时false,而这里如果返回false的话,Android系统将不会在通知该手势中的其他任何事件;如果想继续捕捉到其他手势事件,则这里就要返回一个true

正确写法如下:

linearLayout.setOnTouchListener(new View.OnTouchListener() {

            int startX;
            int startY;

            @Override
            public boolean onTouch(View v, MotionEvent event) {
                int action = event.getAction();
                switch (action){
                    case MotionEvent.ACTION_DOWN:
                        Log.e(TAG, "onTouch: down");
                        startX = (int) event.getRawX();
                        startY = (int) event.getRawY();

                        Log.e(TAG,"startX: "+startX + " startY: " + startY);
                        break;
                    case MotionEvent.ACTION_UP:
                        Log.e(TAG, "onTouch: up");
                        startX = (int) event.getRawX();
                        startY = (int) event.getRawY();

                        Log.e(TAG,"startX: "+startX + " startY: " + startY);
                        break;
                    case MotionEvent.ACTION_MOVE:
                        Log.e(TAG, "onTouch: move");
                        int newX = (int) event.getRawX();
                        int newY = (int) event.getRawY();
                        int dx = newX - startX;
                        int dy = newY - startY;

                        Log.e(TAG,"移动的dx: "+dx + " 移动的dy: " + dy);

                        //重新初始化手指的位置
                        startX = (int) event.getRawX();
                        startY = (int) event.getRawY();
                        break;
                }
                // TODO: 2017/10/30 如果这里为false,则只能监听到ACTION_DOWN,其他的都监听不到
                return true;
//                return ActionUpActivity.super.onTouchEvent(event);
            }
        });

写在最后

以上就是关于,Android onTouchEventMotionEvent.ACTION_UP不响应的问题的解决方式。

如果你在参考过程中遇到问题,可以在我的联系方式中给我提问。

后面会继续介绍,Android的相关知识,欢迎继续关注我博客的更新。

项目源代码

参考资源

转载请注明:XueLong的博客 » Android自定义图形-Shape的使用

推荐阅读更多精彩内容