android 项目触摸助手:如何防止“甩”刷直到手指通过刷阈值?

svmlkihl  于 2023-01-19  发布在  Android
关注(0)|答案(2)|浏览(166)

**上下文:**我正在使用滑动操作(日期、完成、删除、设置)实现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也许我问错了问题,有没有更好的方法来同步投掷和滑动阈值,从而在正确的时间改变背景状态?)

tuwxkamq

tuwxkamq1#

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

**最后一个技巧:**要真正禁用fling,你只需要找到名为obtainVelocityTracker()的方法,并删除或注解初始化mVelocityTracker的行。

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

就这么定了。
请确保从现在开始使用自己的ItemTouchHelper

nc1teljy

nc1teljy2#

您可以根据需要通过划分dX参数来控制视图的滑动量。如果是全dX,则会完全滑动并退出,如果小于该值,则只会水平滑动到该值。如果要滑动宽度的四分之一,请参见下文:

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/4, dY, actionState, isCurrentlyActive);

相关问题