Android 视图拖拽辅助类 ViewDragHelper 的使用

来源:互联网 发布:手机淘宝好评能修改吗 编辑:程序博客网 时间:2024/05/21 22:53

- 简介

视图拖拽辅助类,2013谷歌I/O大会提出,解决控件在界面中的拖拽问题;

- 自定义控件中的使用步骤

1. 创建ViewDragHelper类
这个类在support-v4 jar包里;
创建: ViewDragHelper.create(forParent, sensitive, cb);
//forParent 父控件
//sensitive 敏感度
//cb 回调接口

2. 转交触摸事件 :
由ViewDragHelper判断触摸事件是否应该拦截
由ViewDragHelper处理事件

        @Override        public boolean onInterceptTouchEvent(MotionEvent ev) {            return mHelper.shouldInterceptTouchEvent(ev);        }        @Override        public boolean onTouchEvent(MotionEvent event) {            try {                mHelper.processTouchEvent(event);            } catch (Exception e) {                e.printStackTrace();            }            return true;        }

3. 接受处理的结果 :(重写回调接口cb里的方法)

  1. tryCaptureView( child, pointerId)
    //child 被用户拖动的子控件
    //pointerId 多点触摸的手指id
    返回值:boolean, 界定了child是否可以被拖拽

  2. 返回拖拽的范围, 返回一个>0的值,决定了动画的执行时长,水平方向是否可以被划开
    getViewHorizontalDragRage(child)
    (onSizeChanged()当空间尺寸变化的时候变化的时候才调用,也就是在onMeasure之后选择性调用)
    (在onSizeChanged()中得到想要的到的拖拽范围)

  3. 修正子View水平方向的位置,还没有发生真正的移动,
    返回值决定了View将会移动到的位置,用这个方法修正位置
    clampViewPositionHorizontal(child, left, dx)
    //child 被拖拽的子View
    //left 建议移动到的位置.
    //dx 跟旧得位置的差值
    (onFinishInflate() 在所有子控件被加载完时调用,在这个方法里通过getChildAt方法得到子控件对象)
    (要保证代码的健壮性在找索引的时候,要注意索引越界,并且孩子必须是ViewGroup的子类,都需要判断一下,抛异常)

  4. 当空间位置变化时调用,可以做: 伴随动画,状态的更新,事件的回调
    onViewPositionChange(changedView, left, tp, dx, dy)
    // changeView 位置改变的控件;
    // left 控件的左边位置;
    // tp 控件的上边位置;
    // dx 控件位置变化的x轴增值;
    // dy 控件位置变化的y轴增值;
    为了兼容低版本,需要手动重绘界面所有内容.Invalidate();

  5. 决定了松手之后要做的事情
    onViewReleased(releasedChild, xvel, yvel)
    releasedChild 被释放的子控件
    xvel 水平方向的速度,向右为正,向左为负
    yvel 竖直方向的速度,向下为正,向上为负

    //结束动画,走平滑动画
    //是否需要触发一个平滑动画
    mHelper.smoothSlideViewTo(ChildView, finalLeft, finalTop)
    postInvalidateOnAnimation(parentView);
    维持动画,调用频率特别高
    computeScroll()
    mHelper.continueSetting();

0 0
原创粉丝点击