Android自定义滑动删除效果的实现代码

  

先给大家展示下效果图,如果感觉不错,请参考实现代码:

  

 Android自定义滑动删除效果的实现代码

  

  

最近项目中需要用到滑动删除,然后去网上搜了一下,发现现有网上的各种解决办法各式各样,但是还是找不到一个能将所有细节和逻辑处理好的,至于滑动删除部分,我觉得处理的相对比较好的是QQ(包括处理各种逻辑和细节);最终,苦寻无果,于是决定自己动手,丰衣足食

  

这篇文章将从现有Android滑动删除的痛,点到搭建好一个基本的框架,到最终提供一份完整的演示为止,争取为读者提供最大的可定制化
  

  

  

  

(1)。现有资料中的不足

  

笔者参阅了网上的一些博客,发现,这些博客中大多能够基本实现滑动删除,但是存在的问题是,对于面向用户实际使用而言,却是远远不够的大多数博客实现的只是当手向下指的时候,通过判断左右滑动和上下滑动的距离之比来判断项是否应该滑动;但是有一个问题就是,用户下来的时候获得焦点的项目,但是移动的时候手指离开了该物品的时候应该如何处理呢& # 63;按照正常的用户逻辑,这时仍然应该是该项目处理滑动事件最重要和最难的部分当然也是滑动冲突了,即不管使用RecyclerView还是使用ListView实现,其都存在处理上下滑动和左右滑动的冲突问题,很明显的是我们不能一味地拦截所有事件,因为对于上下滑动事件还需要交给RecyclerView/视图来实现正常的上下滑动;滑动冲突部分如果处理不好的话会出现很明显的卡顿现象,同时也会出现不符合用户心理预期的响应,而这些都是用户不友好的
  

  

另外,现有的资料都是在自己的代码实现上讲解的,对于实现正真的定制化还是很有难度的,当我们想要实现自己想要的功能时,我们还需要去看懂一些不相关的处理逻辑
  

  

(2)。需要处理的细节

  

我一直觉得QQ在处理滑动删除上做的是相对比较好的,特别是从各种细节处理上,它基本上都能给出符合用户心理预期的响应,这里也是以QQ为例来介绍几种需要注意和处理的细节;当然,需要注意的地方很多,一一例举不太现实,具体的还是需要自己动手啦
  

  

侧滑过程中,下降时得到焦点的物品在移动过程中失去了焦点应该怎么处理& # 63;(即对应上面的现有资料中的不足中的第2项),如下图所示,手向下指的时候得到焦点的是项7,但是之后手指在移动过程中,7项失去了焦点,正如上面所说,此时还是应该交由该项目7处理滑动事件(如果在下来的时候已经判为侧滑的话)

  

 Android自定义滑动删除效果的实现代码”>,</p>
  <p>如果当前正有项目在侧滑,那么RecyclerView就不能再同时上下滑动<br/>
  如果当前有项处于打开状态,那么在下一次下来的时候应该先将其关闭,同时在上之前,移动事件都应该是无效的(对于这种情况,也可以按照自己的逻辑处理,如:如果当前有项处于打开状态,那么在下一次下来的时候应该先将其关闭,但是在关闭之后,在上之前出现的移动事件也应该响应)<br/>
  在一次下降→移动…移动→起来的完整过程中,一旦初始判断决定了应该是上下滑动或者项目的左右滑动之后,在移动过程中就不能改变,直至下一次新的判断过程为止(这种情况容易出现在用户在一次过程中反复的上下滑动时突然来一次左右滑动(或者反复的左右滑动过程中,突然来一次上下滑动))<br/>
  </p>
  <p> </p>
  <p> (1)。使用RecyclerView搭建框架</p>
  <p> <强> 1。预备知识</强> </p>
  <p> RecyclerView对外提供的接口已经比较完善,所以不需要再去继承RecyclerView来监听其MotionEvent事件<br/>
  可以通过RecyclerView的addOnItemTouchListener()方法来实现对所有MotionEvent的拦截,其需要传入一个RecyclerView。OnItemTouchListener对象,这是一个接口,需要我们自己来实现逻辑,这里笔者写了一个大致的演示先来看看其各个方法之间的联系<br/>
  </p>
  
  <pre类=   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);   无效();   }   }   }

Android自定义滑动删除效果的实现代码