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

实现目标:

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

思路一:

       修改两个文件: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将数据取出。


  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值