android触摸屏事件,Android Touch事件分析

2022-10-02 17:32:51 浏览数 (1)

大家好,又见面了,我是你们的朋友全栈君。

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

0 人点赞