先给大家展示下效果图,如果感觉不错,请参考实现代码:
最近项目中需要用到滑动删除,然后去网上搜了一下,发现现有网上的各种解决办法各式各样,但是还是找不到一个能将所有细节和逻辑处理好的,至于滑动删除部分,我觉得处理的相对比较好的是QQ(包括处理各种逻辑和细节);最终,苦寻无果,于是决定自己动手,丰衣足食
这篇文章将从现有Android滑动删除的痛,点到搭建好一个基本的框架,到最终提供一份完整的演示为止,争取为读者提供最大的可定制化
(1)。现有资料中的不足
笔者参阅了网上的一些博客,发现,这些博客中大多能够基本实现滑动删除,但是存在的问题是,对于面向用户实际使用而言,却是远远不够的大多数博客实现的只是当手向下指的时候,通过判断左右滑动和上下滑动的距离之比来判断项是否应该滑动;但是有一个问题就是,用户下来的时候获得焦点的项目,但是移动的时候手指离开了该物品的时候应该如何处理呢& # 63;按照正常的用户逻辑,这时仍然应该是该项目处理滑动事件最重要和最难的部分当然也是滑动冲突了,即不管使用RecyclerView还是使用ListView实现,其都存在处理上下滑动和左右滑动的冲突问题,很明显的是我们不能一味地拦截所有事件,因为对于上下滑动事件还需要交给RecyclerView/视图来实现正常的上下滑动;滑动冲突部分如果处理不好的话会出现很明显的卡顿现象,同时也会出现不符合用户心理预期的响应,而这些都是用户不友好的
另外,现有的资料都是在自己的代码实现上讲解的,对于实现正真的定制化还是很有难度的,当我们想要实现自己想要的功能时,我们还需要去看懂一些不相关的处理逻辑
(2)。需要处理的细节
我一直觉得QQ在处理滑动删除上做的是相对比较好的,特别是从各种细节处理上,它基本上都能给出符合用户心理预期的响应,这里也是以QQ为例来介绍几种需要注意和处理的细节;当然,需要注意的地方很多,一一例举不太现实,具体的还是需要自己动手啦
侧滑过程中,下降时得到焦点的物品在移动过程中失去了焦点应该怎么处理& # 63;(即对应上面的现有资料中的不足中的第2项),如下图所示,手向下指的时候得到焦点的是项7,但是之后手指在移动过程中,7项失去了焦点,正如上面所说,此时还是应该交由该项目7处理滑动事件(如果在下来的时候已经判为侧滑的话)
recyclerView。addOnItemTouchListener(新RecyclerView.OnItemTouchListener () { @Override 公共布尔> 公开课MyRelativeLayout RelativeLayout{延伸 私人照片卷轴照片卷轴; 公共MyRelativeLayout(上下文语境){ 超级(上下文); init(上下文); } 公共MyRelativeLayout(上下文语境,AttributeSet attrs) { 超级(上下文,attrs); init(上下文); } 公共MyRelativeLayout(上下文语境、AttributeSet attrs int defStyleAttr) { 超级(上下文、attrs defStyleAttr); init(上下文); } @RequiresApi (api=Build.VERSION_CODES.LOLLIPOP) 公共MyRelativeLayout(上下文语境、AttributeSet attrs int defStyleAttr, int defStyleRes) { 超级(上下文、attrs defStyleAttr defStyleRes); init(上下文); } 私人空间init(上下文语境){ 照片卷轴=new照片卷轴(上下文); } 公共空间onScroll (int dx) { 如果(this.getScrollX () !=0) { scroller.startScroll (this.getScrollX (), 0, dx, 0); 无效(); } } @Override 公共空间computeScroll () { super.computeScroll (); 如果(scroller.computeScrollOffset ()) { this.scrollTo (scroller.getCurrX (), 0); 无效(); } } }