android onclick与ontouch和scroll监听冲突的解决方法 类似QQHD拖动窗口效果

控件监听有onTouch、onClick,同时控件可以存在ScrollView里面多出了一个滚动监听。

Click事件与scroll事件不存在冲突,故在click事件中不需要考虑scroll变化

Click事件与touch存在冲突,touch事件会将当ontouch事件的return返回的是true时,click点击事件将被拦截无法实现事件响应。

Touch事件与srcoll事件存在冲突,scroll与touch之间相互干扰可能会互相屏蔽事件导致响应事件不灵敏。

要解决三个事件两两之间不冲突可以将冲突判定拆分开来分步解决。

首先解决click事件与touch事件冲突,当控件添加了click监听后,如果在当前控件外面还添加了touch监听事件,则touch事件将不在响应,必须在给该控件添加一次touch事件监听。添加上touch事件后出现了touch事件与click事件冲突。在这里就需要用到一个boolean变量用于做为ontouch事件监听的返回对象。该变量在每次产生ontouch事件的action_down时赋值为false.在action_move里面判定当产生滑动时将该boolean变量赋值为true,则该touch事件返回为true,touch事件将继续生效,而click事件并不产生响应,若当前仅点击,则无法触发将boolean值改变为true,那么ontouch事件将只执行一次,click事件将被响应。

如此将可以解决ontouch事件与onclick冲突,做到可以响应click事件与响应touch事件,下面要处理touch事件与scroll事件冲突。

首先,将ScrollView控件重写,在其代码里添加一个boolean变量,生成set方法。修改onInterceptTouchEvent方法,将其改成若新生成的boolean变量为true时返回super. onInterceptTouchEvent(ev);其它的返回false。此处功能为屏蔽scrollview的滚动功能。然后将该scrollview里面的控件也添加ontouch监听,在该监听的action_down时初始化boolean变量,同时获取当前相当于屏幕的X坐标点存起来。在action_move时获取当前X坐标,计算与初始的坐标是否存在位移,可以自己设定当相对X轴移动多大距离时触发屏蔽scrollview功能,至于如何屏蔽scrollview的滚动功能呢,只要调用重写里面新添加的那个set方法将该boolean值设置为false则可以屏蔽scrollview的滚动功能,如此控件就可以触发ontouch的完整事件,若没触发该方法时,scrollview将执行滚动效果。



属于个人原创,不想写文章被逼着写来着的,要怎么上传附件?有个小例子

扫描二维码关注公众号,回复: 861671 查看本文章

http://download.csdn.net/detail/kelouy/4921488

附件下载地址

猜你喜欢

转载自blog.csdn.net/kelouy/article/details/8423533