• Android开发 在不使用ItemTouchHelper的情况下实现ItemView的左右滑动


    前言

      在我的博客里有介绍过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

  • 相关阅读:
    一本通 1261:【例9.5】城市交通路网
    一本通 1263:【例9.7】友好城市(数据较弱)
    洛谷 P2983 [USACO10FEB]购买巧克力Chocolate Buying
    一本通 1266:【例9.10】机器分配
    【BZOJ5417】你的名字(NOI2018)-后缀自动机+主席树
    【BZOJ1396】识别子串-后缀自动机+线段树
    【HDU4787】GRE Words Revenge-AC自动机+分块
    【51Nod1766】树上的最远点对-线段树+树的直径
    【BZOJ3648】寝室管理-环套树+点分治+树状数组
    【BZOJ1367】Sequence(Baltic2004)-贪心+左偏树
  • 原文地址:https://www.cnblogs.com/guanxinjing/p/13255968.html
Copyright © 2020-2023  润新知