0

上下文:我正在使用滑动操作(日期、完成、删除、设置)实现 ItemTouchHelper。我有getSwipeThreshold()回报 .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);
                }
            }
        }

问题:虽然拖动可以正常工作,但投掷却不能。当我在阈值之前挥动并抬起手指时,由于速度,它会过早滑动。问题是除非我的手指通过阈值,否则背景不会改变。

问题:在我的手指超过滑动阈值之前,如何防止轻拂开始滑动?

(或者也许我问错了问题,有更好的方法来同步滑动阈值,从而在正确的时间改变背景状态?)

4

1 回答 1

0

我发现对自己来说最简单的方法是实现自己的ItemTouchHelper.

为此,只需打开原始文件ItemTouchHelper,按Ctrl+A选择整个文件,然后右键单击选择“复制为纯文本”(如果您不希望出现额外问题,这一点很重要)。在此之后只需粘贴到您自己的文件中并确保设置正确的包名称。另外,对于我自己,我必须以同样的方式复制另一个名为的类ItemTouchUIUtilImpl,并确保我ItemTouchHelper使用它。

最后的技巧: 要真正禁用投掷,您只需找到调用的方法obtainVelocityTracker()并删除或注释mVelocityTracker初始化的行。像这样:

    void obtainVelocityTracker() {
        if (mVelocityTracker != null) {
            mVelocityTracker.recycle();
        }
//        mVelocityTracker = VelocityTracker.obtain();
    }

它完成了。

确保您ItemTouchHelper从现在开始使用自己的。

于 2021-01-19T15:33:17.447 回答