ItemTouchHelper手势的实现都在匿名内部类mOnItemTouchListener中实现,
private final OnItemTouchListener mOnItemTouchListener
= new OnItemTouchListener()
onInterceptTouchEvent在mSelect不为空的时候(找到对应的接管vh,并执行过select方法)会返回true 拦截处理所有TouchEvent 分析见手势入口分析
@Override
public void onTouchEvent(RecyclerView recyclerView, MotionEvent event) {
mGestureDetector.onTouchEvent(event); //主要实现onLongPress的监听
//监听实现在内部类ItemTouchHelperGestureListener 判定长按选中的vh
if (DEBUG) {
Log.d(TAG,
"on touch: x:" + mInitialTouchX + ",y:" + mInitialTouchY + ", :" + event);
}
if (mVelocityTracker != null) {
mVelocityTracker.addMovement(event);
}
if (mActivePointerId == ACTIVE_POINTER_ID_NONE) {
return;
}
final int action = MotionEventCompat.getActionMasked(event); //取action
final int activePointerIndex = event.findPointerIndex(mActivePointerId);
if (activePointerIndex >= 0) { //若pointerId合法不为-1
checkSelectForSwipe(action, event, activePointerIndex); //检查是否是一个Swipe手势 具体分析见前一篇ItemTouchHelper手势入口的分析
}
ViewHolder viewHolder = mSelected;
if (viewHolder == null) {
return;
}
switch (action) {
case MotionEvent.ACTION_MOVE: {
// Find the index of the active pointer and fetch its position
if (activePointerIndex >= 0) {
updateDxDy(event, mSelectedFlags, activePointerIndex); //更新距离down的触摸点滚动偏移
//mInitialTouchX mInitialTouchY在onInterceptTouchEvent down的时候
//与监听实现在内部类ItemTouchHelperGestureListener的onLongPress监听的时候赋值
moveIfNecessary(viewHolder); //判断是否需要回调onMove onSwipe
mRecyclerView.removeCallbacks(mScrollRunnable); //mScrollRunnable递归调用屏幕边缘拖拽处理 另有blog讲解
mScrollRunnable.run();
mRecyclerView.invalidate(); //执行RecyclerView的onDraw()方法
}
break;
}
case MotionEvent.ACTION_CANCEL:
if (mVelocityTracker != null) {
mVelocityTracker.clear();
}
// fall through
case MotionEvent.ACTION_UP:
select(null, ACTION_STATE_IDLE); //关键方法 传入null
mActivePointerId = ACTIVE_POINTER_ID_NONE;
break;
case MotionEvent.ACTION_POINTER_UP: {
final int pointerIndex = MotionEventCompat.getActionIndex(event);
final int pointerId = event.getPointerId(pointerIndex);
if (pointerId == mActivePointerId) {
// This was our active pointer going up. Choose a new
// active pointer and adjust accordingly.
final int newPointerIndex = pointerIndex == 0 ? 1 : 0;
mActivePointerId = event.getPointerId(newPointerIndex);
updateDxDy(event, mSelectedFlags, pointerIndex);
}
break;
}
}
}
长按的监听
private class ItemTouchHelperGestureListener extends GestureDetector.SimpleOnGestureListener {
ItemTouchHelperGestureListener() {
}
@Override
public boolean onDown(MotionEvent e) {
return true;
}
@Override
public void onLongPress(MotionEvent e) { //该方法回调前提可在http://blog.csdn.net/sonic_storm/article/details/74452615 里查看
View child = findChildView(e);
if (child != null) {
ViewHolder vh = mRecyclerView.getChildViewHolder(child);
if (vh != null) {