TouchSlop与VelocityTracker认识

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;  

        }  

    }  

 

 

posted @ 2016-03-31 16:55  一起学习—编程  阅读(3975)  评论(0)    收藏  举报