ViewDragHelper简单使用

来源:互联网 发布:淘宝发货地与实际不符 编辑:程序博客网 时间:2024/04/29 10:43

ViewDragHelper的构造器

  1. ViewDragHelper实例化方式为:
    mViewDragHelper= ViewDragHelper.create(this, 1.0f,mCallBack);
    参数意义:
    第一个传 viewgroup对象
    第二个是 敏感度
    第三个为回调函数

  2. 与当前viewGroup进行绑定操作

@Override    public boolean onInterceptTouchEvent(MotionEvent ev) {        return mViewDragHelper.shouldInterceptTouchEvent(ev);    }    @Override    public boolean onTouchEvent(MotionEvent event) {        try {            mViewDragHelper.processTouchEvent(event);        } catch (Exception e) {        }        return true;    }
  1. 重写ViewDragHelper.Callback里面的方法
ViewDragHelper.Callback mCallback =new ViewDragHelper.Callback(){        //view:当前操作的view        //view区分多点触摸的id        //返回用来判断那个view可以滑动,true可以滑动,false不可以滑动        @Override         public boolean tryCaptureView(View arg0, int pointerId) {              return false;    //通常写法:return arg0==view1;表示view1可以滑动        }        // 当capturedChild被捕获时,调用. 其实就是上面方法return true之后,点击view被调用        @Override        public void onViewCaptured(View capturedChild, int activePointerId) {            // TODO Auto-generated method stub            super.onViewCaptured(capturedChild, activePointerId);        }        //根据建议值 修正将要移动到的(横向)位置   (重要)        // 此时没有发生真正的移动        @Override        public int clampViewPositionHorizontal(View child, int left, int dx) {//水平滑动的位置            // TODO Auto-generated method stub            //view:当前操作的view            //新的位置的建议值, dx 位置变化量            // left= getLeft() + dx            // 通常返回被限制后的left            // 如:int newLeft= math.min(getWidth()- getPaddingRight(),                               math.max(left,0+getPaddingLeft));            return left;        }        //与上面同理,不过是竖直方向的        @Override        public int clampViewPositionVertical(View child, int top, int dy) {            // TODO Auto-generated method stub            return super.clampViewPositionVertical(child, top, dy);        }        @Override        public int getViewHorizontalDragRange(View child) {            // 返回拖拽的范围, 不对拖拽进行真正的限制. 仅仅决定了动画执行速度            return super.getViewHorizontalDragRange(child);        }        @Override        public int getViewVerticalDragRange(View child) {            // TODO Auto-generated method stub            return super.getViewVerticalDragRange(child);        }        // 当View位置改变的时候, 处理要做的事情 (更新状态, 伴随动画, 重绘界面)        // 此时,View已经发生了位置的改变        // 例如:滑动了changeView,同时想要另一个view2跟随,那么可以在这个方法里面调用          //view2.offsetLeftAndRight(dx);再刷新界面        @Override        public void onViewPositionChanged(View changedView, int left, int top,                int dx, int dy) {            // changedView 改变位置的View            // left 新的左边值            // dx 水平方向变化量            // 为了兼容低版本, 每次修改值之后, 进行重绘            invalidate();            super.onViewPositionChanged(changedView, left, top, dx, dy);        }        // 当View被释放的时候, 处理的事情(执行动画)        @Override        public void onViewReleased(View releasedChild, float xvel, float yvel) {            // View releasedChild 被释放的子View             // float xvel 水平方向的速度, 向右为+            // float yvel 竖直方向的速度, 向下为+            super.onViewReleased(releasedChild, xvel, yvel);        }


  1. 如果在viewgroup里面需要平滑滑动可以使用:

mViewDragHelper.smoothSlideViewTo(mainLayout, 0, 0);
写法:
    // 1. 触发一个平滑动画        if(mDragHelper.smoothSlideViewTo(View, finalLeft, 0)){            // 返回true代表还没有移动到指定位置, 需要刷新界面.            // 参数传this(child所在的ViewGroup)            ViewCompat.postInvalidateOnAnimation(this);    }由于内部实现是scroller.startScroll,所以也需要重写computeScroll()    @Override    public void computeScroll() {        if(mViewDragHelper.continueSettling(true)){            ViewCompat.postInvalidateOnAnimation(this);        }    }
0 0