观心静

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

前言

  在我的博客里有介绍过ItemTouchHelper的使用,也介绍过滑动的实现。但是使用ItemTouchHelper有一个问题,它会拦截到View的2到3次的点击事件。虽然多点几次后点击事件会恢复。但是这样的体验十分不好。所以,为了规避这个问题。我自行实现了itemView的左右滑动效果。

代码

maxWidth是限制滑动的最大距离,需要传入一个px的值。当然,你可以另外写一个dp转px的实现转换。

    /**
     *
     * @param view 需要左右滑动的ItemView
     * @param maxWidth 最大的滑动宽度
     */
    private void setLeftOrRightSwiped(View view, int maxWidth) {
        view.setOnTouchListener(new View.OnTouchListener() {
            float startX;
            float offsetX;
            float leftOffset;
            float rightOffset;
            boolean isLeft = false;
            @Override
            public boolean onTouch(View v, MotionEvent event) {
                switch (event.getAction()) {
                    case MotionEvent.ACTION_DOWN:
                        startX = event.getX();//获得滑动起始位置
                        break;
                    case MotionEvent.ACTION_MOVE:
                        offsetX = startX - event.getX();
                        isLeft = offsetX > 0; //如果大于0就是左滑动
                        if (offsetX != 0) { //防止没有偏移量滑动
                            if (isLeft) {
                                leftOffset = Math.min(offsetX, maxWidth);//选择最小的值,防止超出最大滚动宽度
                                view.setScrollX((int) leftOffset);
                            } else {
                                if (leftOffset != 0){ //不允许在没有向左滑动的情况下触发向右滑动
                                    rightOffset = Math.max(maxWidth - Math.abs(offsetX), 0);
                                    view.setScrollX((int) rightOffset);
                                }
                            }
                            return true;
                        }
                        break;
                    case MotionEvent.ACTION_UP:
                    case MotionEvent.ACTION_CANCEL:
                        if (offsetX != 0) {//如果偏移量不等0,就执行自动滑动完整的功能,补齐滑动到一半的效果
                            if (isLeft) {
                                leftOffset = leftOffset < maxWidth / 2 ? 0 : maxWidth; //如果左滑动偏移量小与最大滑动宽度的一半就回跳
                                view.setScrollX((int) leftOffset);
                            } else {
                                rightOffset = rightOffset < maxWidth / 2 ? 0 : maxWidth;
                                if (rightOffset == 0){ //右滑动到底了,将左滑动的值清0
                                    leftOffset = 0;
                                }
                                view.setScrollX((int) rightOffset);
                            }
                            return true;//消费这个事件
                        }
                        break;
                    default:
                        break;

                }
                return false;
            }
        });
    }

 

 

End

posted on 2020-07-06 17:36  观心静  阅读(478)  评论(0编辑  收藏  举报