@Override
public boolean onInterceptTouchEvent(RecyclerView rv, MotionEvent e) {
if(!mCallback.isEnable())
return false;
int action = MotionEventCompat.getActionMasked(e);
int x = (int) e.getX();
int y = (int) e.getY();
/*
* 當我們沒有發生drag事件的時候cancel或up事件會發生interceptTouchEvent裏面,如果TargetView等於空的時候直接
* 返回false,不攔截事件
* */
if(action == MotionEvent.ACTION_CANCEL || action == MotionEvent.ACTION_UP)
if(mTargetView == null)
return false;
boolean needIntercept = false;
switch (action) {
case MotionEvent.ACTION_DOWN:
mActivePointerId = MotionEventCompat.getPointerId(e, 0);
mLastX = (int) e.getX();
mLastY = (int) e.getY();
//查找需要顯示菜單的view;
mTargetView = mCallback.findTargetView(x, y);
/*
* 如果正在動畫則攔截事件
* */
if (mExpandAndCollapseAnim != null) {
//mExpandAndCollapseAnim.cancel();
mExpandAndCollapseAnim = null;
needIntercept = true;
}
break;
case MotionEvent.ACTION_MOVE:
int deltaX = (x - mLastX);
int deltaY = (y - mLastY);
if(Math.abs(deltaY) > Math.abs(deltaX))
return false;
//如果移動距離達到要求,則攔截
needIntercept = mIsDragging = mTargetView != null && Math.abs(deltaX) >= mTouchSlop;
break;
case MotionEvent.ACTION_CANCEL:
case MotionEvent.ACTION_UP:
/*
* 當壹個up事件發生在正常的範圍內且scrollX等於scrollRange則折疊view並攔截UP事件
* 防止view響應點擊事件
* */
if(isExpanded()){
if (inView(x, y)) {
//攔截事件,防止targetView執行onClick事件
needIntercept = true;
}else{
//如果走這那行這個ACTION_UP的事件會發生在右側的菜單中
}
//折疊菜單
mTargetView.setScrollX(0);
}
dispatchCollapsedOrExpanded();
break;
}
return needIntercept && mTargetView != null;
}