callBack方法介绍

ViewDragHelper中的Callback中常用方法介绍和创建

  • 通过ViewDragHelper创建的静态方法创建的

    ViewDragHelper viewDragHelper = ViewDragHelper.create(this,callback);
    
  • 关于tryCaptureView()方法

    下面SlideMenu里面有两个子View(menuView和mainView),而child==mainView || child==menuView 代表这两个View都能获得触摸事件

     /**
     * 判断是否需要捕获View的触摸事件
     * @param child   当前触摸的View
     * @param pointerId  触摸点索引,比如双手指点击
     * @return  true:捕获,  false:不捕获
     */
    @Override
    public boolean tryCaptureView(View child, int pointerId) {
        return child==mainView || child==menuView;
    }
    
  • 关于onViewCaptured()方法

     /**
     * 当一个View被捕获触摸事件时候调用,此方法几乎没有用到
     * @param capturedChild 被捕获触摸事件的子View
     * @param activePointerId
     */
    @Override
    public void onViewCaptured(View capturedChild, int activePointerId) {
        super.onViewCaptured(capturedChild, activePointerId);
        Log.e("tag","onViewCaptured");
    }
    
  • 关于getViewHorizontalDragRange()方法

    此方法返回值一般为一个子View的宽,后面好用于控制动画的时间

     /**
     * 方法名为获取水平方向拖拽的范围,然而目前并没有用,该方法的返回值用来作为判断滑动方向的条件之一,一般写某个子View的宽度.
     * 如果你想水平移动,那么该方法的返回值最好大于0
     * @param child
     * @return
     */
    @Override
    public int getViewHorizontalDragRange(View child) {
        return 200;
    }
    
  • 关于clampViewPositionHorizontal()方法

    此方法主要是控制子View在水平方向移动的距离

     /**
     * 用来修正或者指定子View在水平方向上的移动
     * @param child  滑动的View
     * @param left  是ViewDragHelper帮你计算好的View最新的left的值,left=view.getLeft()+dx
     * @param dx   本次水平移动的距离
     * @return  返回的值表示我们真正想让View的left变成的值
     */
    @Override
    public int clampViewPositionHorizontal(View child, int left, int dx) {
        //限制主界面的滑动
        if(child==mainView){
            left = clampLeft(left);
        }
        return left;
    }
    //控制水平移动的方法
    private int clampLeft(int left) {
        if(left>dragRange){
             left=dragRange;  //移动的最大位置
         }else if(left<0){
            left = 0;       //移动的最小位置
        }
        return left;
    }
    
  • 关于clampViewPositionVertical()方法

    原理同上水平移动

     /**
     * 用来修正或者指定子View在垂直方向上的移动
     * @param
     * @param top  是ViewDragHelper帮你计算好的View最新的top的值,top=view.getTop()+dy
     * @param dy   本次垂直移动的距离
     * @return  返回的值表示我们真正想让View的top变成的值
     */
     @Override
     public int clampViewPositionVertical(View child, int top, int dy) {
        return top;
     }
    
  • 关于onViewPositionChanged()方法

    一般用于当View的位置改变时,调用的方法.还可以设置动画,监听事件

     /**
     * 当View移动的时候调用
     * @param changedView   当前移动的VIew
     * @param left  当前View移动之后最新的left
     * @param top   当前View移动之后最新的top
     * @param dx    水平移动的距离
     * @param dy    垂直移动的距离
     */
    @Override
    public void onViewPositionChanged(View changedView, int left, int top, int dx, int dy) {
        super.onViewPositionChanged(changedView, left, top, dx, dy);
        //当menuView移动的时候,让mainView进行伴随移动,但是menuView保持不动
        if(changedView==menuView){
            //让menuView的位置固定住
            menuView.layout(0,0,menuWidth,menuView.getBottom());
    
            int newLeft = mainView.getLeft()+dx;
            //限制newLeft
            newLeft = clampLeft(newLeft);
            mainView.layout(newLeft,0,newLeft+mainWidth,mainView.getBottom());
        }
    
        //1.计算mainView滑动的百分比
        float fraction = mainView.getLeft()*1f/dragRange;
        Log.e("tag",fraction+"");
        //2.根据fraction来执行一系列动画
        executeAnim(fraction);
        //3.回调监听器的方法
        if(fraction==1f && mState!=DragState.Open){
            //说明打开了
            mState = DragState.Open;
            if(listener!=null){
                listener.onOpen();
            }
        }else if(fraction==0f && mState!=DragState.Close){
            //说明关闭了
            mState = DragState.Close;
            if(listener!=null){
                listener.onClose();
            }
        }
        //拖拽中直接回调就行
        if(listener!=null){
            listener.onDraging(fraction);
        }
    
    }
    
    /**
    * 执行动画
    * @param fraction
    */
    private void executeAnim(float fraction) {
        //fraction:0-1
        //1.缩放mainView
        //scaleValue:1-0.6
    
        //float scaleValue = (0.6f-1)*fraction + 1f;
        mainView.setScaleX(floatEvaluator.evaluate(fraction,1f,0.8f));
        mainView.setScaleY(floatEvaluator.evaluate(fraction,1f,0.8f));
    
        //2.缩放menuView
        menuView.setScaleX(floatEvaluator.evaluate(fraction,0.4f,1f));
        menuView.setScaleY(floatEvaluator.evaluate(fraction,0.4f,1f));
        menuView.setTranslationX(floatEvaluator.evaluate(fraction,-menuWidth/2,0));
    
        //3.让SlideMenu的背景添加变暗的效果
        if(getBackground()!=null){
            //给Drawable添加一个颜色的遮罩效果
            getBackground().setColorFilter((Integer) argbEvaluator.evaluate(fraction,Color.BLACK,Color.TRANSPARENT),PorterDuff.Mode.SRC_OVER);
            //getBackground().setColorFilter((Integer) argbEvaluator.evaluate(fraction,Color.RED,Color.GREEN),PorterDuff.Mode.SRC_OVER);
        }
    }
    
  • 关于onViewReleased()方法

    手指放开时调用的方法,一般用于让view平滑的过度到最终的位置

     /**
     * 当手指从View上抬起的时候回调
     * @param releasedChild
     * @param xvel  x方向滑动的速度
     * @param yvel  y方向滑动的速度
     */
    @Override
    public void onViewReleased(View releasedChild, float xvel, float yvel) {
        super.onViewReleased(releasedChild, xvel, yvel);
        //判断mainView的left是否是大于一半
        if(mainView.getLeft()>dragRange/2){
            //滑到右边
            viewDragHelper.smoothSlideViewTo(mainView,dragRange,0);
            //刷新操作
            ViewCompat.postInvalidateOnAnimation(SlideMenu.this);
    
            //Scroller的写法
            //scroller.startScroll();
            //invalidate();
    
        }else {
            //滑到左边
            viewDragHelper.smoothSlideViewTo(mainView,0,0);
            //刷新操作
            ViewCompat.postInvalidateOnAnimation(SlideMenu.this);
        }
    }
    

猜你喜欢

转载自blog.csdn.net/blue_rose_L/article/details/53227848