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); } }