获取被拖动项目的连续屏幕位置 (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;
}
我正在使用 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;
}