您的位置:首页 > 其它

联系人左右滑动功能的实现

2013-04-18 10:35 281 查看

实现目标:

仿三星联系人左右滑动,左滑发短信,右滑打电话。

思路一:

修改两个文件:ContactsListActivity.java和ContactListItemView.java。在ContactListItemView.java 中添加onTouchEvent()方法。在该方法的ACTION_MOVE事件中,X轴方向手指移动距离deltaX大于5像素的时候,开始左右滑动效果。该效果是在ACTION_MOVE事件下,通过this.requestLayout()来不停的重新布局联系人中listview的item布局实现的。这个item的布局在ContactListItemView.java的onLayout()方法中定义。在onLayout()方法中为需要有滑动效果的子view修改layout()中的参数值,如photoView.layout(left
-deltaX, top, right - deltaX, bottom);这样就能在执行requestLayout()方法的时候出现左右滑动效果。

由于ContactListItemView.java中onTouchEvent() 在ACTION_DOWN事件的返回值,若是返回false,则不执行后面的之后的ACTION_MOVE事件,无法实现左右滑动效果。若是返回true,会使ContactsListActivity.java 中的onListItemClick()和onCreateOptionsMenu()的两个方法无法执行。所以为了保留原来的短按和长按的效果,在ContactListItemView.java中的onTouchEvent()方法中实现短按和长按。

短按的流程是ACTION_DOWNàACTION_UP,UP之后响应。所以在ACTION_DOWN事件中记录系统当前时间,在ACTION_UP事件中记录系统当前时间,若两个时间间距小于300ms,并且X、Y轴的 触摸速度都小于 5,则认为是一次短按事件。执行onListItemClick()方法查看联系人详情。

长按的流程是ACTION_DOWN-->ACTION_MOVE,在DOWN之后的500ms中,若MOVE的位移小于5个像素且未ACTION_UP,则触发长按事件。在ContactsListActivity.java中长按是弹出上下文菜单。而在ContactListItemView.java中只能弹出对话框。所以在item响应长按事件的时候弹出的一个AlertDialog。然后将ContactsListActivity.java中的处理函数移植到ContactListItemView.java中。

思路二:

在PinnedHraderListView.java中重写OnTouchEvent()方法,在该方法中做左右滑动判断。由于PinnedHraderListView.java继承于ListView.java ,所以在OnTouchEvent()方法中ACTION_DOWN事件的时候,就已经开始了短按和长按事件的监听。为了左右滑动的时候不出现短按和长按的事件,在ContactsListActivity.java中屏蔽掉。



具体实现:

功能实现是采用思路二方案。思路二方案是在思路一方案的基础上改进,解决了思路一中的未解问题。

(1)、先实现ContactListItemView左右滑动。

三星机子上面的左右滑动时候,联系人的头像和名字会随着手指的滑动而左右滑动。而联系人的布局是在ContactListItemView.java中通过onMeasure()与onLayout()方法实现的。onLayout()方法是定位View在屏幕上的具体位置的。所以我在ContactListItemView.java这个类中声明一个变量deltaX,表示手指在X轴方向的滑动位移大小。然后在onLayout()方法中的通过deltaX来控制确定photoView和nameTextView在屏幕上的实际位置。



左右滑动在PinnedHraderListView.java这个类中重写onTouchEvent()方法实现。主要涉及3个触屏事件ACTION_DOWN、ACTION_MOVE、ACTION_UP。



在DOWN事件的时候:获取手指触屏的当前x、y左标。通过左边可以定位到我们选中的是哪个ItemView,也就是具体的哪个联系人。

在MOVE事件的时候:判断是否进入联系人滑动模式。(我的判断条件是滑动模式要满足X轴位移的绝对值大于6像素,Y轴位移绝对值小于6像素。)

如果是滑动模式通过 ItemView.setDeltaX(int);(参数就是X轴的位移大小)

ItemView.requestLayout();

滑动ItemView,实现ContactListItemView左右滑动。这里的返回值要改成return true,不能再返回super.onTouchEvent(ev);否则会出现左右滑动的时候,listView的上下滑 动干扰。



到此,会出现一个问题:在滑动模式的时候,listview的短按和长按事件依然会响应。



(2)、添加滑动效果,屏蔽滑动时短按和长按事件

添加滑动效果,是在ContactListItemView.java中添加4个视图,分别是左右滑动有渐变效果的mColorView、打电话的mCallView、发短信的mSmsView,这3个都是ImageView,还有一个是mActionTextView显示“通话”或者“短信”的TextView。

在mColorView滑动效果与上面一样,都是先在onLayout()中确定位置,然后通过MOVE事件时,实现效果。另外mCallView、mSmsView和mActionTemView的透明度和显示也在MOVE事件中通过当前手指在X轴上触屏的位子来控制。它们都是不可见的,只有在滑动模式的时候才可见。

屏蔽短按和长按事件分别是在ContactsListActivity.java的onListItemClick()和onCreateContextMenu()中方法体前添加判断。判断条件是被选中的这个ItemView的mColorView是否可见,若是可见,说明是滑动模式中,return。

onListItemClick()响应流程是DOWNàUPàonListItemClick(),所以UP只后不能马上将mColorView设置成不可见。解决之法就是在UP之后启动一个线程,线程中做一组平移动画,将布局恢复到原来的样子。



(3)、左滑发短信,右滑打电话

左滑发短信,右滑打电话是在UP事件中判断。若是X轴的位移大小大于设备像素宽度的1/3或者X轴方向速度大于700, 则进入打电话。若是X轴的位移大小小于负的设备像素宽度的1/3或者X轴方向速度小于-700, 则进入发短信。

打电话和发短信的实现方法是移植了ContactsListActivity.java中的callOrSmsContact()、queryPhoneNumbersForCall()这两个方法。其中需要的3个数据都是通过ContactsListActivity.java中的bindView()方法将数据设置到ContactListItemView的对象中(这个对象就是listview中一个itemView)。然后在PinnedHraderListView.java中通过我们选中的ItemView将数据取出。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐