Android右滑关闭当前页面实现 by fostion

ViewDragHelper介绍

ViewDragHelper使用

拦截触碰事件:

    @Override
    public boolean onInterceptTouchEvent(MotionEvent ev) {
        return mViewDragHelper != null ? mViewDragHelper.shouldInterceptTouchEvent(ev) 
                                                          : super.onInterceptTouchEvent(ev);
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        if (mViewDragHelper != null) {
            mViewDragHelper.processTouchEvent(event);
        }
        return true;
    }

事件处理

    @Override
      public boolean tryCaptureView(View child, int pointerId) {
       return child == mContentView;//只有第一个子view才可以移动
     }

    @Override
    protected void onLayout(boolean changed, int l, int t, int r, int b) {
        super.onLayout(changed, l, t, r, b);
        //获取需要拖动的宽度
        mContentWidth = mContentView.getWidth();
    }

    @Override
    protected void onFinishInflate() {
        super.onFinishInflate();
        if (getChildCount() != 1) {
            throw new IllegalStateException("SwipeBackLayout only have one child view");
        }
        mContentView = getChildAt(0);
    }
    /**
     * 记录向左移动的值
     */
    @Override
    public void onViewPositionChanged(View changedView, int left, int top, int dx, int dy) {
    mMoveLeft = left;
    if (isClose && (left == mContentWidth)) {
    if (mDragCallBack != null) {
        mDragCallBack.onDrag();
            }
          }
        }
    /**
     * 手指释放view触发效果:
     * 若是距离不够就弹回去
     */
    @Override
      public void onViewReleased(View releasedChild, float xvel, float yvel) {
      //借助computeScroll方法 移动距离大于四分之一将会关闭否则弹回
      if (mMoveLeft >= (mContentWidth / 4)) {
          //划出屏幕
          isClose = true;
          mViewDragHelper.settleCapturedViewAt(mContentWidth, releasedChild.getTop());
       } else {
           //返回原来位置
            isClose = false;
            mViewDragHelper.settleCapturedViewAt(0, releasedChild.getTop());
            }
            invalidate();
       }

      @Override
      public int clampViewPositionHorizontal(View child, int left, int dx) {
         return Math.min(mContentWidth, Math.max(left, 0));
      }

      @Override
         public int getViewHorizontalDragRange(View child) {
         return mContentWidth;
      }
    @Override
    public void computeScroll() {
        super.computeScroll();
        if (mViewDragHelper != null && mViewDragHelper.continueSettling(true)) {
            invalidate();
        }
    }
    backLayout.setDragCallBack(new SwipeBackLayout.DragCallBack() {
            @Override
            public void onDrag() {
                finish();
            }
     });

xiaoguotupian