【问题标题】:Get continuous screen position off item being dragged (ItemTouchHelper)获取被拖动项目的连续屏幕位置 (ItemTouchHelper)
【发布时间】:2015-09-25 08:34:24
【问题描述】:
【问题讨论】:
标签:
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;
}