大家好,又见面了,我是你们的朋友全栈君。
Android Touch事件分析
本文将分析Touch事件的传递。很多复杂的功能都需要深刻的处理Touch事件,例如侧边栏,例如图标的拖动换位。
一,Touch事件的执行轨迹
Down—>MoveàUP/Cancel
二,Touch事件的分类
Touch事件可分为两类:OnTouchEvent和 onInterceptTouchEvent。
消息传递的两种方式(Z轴方向)
前者是正在执行touch事件的方法,后者则是拦截touch事件的方法。OnTouchEvent()的传递是自上而下,OnInterceptTouchEvent是自下而上。
三,Touch事件案例解析
当然,听到这里可能还不是很清楚。下面将以demo的形式来说明。
显然,拦截touch事件的前提是有可拦截的touch事件,即存在子view,所以只有ViewGroup才有OnInterceptTouchEvent()方法。当最上的view(即TouchTextView)被touch到时(可能存在多层,demo以三层来分析)。从最下面开始判断是否需要拦截(Intercept),layout1—> layout2–>TouchTextView,如果不拦截,则
Case1:分别在Layout1, Layout2, TouchTextView中override OnTouchEvent()和OnInterceptTouchEvent(),不做任何处理。点击TouchTextView,log如下:
很明显,点击TextView之后,先从View的最底层判断要不要要拦截,以此向上处理,都不处理,那么TouchEvent事件最终交给TouchTextView处理。TouchTextView不处理,交给其父亲Layout2处理,Layout2不处理,交给Layout1处理。Layout1不处理,最终交给Activity处理。在拦截时,只通过ACTION_DOWN来判断,最终定下由谁处理TouchEvent时,才最终继续进行ACTION_MOVE, ACTION_UP.
Case2:在Layout1,ACTION_DOWN时拦截(设置返回值为true)。
Log如下:
显然Layout1将touch事件拦截,使用自己的TouchEvent()处理。但是ACTION_DOWN返回值为false,Layout已经在最下面,TouchEvent最终交给Activity处理。
Case3,如果不在ACTION_DOWN事件拦截,而在layout中的ACTION_MOVE事件拦截。
Log如下:
显然,在ACTION_MOVE中的拦截,对拦截没有任何作用,可以得出结论,ACTION_DOWN是用来确定某次touch时间到底如何处理。
四,Source code
https://github.com/mikewang0326/TouchEventDemo.git
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/197814.html原文链接:https://javaforall.cn