zoukankan      html  css  js  c++  java
  • android学习之VelocityTracker

    今天大概的学习了一下 VelocityTracker ,用来监控手势速度的,在View移动过程中,可以有个缓冲的移动。
     我觉得初步的使用起来是很简单的。
    首先移动依靠的是Scroller类,Scroller中有个fling的方法,将MotionEvent的Up之后检测的手势速度提供给scroller之后,就可以自己完成滚动。
    1.初始化有些变量:
      private void init(Context context){
            mScroller = new Scroller(getContext());
            final ViewConfiguration configuration = ViewConfiguration.get(context);  
            mMinimumVelocity = configuration.getScaledMinimumFlingVelocity();  
            mMaximumVelocity = configuration.getScaledMaximumFlingVelocity(); 
        }
    configuration.getScaledTouchSlop()//获得能够进行手势滑动的距离
    configuration.getScaledMinimumFlingVelocity()//获得允许执行一个fling手势动作的最小速度值
    configuration.getScaledMaximumFlingVelocity()//获得允许执行一个fling手势动作的最大速度值
    2.在触摸事件中处理:
     @Override  
        public boolean onTouchEvent(MotionEvent event) {  
            
            obtainVelocityTracker(event);   //初始化mVelocityTracker
            
            int action = event.getAction();  
            switch (action) {  
                case MotionEvent.ACTION_DOWN:  
                    startY = event.getY();
                    if (mScroller.isFinished()) {
                        mScroller.abortAnimation();
                    }
                    break;  
                case MotionEvent.ACTION_MOVE:  
                    //求伪瞬时速度  
                    float moveY = event.getY();
                    scrollTo(0, (int) (getScrollY() + (startY - moveY)));
                    startY = event.getY();
                    break;  
                case MotionEvent.ACTION_UP:  
                    final VelocityTracker velocityTracker = mVelocityTracker;  
                    velocityTracker.computeCurrentVelocity(1000, mMaximumVelocity);  
                    int initialVelocity = (int) velocityTracker.getYVelocity();  //获取Y轴的速度
                    if ((Math.abs(initialVelocity) > mMinimumVelocity) && getChildCount() > 0) {  
                            fling(-initialVelocity);  //开始滚动
                    }  
                case MotionEvent.ACTION_CANCEL:  
                    releaseVelocityTracker();  //要释放掉
                    break;  
            }  
            return true;  
        }  

    /**
     *释放mVelocityTracker
     */
     private void releaseVelocityTracker() {  
                if(null != mVelocityTracker) {  
                    mVelocityTracker.clear();  
                    mVelocityTracker.recycle();  
                    mVelocityTracker = null;  
                }  
          }  

    /**
     *释放初始化
     */
    private void obtainVelocityTracker( MotionEvent event) {  
            if(null == mVelocityTracker) {  
                mVelocityTracker = VelocityTracker.obtain();  
            }  
            mVelocityTracker.addMovement(event);  
        }    
    down和move事件中就是简单的跟随手势移动了,主要的事件处理是在up中。
    滚动的事件处理在fling方法中:
    public void fling(int velocityY) { 
                    mScroller.fling(getScrollX(), getScrollY(), 0, velocityY, 0, 0, -1080, 0);  //就是scroller的一个方法而已,很简单。
                    awakenScrollBars(mScroller.getDuration());  
                    invalidate();  
      }  
    fling(getScrollX(), getScrollY(), 0, velocityY, 0, 0, -1080, 0);
                                                                                                                              最小Y      最大Y

    我的Demo中只是简单的Y轴上的滚动,所以设置了最小最大Y轴上的移动距离。最小Y  最大Y  都是说的ScrollY这个属性。
    有Scroller这个类。就少不了computScroll方法。
    public void computeScroll() {  
            if (mScroller.computeScrollOffset()) {  
                    int x = mScroller.getCurrX();  
                    int y = mScroller.getCurrY();  
                    scrollTo(x, y);  
                    postInvalidate();  
            }  
    }  


    我的github地址:https://github.com/flyme2012
    我的博客地址:http://www.cnblogs.com/flyme2012/






  • 相关阅读:
    ORACLE 计算时间相减间隔
    oracle中游标详细用法
    oracle中计算某月的天数
    Unity3D导出的EXE不用显示分辨率选择界面
    Unity3D 之暂停和继续的实现
    double的值太大,以及补0
    Unity3D鼠标点击物体产生事件
    java POi excel 写入大批量数据
    Unity3D 判断鼠标是否按在UGUI上
    Unity3D 之UGUI 滚动条
  • 原文地址:https://www.cnblogs.com/flyme2012/p/4095088.html
Copyright © 2011-2022 走看看