沉舟侧畔千帆进,病树前头万木春。这篇文章主要讲述Android开发 在不使用ItemTouchHelper的情况下实现ItemView的左右滑动相关的知识,希望能为你提供帮助。
前言在我的博客里有介绍过ItemTouchHelper的使用,也介绍过滑动的实现。但是使用ItemTouchHelper有一个问题,它会拦截到View的2到3次的点击事件。虽然多点几次后点击事件会恢复。但是这样的体验十分不好。所以,为了规避这个问题。我自行实现了itemView的左右滑动效果。
代码【Android开发 在不使用ItemTouchHelper的情况下实现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
推荐阅读
- Android开发(JavaDoc注释插件简单使用介绍)
- Android - Thread Handler HandlerThread Looper MessageQueue理解
- whatsapp 印度使用 无法登陆 显示时钟 无法连接 无网络 解决办法 时间不对 调整 上不了
- Android ListView 的使用 Kotlin
- MybatisPlus-通用Mapper
- APP 开发从 0 到 1需求与准备
- Automapper忽略映射某字段的映射写法
- unity3d与android开发真实手柄连接
- appium-解决uiautomatorviewer不能定位android7以上版本元素的方法