美文网首页Android自定义ViewAndroid 自定义view程序员
ViewDragHelper你离酷炫拖动效果只差5步

ViewDragHelper你离酷炫拖动效果只差5步

作者: CoorChice | 来源:发表于2016-10-27 14:19 被阅读756次

    使用ViewDragHelper需要5个步骤

    一、使用静态工厂法实例化一个ViewDragHelper对象

    /**
         * 该方法用于实例化ViewDragHelper对象
         */
        private void init() {
            mViewDragHelper = ViewDragHelper.create(this, callback);  //实例化ViewDragHelper对象
        }
    

    二、创建上面使用的callback参数

    该参数是ViewDragHelper.Callback类型的,这里需要通过匿名内部类来重写至少以下4个方法

    private ViewDragHelper.Callback callback = new ViewDragHelper.Callback() {
           /**
            * 该方法用于捕获ViewGroup中需要被移动的View。
            * @param child
            * @param pointerId
            * @return 使用判断来返回需要被ViewDragHelper的子view是哪一个
            */
           @Override
         1.  public boolean tryCaptureView(View child, int pointerId) {
               showLog("tryCaptureView()");
               return mView0 == child;  //捕获需要拖动的view
           }
    
           @Override
         2.  public int clampViewPositionVertical(View child, int top, int dy) {
               showLog("clampViewPositionVertical()");
               return 0;
           }
    
           /**
            * @param child
            * @param left  表示系统认为的水平方向需要移动多少
            * @param dx 表示水平方向上移动了多少距离
            * @return 返回left则跟着手指在水平方向上移动
            */
           @Override
         3.  public int clampViewPositionHorizontal(View child, int left, int dx) {
               showLog("left = " + left);
               return left;
           }
    
           /**
            * 该方法会在手指抬起后回调,决定了view的移动。
            * @param releasedChild
            * @param xvel 表示水平方向的移动速度
            * @param yvel 表示垂直方向的移动速度
            */
           @Override
         4.  public void onViewReleased(View releasedChild, float xvel, float yvel) {
               showLog("onViewReleased()");
               super.onViewReleased(releasedChild, xvel, yvel);
               if (mView0.getLeft()<500){
                   //距离不足,关闭菜单
                   mViewDragHelper.smoothSlideViewTo(mView0,0,0); //丝滑的滑动view到(0,0)位置
                   ViewCompat.postInvalidateOnAnimation(DragHelperView.this); //重绘viewGroup
               } else {
                   //距离足够,打开菜单
                   mViewDragHelper.smoothSlideViewTo(mView0,300,0);
                   ViewCompat.postInvalidateOnAnimation(DragHelperView.this);
               }
           }
       };
    

    三、获得要操作的View及view的尺寸

        /**
         * 该方法在填充布局后调用,用于获取到布局中的子view。
         */
        @Override
        protected void onFinishInflate() {
            super.onFinishInflate();
            mView0 = getChildAt(0);
            mView1 = getChildAt(1);
        }
    
        /**
         * 该方法是为了获得view的尺寸
         * @param w
         * @param h
         * @param oldw
         * @param oldh
         */
        @Override
        protected void onSizeChanged(int w, int h, int oldw, int oldh) {
            super.onSizeChanged(w, h, oldw, oldh);
            mWidth = mView0.getMeasuredWidth(); //获得view的宽
        }
    

    四、重写computeScroll()方法来实现滑动

    这有点像Scroller的使用

        @Override
        public void computeScroll() {
            super.computeScroll();
            if (mViewDragHelper.continueSettling(true)){ //判断view是否在继续移动
                ViewCompat.postInvalidateOnAnimation(this);  //是,刷新重绘viewGroup
            }
        }
    

    五、拦截触摸事件,并且交给ViewDragHelper对象处理

        @Override
        public boolean onInterceptTouchEvent(MotionEvent ev) {
    
            return mViewDragHelper.shouldInterceptTouchEvent(ev); //拦截处理触摸事件,并传递给ViewDragHelper
        }
    
        @Override
        public boolean onTouchEvent(MotionEvent event) {
            mViewDragHelper.processTouchEvent(event);  //将触摸事件传递给ViewDragHelper处理
            return true;
        }
    

    如果你觉得还不错,那就动动小捶捶敲个关注、点个赞哦😘!

    相关文章

      网友评论

      本文标题:ViewDragHelper你离酷炫拖动效果只差5步

      本文链接:https://www.haomeiwen.com/subject/kxxsuttx.html