TouchSlop与VelocityTracker认识

本文详细介绍了Android中TouchSlop的概念及其作用,并通过示例讲解如何利用VelocityTracker跟踪手指滑动速度,以实现更精确的触摸事件处理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

TouchSlop是处理触摸事件中的一个常量,被系统认为滑动和点击事件的临界点理 解这个touchSlop是一个滑动距离值的常量,也就是说当我们手触摸在屏幕上滑动时,如果滑动距离没有超过touchSlop值的话 ,android系统本身是不会认为我们在屏幕上做了手势滑动,因此只有当我们在屏幕上的滑动距离超过touchSlop值时,android系统本身才 会认为我们做了滑动操作并去响应触摸事件,不过要注意的是不同的设备,touchSlop的值可能是不同的,一切以函数获取为准。

在各家手机系统默认值是不同的

通过:ViewConfiguration.get(getContext()).getScaledTouchSlop() 获取系统的滑动常量来,判断此时是否属于滑动事件

其中ViewConfiguration这个类主要定义了UI中所使用到的标准常量,像超时、尺寸、距离

在处理滑动事件时,其实可以利用这个值来过滤掉一些没必要的动作,比如当两次滑动距离小于这个值时,我们就可以认为滑动没发生,从而更好的优化用户体验。

VelocityTracker是个速度跟踪类,用于跟踪手指滑动的速度,包括x轴方向和y轴方向的速度。如快速滑动或者其他手势操作。当我们准备开始跟踪滑动速率时可以使用obtain()方法来获取一个 VelocityTracker的实例,然后在onTouchEvent回调函数中,使用addMovement(MotionEvent)函数将当前的 移动事件传递给VelocityTracker对象。当我们决定计算当前触摸点的速率时可以调用computeCurrentVelocity(int units)函数来计算当前的速度,使用getXVelocity() getYVelocity()函数来获得当前X轴和Y轴的速度。

使用例子:

 @Override  

    public boolean onTouchEvent(MotionEvent event) {  

        LogUtils.e("onTouchEvent start!!");  

        Log.i(TAG, "ACTION_DOWN");  

        if(null == mVelocityTracker) {  

            mVelocityTracker = VelocityTracker.obtain();  

        }  

        mVelocityTracker.addMovement(event);  

        final VelocityTracker verTracker = mVelocityTracker;  

        switch (event.getAction()) {  

            case MotionEvent.ACTION_DOWN:  

                //获取第一个触点的id, 此时可能有多个触点,获取其中一个  

                mPointerId = event.getPointerId(0);  

                break;  

            case MotionEvent.ACTION_MOVE:  

                //计算瞬时速度  

                verTracker.computeCurrentVelocity(1000, mMaxVelocity);  

                float velocityX = verTracker.getXVelocity(mPointerId);  

                float velocityY = verTracker.getYVelocity(mPointerId);  

                LogUtils.e("velocityX-->" + velocityX);  

                LogUtils.e("velocityY-->"+velocityY);  

                break;  

            case MotionEvent.ACTION_UP:  

            case MotionEvent.ACTION_CANCEL:  

                releaseVelocityTracker();//释放资源  

                break;  

            default:  

                break;  

        }  

        return super.onTouchEvent(event);  

    }  

    /** 

     * 使用完VelocityTracker,必须释放资源 

     */  

    private void releaseVelocityTracker() {  

        if (mVelocityTracker != null) {  

            mVelocityTracker.clear();  

            mVelocityTracker.recycle();  

            mVelocityTracker = null;  

        }  

    }  

 

 

转载于:https://www.cnblogs.com/ut2016-progam/p/5341774.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值