【问题标题】:Get continuous screen position off item being dragged (ItemTouchHelper)获取被拖动项目的连续屏幕位置 (ItemTouchHelper)
【发布时间】:2015-09-25 08:34:24
【问题描述】:

我使用一个ItemTouchHelper来创建一个可拖动和可滑动的recyclerview(这里详述https://github.com/iPaulPro/Android-ItemTouchHelper-Demo

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

【问题讨论】:

    标签: android android-recyclerview drag


    【解决方案1】:

    我最终不得不进入 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,它提供拖动/滑动每个点的位置

    【讨论】:

      【解决方案2】:

      您也可以查看 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;
          }
      

      【讨论】:

      • 你应该把你的两个答案合二为一。
      猜你喜欢
      • 1970-01-01
      • 2019-03-04
      • 2019-12-08
      • 1970-01-01
      • 1970-01-01
      • 2021-01-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多