最终的效果图是这样的
要实现这样的一个效果,用到的关键技术: 自定义view的基本知识+事件处理+其它知识
我们可以把右边的操作选项抽象出来数据对象即可,对于老司机的你们一看就懂。
1.SwipeMenuView的简单扩展(自定义view的一种吧)
说白了就是继承LinearLayout 加了一个回调接口,对于老司机的你们一看又懂了。对于SwipeMenuLayout是什么,我们后面会讲的,别着急吗?嘻嘻
SwapWrapperUtils.wrap 这个方法这里就不说了就是LayoutInflater加载布局。
讲用户的itemview这里我们叫Contentview,以及操作view我们叫MenuView,添加到这个FrameLayout上
设置初始状态
我们要测量menuview的宽,高度就是Contentview的高。 我们要布局menuview,在Contentview的右侧。 如图:
控制滑动
在android中根据滑动来控制view有好多种,这里我们用layout方法 主要就是在recycleview滑动时找到其中一条的位置position在ontouch方法中合适的时机将事件传到该view上。什么时候触发这个方法呢 ,下文会说recycleview的处理事件。
我们写一个方法将事件传递到此view上来控制menuView和contentView
打开与关闭
借助computeScroll方法来不停的layout设置位置,代码都对于位置的计算有注释,生怕解释不清楚。
三.RecyclerView的时间处理
首先我们要明白一点就是:我们要影响用户原来的item的点击与长按等事件。
我们肯定要重新事件的拦截与处理方法。即onInterceptTouchEvent 与onTouchEvent方法。我们需要在这2个方法里做如下的处理。
找到了pos位置就可以 View view = getChildAt(mTouchPosition - mFirstPosition);
来获取那个view了,就可以进行事件的处理了。 child.getHitRect方法 ,我们看下sdkapi的注释:
onInterceptTouchEvent 拦截 onTouch的处理 的搞基生活
down拦截的时候:
然后在onTouchEven方法里处理down:
move拦截的时候:
达到滑动的临界值就可以拦截了return true了。
mTouchSlop = ViewConfiguration.get(getContext()).getScaledTouchSlop();
然后在onTouchEven方法里处理move:如果是左右我们才处理,否则拜拜了您。
最后up事件就简单了不需要拦截,无非就是TOUCH_STATE_X状态交给我们之前的SwipeMenuLayout处理打开还是关闭,以及一些变量的初始化。
到此整个实现就完了。
这里只分析一些核心的关键技术,其它的都能看懂。
代码下载地址:
https://github.com/ta893115871/SwapMenuRecyclerView