• Android -- VelocityTracker


    VelocityTracker                                                                      

    主要应用于touch event, VelocityTracker通过跟踪一连串事件实时计算出当前的速度。

    方法                                                                                   

    //获取一个VelocityTracker对象, 用完后记得回收  
    //回收后代表你不需要使用了,系统将此对象在此分配到其他请求者  
    static public VelocityTracker obtain();  
    public void recycle();   
    //计算当前速度, 其中units是单位表示, 1代表px/毫秒, 1000代表px/秒, ..  
    //maxVelocity此次计算速度你想要的最大值  
    public void computeCurrentVelocity(int units, float maxVelocity);  
    //经过一次computeCurrentVelocity后你就可以用一下几个方法获取此次计算的值  
    //id是touch event触摸点的ID, 来为多点触控标识,有这个标识在计算时可以忽略  
    //其他触点干扰,当然干扰肯定是有的  
    public float getXVelocity();  
    public float getYVelocity();  
    public float getXVelocity(int id);  
    public float getYVelocity(int id);

    Code                                                                                   

    public class VelocityTrackerTest extends Activity {  
        private TextView mInfo;  
        private VelocityTracker mVelocityTracker;  
        private int mMaxVelocity;  
        private int mPointerId;  
      
        @Override  
        protected void onCreate(Bundle savedInstanceState) {  
            super.onCreate(savedInstanceState);  
      
            mInfo = new TextView(this);  
            mInfo.setLines(4);  
            mInfo.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT));  
            mInfo.setTextColor(Color.WHITE);  
      
            setContentView(mInfo);  
      
            mMaxVelocity = ViewConfiguration.get(this).getMaximumFlingVelocity();  
        }  
      
        @Override  
        public boolean onTouchEvent(MotionEvent event) {  
             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);  
                    recodeInfo(velocityX, velocityY);  
                    break;  
      
                case MotionEvent.ACTION_UP:  
                case MotionEvent.ACTION_CANCEL:  
                      if(null != mVelocityTracker) {  
                  mVelocityTracker.clear();  
                  mVelocityTracker.recycle();  
                  mVelocityTracker = null;  
                      }   
                    break;  
      
                default:  
                    break;  
            }  
            return super.onTouchEvent(event);  
        }  
      
      
        private static final String sFormatStr = "velocityX=%f
    velocityY=%f";  
      
        /**  
         * 记录当前速度  
         *  
         * @param velocityX x轴速度  
         * @param velocityY y轴速度  
         */  
        private void recodeInfo(final float velocityX, final float velocityY) {  
            final String info = String.format(sFormatStr, velocityX, velocityY);  
            mInfo.setText(info);  
        }  
    }

    我是天王盖地虎的分割线                                                             

    源码:http://pan.baidu.com/s/1dD1Qx01

    VelocityTrackerStudy.zip

  • 相关阅读:
    [Swift]LeetCode300. 最长上升子序列 | Longest Increasing Subsequence
    备忘录模式之C++实现
    leecode 题解 || Merge k Sorted Lists 问题
    数学三大危机
    singlefile.py
    Data Url生成工具之HTML5 FileReader实现
    算法题:打印1到最大的n位数
    java.lang.NoClassDefFoundError: org/apache/commons/lang/xwork/StringUtils
    hdu 1181 变形课
    postgis经常使用函数介绍(一)
  • 原文地址:https://www.cnblogs.com/yydcdut/p/4082579.html
Copyright © 2020-2023  润新知