Android触摸事件与点击事件的区别.pdf_第1页
Android触摸事件与点击事件的区别.pdf_第2页
Android触摸事件与点击事件的区别.pdf_第3页
Android触摸事件与点击事件的区别.pdf_第4页
全文预览已结束

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

针对屏幕上的一个View控件 Android如何区分应当触发onTouchEvent 还是onClick 亦或是 onLongClick事件 在Android中 一次用户操作可以被不同的View按次序分别处理 并将完全响应了用户一次UI操作称之 为消费了该事件 consume 那么Android是按什么次序将事件传递的呢 又在什么情况下判定为消费了该事 件 搞清楚这些问题对于编写出能正确响应UI操作的代码是很重要的 尤其当屏幕上的不同View需要针对 此次UI操作做出各种不同响应的时候更是如此 一个典型例子就是用户在桌面上放置了一个Widget 那么 当用户针对widget做各种操作时 桌面本身有的时候要对用户的操作做出响应 有时忽略 只有搞清楚事 件触发和传递的机制才有可能保证在界面布局非常复杂的情况下 UI控件仍然能正确响应用户操作 1 onTouchEvent onTouchEvent中要处理的最常用的3个事件就是 ACTION DOWN ACTION MOVE ACTION UP 这三个事件标识出了最基本的用户触摸屏幕的操作 含义也很清楚 虽然大家天天都在用它们 但是 有一点请留意 ACTION DOWN事件作为起始事件 它的重要性是要超过ACTION MOVE和ACTION UP的 如果发 生了ACTION MOVE或者ACTION UP 那么一定曾经发生了ACTION DOWN 从Android的源代码中能看到基于这种不同重要性的理解而实现的一些交互机制 SDK中也有明确的提 及 例如在ViewGroup的onInterceptTouchEvent方法中 如果在ACTION DOWN事件中返回了true 那么后续 的事件将直接发给onTouchEvent 而不是继续发给onInterceptTouchEvent 2 onClick onLongClick与onTouchEvent 曾经看过一篇帖子提到 如果在View中处理了onTouchEvent 那么就不用再处理onClick了 因为 Android只会触发其中一个方法 这个理解是不太正确的 针对某个view 用户完成了一次触碰操作 显然 从传感器上得到的信号是手指按下和抬起两个操作 我们可以理解为一次Click 也可以理解为发生了一次 ACTION DOWN和ACTION UP 那么Android是如何理解和处理的呢 在Android中 onClick onLongClick的触发是和ACTION DOWN及ACTION UP相关的 在时序上 如果我 们在一个View中同时覆写了onClick onLongClick及onTouchEvent的话 onTouchEvent是最先捕捉到 ACTION DOWN和ACTION UP事件的 其次才可能触发onClick或者onLongClick 主要的逻辑在View java中的 onTouchEvent方法中实现的 c a s e M o t i o n E v e n t A C T I O N D O W N m P r i v a t e F l a g s P R E S S E D r e f r e s h D r a w a b l e S t a t e i f m V i e w F l a g s b r e a k c a s e M o t i o n E v e n t A C T I O N U P i f m P r i v a t e F l a g s i f i s F o c u s a b l e i f m H a s P e r f o r m e d L o n g P r e s s i f m P e n d i n g C h e c k F o r L o n g P r e s s n u l l r e m o v e C a l l b a c k s m P e n d i n g C h e c k F o r L o n g P r e s s i f f o c u s T a k e n p e r f o r m C l i c k b r e a k 可以看到 Click的触发是在系统捕捉到ACTION UP后发生并由performClick 执行的 performClick里会调用先前注册的监听器的onClick 方法 p u b l i c b o o l e a n p e r f o r m C l i c k i f m O n C l i c k L i s t e n e r n u l l p l a y S o u n d E f f e c t S o u n d E f f e c t C o n s t a n t s C L I C K m O n C l i c k L i s t e n e r o n C l i c k t h i s r e t u r n t r u e r e t u r n f a l s e LongClick的触发则是从ACTION DOWN开始 由postCheckForLongClick 方法完成 p r i v a t e v o i d p o s t C h e c k F o r L o n g C l i c k m H a s P e r f o r m e d L o n g P r e s s f a l s e i f m P e n d i n g C h e c k F o r L o n g P r e s s n u l l m P e n d i n g C h e c k F o r L o n g P r e s s n e w C h e c k F o r L o n g P r e s s m P e n d i n g C h e c k F o r L o n g P r e s s r e m e m b e r W i n d o w A t t a c h C o u n t p o s t D e l a y e d m P e n d i n g C h e c k F o r L o n g P r e s s V i e w C o n f i g u r a t i o n g e t L o n g P r e s s T i m e o u t 可以看到 在ACTION DOWN事件被捕捉后 系统会开始触发一个postDelayed操作 delay的时间在 Eclair2 1上为500ms 500ms后会触发CheckForLongPress线程的执行 c l a s s C h e c k F o r L o n g P r e s s i m p l e m e n t s R u n n a b l e p u b l i c v o i d r u n i f i s P r e s s e d 如果各种条件都满足 那么在CheckForLongPress中执行performLongClick 在这个方法中将调用 onLongClick p u b l i c b o o l e a n p e r f o r m L o n g C l i c k i f m O n L o n g C l i c k L i s t e n e r n u l l h a n d l e d m O n L o n g C l i c k L i s t e n e r o n L o n g C l i c k V i e w t h i s 从实现中可以看到onClick 和onLongClick 方法是由ACTION DOWN和ACTION UP事件捕捉后根据各种 情况最终确定是否触发的 也就是说如果我们在一个Activity或者View中同时监听或者覆写了 onClick onLongClick 和onTouchEvent 方法 并不意味着只会发生其中一种 下面是一个onClick被触发的基本时序的Log 04 05 05 57 47 123 DEBUG TSActivity 209 onTouch ACTION DOWN 04 05 05 57 47 263 DEBUG TSActivity 209 onTouch ACTION UP 04 05 05 57 47 323 DEBUG TSActivity 209 onClick 可以看出是按ACTION DOWN ACTION UP onClick的次序发生的 下面是一个onLongClick被触发的基本时序的Log 04 05 06 00 04 133 DEBUG TSActivity 248 onTouch ACTION DOWN 04 05 06 00 04 642 DEBUG TSActivity 248 onLongClick 04 05 06 00 05 083 DEBUG TSActivity 248 onTouch ACTION UP 可以看到 在保持按下的状态一定时间后会触发onLongClick 之后抬起手才会发生ACTION UP 3 onClick和onLongClick能同时发生吗 要弄清楚这个问题只要理解Android对事件处理的所谓消费 consume 概念即可 一个用户的操作会 被传递到不同的View控件和同一个控件的不同监听方法处理 任何一个接收并处理了该次事件的方法如果 在处理完后返回了true 那么该次event就算被完全处理了 其他的View或者监听方法就不会再有机会处理 该event了 onLongClick的发生是由单独的线程完成的 并且在ACTION UP之前 而onClick的发生是在 ACTION UP后 因此同一次用户touch操作就有可能既发生onLongClick又发生onClick 这样是不是不可思 议 所以及时向系统表示 我已经完全处理 消费 了用户的此次操作 是很重要的事情 例如 我们 如果在onLongClick 方法的最后return true 那么onClick事件就没有机会被触发了 下面的Log是在onLongClick 方法return false的情况下 一次触碰操作的基本时序 04 05 06 00 53 023 DEB

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论