自定义控件<一> ViewDragHelper介绍

自定义控件<一> viewDragHelper介绍

viewDragHelper相当于ViewGroup,可以对于子孩子进行操作,但是viewDragHelper的一些方法 方便子孩子的操作<下一遍通讯录的自定义控件要用到viewDragHelper> ok~ 下面对viewDragHelper进行代码详解;

1.viewDragHelper的实例创建—>可以单例实现

ViewDragHelper  dragHelper = ViewDragHelper.create(this,callback);//创建对象\\

2.ok~viewDragHelper中的一些方法

在ViewDragHelper中可以由DragHelper进行 拦截和触摸事件  的处理
@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
    //让ViewDragHelper帮助我们判断是否应该拦截
    boolean result = dragHelper.shouldInterceptTouchEvent(ev);

    return result;
}

@Override
public boolean onTouchEvent(MotionEvent event) {
    //让ViewDragHelper帮我们处理触摸事件
    dragHelper.processTouchEvent(event);

    return true;
}

当然最重要的是ViewDragHelper要进行接口回调:

   ViewDragHelper.Callback callback = new ViewDragHelper.Callback() {
        /**
         * 是否捕获View的触摸事件
         * @param child   当前你所触摸的子View
         * @param pointerId     多点触摸的时候每一个触摸点的索引
         * @return  true就是捕获, false就是不捕获
         */
        @Override
        public boolean tryCaptureView(View child, int pointerId) {   
        //确定触摸事件的view  即是child中哪些具备触摸点击
            return child==main || child==menu;
        }

        /**
         * 比较鸡肋的方法,从方法名来看好像是限制VIew水平拖拽范围的,然后并没有什么用,
         * 目前该方法的范围值被用来作为你是否想横向滑动的条件之一,如果返回值大于0,表示想
         * 强制水平滑动,反之不想强制水平滑动
         * @param child
         * @return
         */
        @Override
        public int getViewHorizontalDragRange(View child) {
        //比较鸡肋 没有什么实在意义
            return 1;
        }

        /**
         * 修正View水平方向的位置
         * @param child  当前触摸的子View
         * @param left  表示ViewDragHelper帮我计算好的当前child最新的left值,left=child.getLeft()+dx
         * @param dx    表示本次移动的距离
         * @return  表示我们真正想让child的left变成的值
         */
        @Override
        public int clampViewPositionHorizontal(View child, int left, int dx) {
        //修正水平方向的位置  其实就是对chid中左右边界的一个限制
            //对main界面限制
            if(child==main){
                left = clampLeft(left);   
            }


            return left;
        }

        /**
         * 修正View垂直方向的位置
         * @param child  当前触摸的子View
         * @param top  表示ViewDragHelper帮我计算好的当前child最新的top值,top=child.getTop()+dy
         * @param dy    表示本次移动的距离
         * @return  表示我们真正想让child的top变成的值
         */
        @Override
        public int clampViewPositionVertical(View child, int top, int dy) { 
        //对垂直方向的一个限制  没有什么意义

            return 0;
        }

        /**
         * 当View位置改变之后调用
         * @param changedView   位置改变的View
         * @param left  改变的最新的left
         * @param top   改变的最新的top
         * @param dx    本次水平移动的距离
         * @param dy    本次垂直移动的距离
         */
        @Override
        public void onViewPositionChanged(View changedView, int left, int top, int dx, int dy) {
        //view位置改变之后调用  相当于对多个child的view进行联动的一个设置
            super.onViewPositionChanged(changedView, left, top, dx, dy);
            if(changedView==menu){
                /**不让menu乱滑*/
                //通过让manu固定在原点位置实现不动
                menu.layout(0,0,menu.getMeasuredWidth(),menu.getMeasuredHeight());
                /**先定位在放缩*/
                int newLeft = main.getLeft()+dx;//main当前的left+本次移动的距离
                newLeft = clampLeft(newLeft);
                main.layout(newLeft,main.getTop(),newLeft+main.getMeasuredWidth()
                    ,main.getBottom());
            }

            /**移动的是main*/
            //执行伴随动画
            //1.计算动画执行的百分比
            float fraction = main.getLeft()*1f/maxLeft;
            //2.根据百分比执行动画
            executeAnim(fraction);

            //3.回调接口的方法
            if(main.getLeft()==0){
                //回调关闭的方法
                if(listener!=null){
                    listener.onClose();
                }
            }else if(main.getLeft()==maxLeft){
                //回调打开的方法
                if(listener!=null){
                    listener.onOpen();
                }
            }
            //回调dragging
            if(listener!=null){
                listener.onDraging(fraction);
            }
        }

        /**
         * 当抬起手指的时候执行
         * @param releasedChild  你抬起的那个子View
         * @param xvel  x方向滑动的速度
         * @param yvel  y方向滑动的速度
         */
        @Override
        public void onViewReleased(View releasedChild, float xvel, float yvel) {
        //抬起手之后的回调   一般是需求需要  view回弹 或者弹出的一个设定
            super.onViewReleased(releasedChild, xvel, yvel);
            if(main.getLeft()>maxLeft/2){
                //说明应该打开
                openMenu();
            }else {
                //说明应该关闭
                closeMenu();
            }
        }

    };

viewDragHelper的一些主要方法,在viewGroup的自定义中确实方便许多

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值