**上下文:**我正在使用滑动操作(日期、完成、删除、设置)实现ItemTouchHelper。我有getSwipeThreshold()
return .2f。这意味着我需要水平 * 拖动 * 2/10的距离才能滑动。我这样做是为了超过该阈值将更改背景状态(例如,完整视图)。再向前,4/10的距离将再次更改背景状态(例如,日期视图)。这些更改仅在isCurrentlyActive()
期间调用(即,当用户的手指触摸项目时)。请参见下面的代码。
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);
}
}
}
**问题:**拖动正常,但投掷无法正常工作。当我在阈值之前 * 投掷 * 并抬起手指时,由于速度的原因,它会提前滑动。问题是背景不会改变,除非我的手指通过阈值。
***问题:***如何防止在手指超过滑动阈值之前甩击开始滑动?
(Or也许我问错了问题,有没有更好的方法来同步投掷和滑动阈值,从而在正确的时间改变背景状态?)
2条答案
按热度按时间tuwxkamq1#
我发现对我自己来说最简单的方法是实现自己的
ItemTouchHelper
。要执行此操作,只需打开原始
ItemTouchHelper
,按Ctrl+A
选择整个文件,然后右键单击选择**“复制为纯文本”**(如果你不想出现额外的问题,这一点很重要)。在此之后,只需粘贴到你自己的文件中,并确保设置正确的包名。另外,对于我自己来说,我必须以同样的方式再复制一个名为ItemTouchUIUtilImpl
的类,并确保我的ItemTouchHelper
使用它。**最后一个技巧:**要真正禁用fling,你只需要找到名为
obtainVelocityTracker()
的方法,并删除或注解初始化mVelocityTracker
的行。就这么定了。
请确保从现在开始使用自己的
ItemTouchHelper
。nc1teljy2#
您可以根据需要通过划分dX参数来控制视图的滑动量。如果是全dX,则会完全滑动并退出,如果小于该值,则只会水平滑动到该值。如果要滑动宽度的四分之一,请参见下文: