高仿微信对话列表滑动删除效果

前言

用过微信的都知道。微信对话列表滑动删除效果是非常不错的,这个效果我们也能够有。

思路事实上非常easy,弄个ListView。然后里面的每一个item做成一个能够滑动的自己定义控件就可以。由于ListView是上下滑动而item是左右滑动,因此会有滑动冲突。或许你须要了解下android中点击事件的派发流程,请參考Android源代码分析-点击事件派发机制。我的解决思路是这种:重写ListView的onInterceptTouchEvent方法,在move的时候做推断,假设是左右滑动就返回false。否则返回true;重写SlideView(即自己定义item控件)的onTouchEvent方法来处理滑动。

整个思路没有问题。滑动冲突也攻克了,但是ListView无法得到焦点了,也就是ListView无法处理点击事件了。让我们回忆下问题出在哪里:我的理解是这种。上述处理滑动本身没有问题,但是有一个副作用。就是会让外层View失去焦点且无法处理点击事件。

常见的滑动冲突场景。比方launcher内部嵌入ListView却是没有问题的,由于这个时候launcher不须要获得焦点,须要获得焦点的是内部的ListView。

因此,上述处理方式对于外部须要获得焦点的情况(比方外部是ListView)就不太适合了。于是我就和ttdevs探讨,发现他採用了第二种思路。我从来没有想过还能够这样玩。以下介绍他的思路。

新的思路

不考虑那么复杂,不採用主流玩法,全部的事件均由外层的ListView做拦截,同一时候把事件传递给SlideView做滑动,这样的实现的确能够达到效果,并且代码非常easy,根本不须要处理什么复杂的滑动冲突。

效果

以下分别为微信和高仿效果

高仿微信对话列表滑动删除效果

代码分析

先看SlideView是怎样实现的

看layout xml:

<com.macc.firstsecretary_UI.ListViewCompat
        android:
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="#fff4f7f9"
        android:cacheColorHint="#00000000"
        android:divider="#dddbdb"
        android:dividerHeight="1.0px"
        android:drawSelectorOnTop="false"
        android:listSelector="@android:color/transparent"
        android:scrollbars="none" />


再看com.macc.firstsecretary_UI.ListViewCompat类的代码:

								

相关推荐