获取被拖动项目的连续屏幕位置 (ItemTouchHelper)

Get continuous screen position off item being dragged (ItemTouchHelper)

我正在使用 ItemTouchHelper 创建一个可拖动和可轻扫的回收视图(详见此处 https://github.com/iPaulPro/Android-ItemTouchHelper-Demo

我查看了 ItemTouchHelper 和 ItemTouchHelper.callback 的所有方法,但似乎没有任何方法可以提供我的手指或项目在拖动时的实时屏幕位置。如果有人可以提供帮助,那将是救命稻草!

我最终不得不进入 Recyclerview V7 jar 并从 ItemTouchHelper 中获取代码并创建我自己的 ItemTouchHelper 版本: 我将自己的方法添加到 ItemTouchHelper.Callback

        public abstract void onTouchMovement(MotionEvent touch_event, int directionFlags, int pointerIndex);

我在ItemTouchHelper的updateDxDy方法中调用onTouchMovement:

 public void updateDxDy(MotionEvent ev, int directionFlags, int pointerIndex) {
    final float x = MotionEventCompat.getX(ev, pointerIndex);
    final float y = MotionEventCompat.getY(ev, pointerIndex);

    mCallback.onTouchMovement(ev, directionFlags, pointerIndex);

现在,每当我创建一个 ItemTouchHelper.Callback 时,它都带有 OnTouchMovement,它提供 drag/swipe

每个点的位置

也可以查看ItemTouchHelper内部的OnInterceptTouchEvent方法进行反馈

 private final RecyclerView.OnItemTouchListener mOnItemTouchListener
        = new RecyclerView.OnItemTouchListener() {
    @Override
    public boolean onInterceptTouchEvent(RecyclerView recyclerView, MotionEvent event) {
        mGestureDetector.onTouchEvent(event);
        if (DEBUG) {
            Log.d(TAG, "intercept: x:" + event.getX() + ",y:" + event.getY() + ", " + event);
        }
        final int action = MotionEventCompat.getActionMasked(event);
        if (action == MotionEvent.ACTION_DOWN) {
            mActivePointerId = MotionEventCompat.getPointerId(event, 0);
            mInitialTouchX = event.getX();
            mInitialTouchY = event.getY();
            obtainVelocityTracker();
            if (mSelected == null) {
                final RecoverAnimation animation = findAnimation(event);
                if (animation != null) {
                    mInitialTouchX -= animation.mX;
                    mInitialTouchY -= animation.mY;
                    endRecoverAnimation(animation.mViewHolder, true);
                    if (mPendingCleanup.remove(animation.mViewHolder.itemView)) {
                        mCallback.clearView(mRecyclerView, animation.mViewHolder);
                    }
                    select(animation.mViewHolder, animation.mActionState);
                    updateDxDy(event, mSelectedFlags, 0);
                }
            }
        } else if (action == MotionEvent.ACTION_CANCEL || action == MotionEvent.ACTION_UP) {
            wdwdwd
            mActivePointerId = ACTIVE_POINTER_ID_NONE;
            select(null, ACTION_STATE_IDLE);
        } else if (mActivePointerId != ACTIVE_POINTER_ID_NONE) {
            // in a non scroll orientation, if distance change is above threshold, we
            // can select the item
            final int index = MotionEventCompat.findPointerIndex(event, mActivePointerId);
            if (DEBUG) {
                Log.d(TAG, "pointer index " + index);
            }
            if (index >= 0) {
                checkSelectForSwipe(action, event, index);
            }
        }
        if (mVelocityTracker != null) {
            mVelocityTracker.addMovement(event);
        }
        return mSelected != null;
    }