上下文:我正在使用滑动操作(日期,完成,删除,设置)实现ItemTouchHelper。我getSwipeThreshold()
返回.2f。这意味着我需要拖动水平2/10的方式进行滑动。我这样做是为了通过该阈值会改变背景状态(例如完整视图)。走得更远,4月10日,将再次改变它(例如日期视图)。这些更改仅在isCurrentlyActive()
期间(即用户时)调用
s手指触摸项目)。请参阅下面的代码。
public float getSwipeThreshold(RecyclerView.ViewHolder viewHolder) {
return .2f;
}
public void onChildDraw(Canvas c, RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, float dX, float dY, int actionState, boolean isCurrentlyActive) {
getDefaultUIUtil().onDraw(c, recyclerView, ((SwipeableHolder) viewHolder).getSwipeableView(), dX, dY, actionState, isCurrentlyActive);
if (isCurrentlyActive) {
SwipeAdapter.SwipeableHolder holder = (SwipeAdapter.SwipeableHolder)viewHolder;
float swipeFraction = dX / viewHolder.itemView.getWidth();
// Far Left
if (swipeFraction > 0.4f) {
mSwipeState = SWIPE_STATE_DATE;
holder.setSwipeState(SWIPE_STATE_DATE);
// Close Left
} else if (swipeFraction > 0.2f){
mSwipeState = SWIPE_STATE_COMPLETE;
holder.setSwipeState(SWIPE_STATE_COMPLETE);
// Far Right
} else if (swipeFraction < -0.4f) {
mSwipeState = SWIPE_STATE_SETTINGS;
holder.setSwipeState(SWIPE_STATE_SETTINGS);
// Close Right
} else if (swipeFraction < -0.2f) {
mSwipeState = SWIPE_STATE_DELETE;
holder.setSwipeState(SWIPE_STATE_DELETE);
}
}
}
问题:虽然拖动工作正常,但投掷却没有。当我 fling 并在阈值之前抬起我的手指时,它会因速度而过早滑动。问题是除非我的手指超过阈值,否则背景不会改变。
问题: 如果我的手指超过滑动阈值,我该如何防止开始滑动?
(或者我可能会问错误的问题,有一种更好的方法可以将滑动与滑动阈值同步,从而在正确的时间改变背景状态?)
答案 0 :(得分:0)
我发现对自己来说最简单的方法是实现自己的 ItemTouchHelper
。
为此,只需打开原始 ItemTouchHelper
,按 Ctrl+A
选择整个文件,然后右键单击选择 “复制为纯文本”(如果您不想要额外的问题)。之后只需粘贴到您自己的文件中,并确保设置正确的包名称。此外,对于我自己,我必须以同样的方式复制另一个名为 ItemTouchUIUtilImpl
的类,并确保我的 ItemTouchHelper
使用它。
最后一招:
要真正禁用 fling,您只需找到名为 obtainVelocityTracker()
的方法并删除或注释 mVelocityTracker
被初始化的行。像这样:
void obtainVelocityTracker() {
if (mVelocityTracker != null) {
mVelocityTracker.recycle();
}
// mVelocityTracker = VelocityTracker.obtain();
}
大功告成。
确保您从现在开始使用自己的 ItemTouchHelper
。