ViewDragHelper简单使用

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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值