liuguangqiang / SwipeBack

SwipeBack is an android library that can finish a activity by using gesture.
Apache License 2.0
1.74k stars 314 forks source link

chkDragable(), 有问题 #45

Open yzykami opened 6 years ago

yzykami commented 6 years ago

private void chkDragable() { setOnTouchListener(new View.OnTouchListener() { @Override public boolean onTouch(View view, MotionEvent motionEvent) {

             if (motionEvent.getAction() == MotionEvent.ACTION_DOWN) {
                 lastY = motionEvent.getRawY();
                 lastX = motionEvent.getRawX();
             } else if (motionEvent.getAction() == MotionEvent.ACTION_MOVE) {
                 newY = motionEvent.getRawY();

---------------------"lastX = motionEvent.getRawX();"------------------------

                 offsetY = Math.abs(newY - lastY);
                 lastY = newY;

                 offsetX = Math.abs(newX - lastX);
                 lastX = newX;

                 switch (dragEdge) {
                     case TOP:
                     case BOTTOM:
                         setEnablePullToBack(offsetY > offsetX);
                     case LEFT:
                     case RIGHT:
                         setEnablePullToBack(offsetY < offsetX);
                         break;
                 }
             }

             return false;
         }
     });
  }           

}

标注的地方, 应该是 newX = motionEvent.getRawX(); 但是修改之后, 拖拽就失效了

WarpGateX commented 6 years ago

我这对做了些处理,拖拽失效我看了下,应该是ViewDragHelper 中 tryCaptureViewForDrag()方法里获取mCallback.tryCaptureView()的回调判断在 Touch方法之前先执行而在newX = motionEvent.getRawX();之后若有false返回一次,那下一次一直就以false返回,onInterceptTouchEvent() 就一直返回false,导致拖拽失效。

我这边的处理 @Override public boolean onInterceptTouchEvent(MotionEvent ev) { boolean handled = false; ensureTarget(); checkPullBack(ev);//在这里加上touch方法里的偏移判断 if (isEnabled()) { handled = viewDragHelper.shouldInterceptTouchEvent(ev); } else { viewDragHelper.cancel(); } return !handled ? super.onInterceptTouchEvent(ev) : handled; }