触摸事件onTouch

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u010356768/article/details/83338706

onTouchListener的return

返回false时

layout.setOnTouchListener(new View.OnTouchListener() {
            @Override
            public boolean onTouch(View view, MotionEvent motionEvent) {
                switch (motionEvent.getAction()){
                    case MotionEvent.ACTION_DOWN://手指按下
                        Log.d("MotionEvent","ACTION_DOWN");
                        break;
                    case MotionEvent.ACTION_MOVE://手指移动(从手指按下到抬起 move多次执行)
                        Log.d("MotionEvent","ACTION_MOVE");
                        break;
                    case MotionEvent.ACTION_UP://手指抬起
                        Log.d("MotionEvent","ACTION_UP");
                        break;
                }
                return false;
            }
        });

在这里插入图片描述

返回true时
在这里插入图片描述

通过日志发现,为false的时候,只会执行down方法,不会执行move和up
只有在true的时候,三个都会执行

return true表示消费了触摸事件,onTouch之后才执行onClick,这里被消费了,所以,相关的点击事件不会执行

onTouch和onClick
onClick 的过程是手指按下和抬起的过程(中间,手指抖动会产生移动),可以将onClick看做是一种特殊的onTouch。如果onTouch 没有消费掉触摸事件(没有return true),在onTouch后, 紧接着会执行onClick事件;如果onTouch消费掉了触摸事件(return true),后面将不会再执行onClick事件
需求较为复杂时,不仅需要touch事件也需要点击,甚至是长按事件,可以在onTouch中判断要进行哪一种事件(根据触摸的时间,距离等来判断)

获取位置

使用event.getX();event.getY();来获取位置(手指按下,移动或者是抬起时的位置)。通过位置来判断手指滑动的方向
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在左右滑动的过程中,需要对控件进行位置更改的,每一次更改位置,都需要保证将要移动到的位置需要在上面的x变化中,大于或者小于两边的边界值时,就取边界值

滑动事件和VelocityTracker 速度跟踪

关于速度,速度是有方向的。向左(上)滑动所产生的速度是负数,向右(下)滑动所产生的速度是正数

什么时候需要速度跟踪?
根据用户手指操作的速度来进行某些操作时,需要进行速度跟踪。例如,对slidMenu的操作,手指可能并没有滑动到显示menu的一半(往显示menu的方向进行滑动),但是,如果我滑动的速度很快,那么此时还是应该显示menu界面

思路

在VIew的onTouchEvent()中,当MotionEvent.ACTION_DOWN时初始化VelocityTracker, 在MotionEvent.ACTION_MOVE进行追踪,当滑动停止之后(MotionEvent.ACTION_UP or MotionEvent.ACTION_CANCEL)不要忘记调用clear()来回收内存

VelocityTracker velocityTracker;
    int xVelocity = 0;
    int yVelocity = 0;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_input_filter);

        layout = findViewById(R.id.layout);
        layout.setOnTouchListener(new View.OnTouchListener() {
            @Override
            public boolean onTouch(View view, MotionEvent motionEvent) {
                switch (motionEvent.getAction()){
                    case MotionEvent.ACTION_DOWN:
                        //初始化,VelocityTracker.obtain();获取跟踪类的实例
                        velocityTracker = VelocityTracker.obtain();
                        break;
                    case MotionEvent.ACTION_MOVE:
                        //将当前事件添加到速度跟踪类 进行速度的跟踪
                        velocityTracker.addMovement(motionEvent);
                        /**
                         * 使用computeCurrentVelocity(int)初始化速率的单位,并获得当前的事件的速率
                         * 设置units的值为1000,意思为一秒时间内运动了多少个像素
                         */
                        velocityTracker.computeCurrentVelocity(1000);
                        ////获取x轴方向的速度
                        xVelocity = (int) velocityTracker.getXVelocity();
                        //获取x轴方向的速度
                        yVelocity = (int) velocityTracker.getYVelocity();
                        Log.d("MotionEvent","x轴速度:"+xVelocity);
                        Log.d("MotionEvent","y轴速度:"+yVelocity);
                        break;
                    case MotionEvent.ACTION_UP:
                    case MotionEvent.ACTION_CANCEL:
                        //回收
                        velocityTracker.clear();
                        velocityTracker.recycle();
                        break;
                }
                return true;
            }
        });
    }

由以下两篇文章整理

简书 作者:AxeChen
链接:https://www.jianshu.com/p/29371bf70dff
CSDN 作者:彼岸花you
原文:https://blog.csdn.net/u012391876/article/details/54408804

猜你喜欢

转载自blog.csdn.net/u010356768/article/details/83338706