ItemTouchHelper源码分析 手势分析OnTouchEvent

ItemTouchHelper手势的实现都在匿名内部类mOnItemTouchListener中实现,

private final OnItemTouchListener mOnItemTouchListener
            = new OnItemTouchListener()

onInterceptTouchEvent在mSelect不为空的时候(找到对应的接管vh,并执行过select方法)会返回true 拦截处理所有TouchEvent 分析见手势入口分析


拦截之后OnTouchEvent的处理

        @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) {
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值