android 触屏处理流程,android触摸事件处理流程 ? FOOKWOOD「建议收藏」

android 触屏处理流程,android触摸事件处理流程 ? FOOKWOOD「建议收藏」最近在工作中,经常需要处理触摸事件,但是有时候会出现一些奇怪的bug,比如有时候会检测不到ACTION_MOVE和ACTION_UP,我决定下决心写个测试的小程序,来研究一个触摸事件从上往下是怎么传递和处理的。先说下大概的流程吧,这个应该在很多博客中都有讲解:当一个事件来临的时候,会先传递给最外层的ViewGroup(比如LinearLayout,FrameLayout),如果这个ViewGrou…

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

最近在工作中,经常需要处理触摸事件,但是有时候会出现一些奇怪的bug,比如有时候会检测不到ACTION_MOVE和ACTION_UP,我决定下决心写个测试的小程序,来研究一个触摸事件从上往下是怎么传递和处理的。

先说下大概的流程吧,这个应该在很多博客中都有讲解:当一个事件来临的时候,会先传递给最外层的ViewGroup(比如LinearLayout,FrameLayout),如果这个ViewGroup没有去拦截这个事件的话,才会给传递给下层的ViewGroup或者View。如果被拦截掉的话,它会自己去处理这个事件,这个ViewGroup内的View将无法得知上层发生了什么。

ViewGroup的拦截事件的函数为

1public boolean onInterceptTouchEvent(MotionEvent ev)

onInterceptTouchEvent的参数ev就是一个触摸事件,可以从ev获取到事件的坐标,类型,当前屏幕上点的个数等等。通常我们在继承ViewGroup的时候都会重写这个方法,判断目前需不需要拦截,即返回true还是false。返回true的时候表明事件不再往下传了,否则就往下传。那返回true的时候怎么处理呢?

这就需要onTouchEvent():

1public boolean onTouchEvent(MotionEvent ev)

具体怎么实现就根据实际的需要来了。我们发现他的返回值也是boolean,那返回true或者false的时候会有什么影响呢?用一张图来说明:

80474837_1.png

这个一个典型的流程,也就是所有的相关方法都返回false的时候,一个事件先到了LinearLayout,它不拦截,然后就往下面跑,到了FrameLayout上,他又不处理,又传到了Button上,这个时候Button返回了false,然后这个事件往上传,最后没有人处理。当FrameLayout的两个方法返回true的时候会怎样呢?

80474837_2.png

FrameLayout的onInterceptTouchEvent返回true后,就拦截触摸消息了,然后交给自己的onTouchEvent处理。这里面的逻辑自己定义就好了,如果这个事件被消费掉了,返回true就可以了,这样系统就不会接着传了,事件处理到此为止。

是不是按下,移动,松开的流程都是按照这样处理的呢?答案是否定的。ACTION_DOWN事件的判断和处理,直接影响到了后续的ACTION_MOVE和ACTION_UP,在上面的图中,FrameLayout的onTouchEvent返回了true,那么当ACTION_MOVE来到FrameLayout这一层的时候,就不再需要通过onInterceptTouchEvent拦截了,直接用onTouchEvent处理。如果说一个ACTION_DOWN从头到尾都是返回false,那么后续的ACTION_MOVE和ACTION_UP就没法被感知到了。

下面说一下多点触摸的情况:

多点触摸的时候,会多两个事件 ACTION_POINTER_UP和ACTION_POINTER_DOWN。当第一个手指按下的时候,会产生ACTION_DOWN,当第二个手指按下的时候,会产生ACTION_POINTER_DOWN,第三个或者更多手指按下的时候,也是ACTION_POINTER_DOWN,如果此时有一个手指离开屏幕,会产生ACTION_POINTER_UP,当最后一个手指离开屏幕的时候,才会产生ACTION_UP。在整个操作过程中,一个触点会始终保持一个固定的ID,方便记录和处理,比如说在ACTION_MOVE的处理过程中,可以通过MotionEvent的getX(int pointerIndex)来获取某个点的坐标。

前两天看到一篇文章,对触摸事件解释的更详细了,比如说OnLongClickListener和OnClickListener的工作原理等等。如果你都能理解了,那么Android的触摸控制也就可以轻松搞定了。

http://hunankeda110.iteye.com/blog/1944311

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/195093.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)
blank

相关推荐

  • 学习Spring框架这一篇就够了

    学习Spring框架这一篇就够了1.spring概述1.1Spring是什么(理解)Spring是分层的JavaSE/EE应用full-stack轻量级开源框架,以IoC(InverseOfControl:反转控制)和AOP(AspectOrientedProgramming:面向切面编程)为内核。提供了展现层SpringMVC和持久层SpringJDBCTemplate以及业务层事务管理等众多的企业级应用技术,还能整合开源世界众多著名的第三方框架和类库,逐渐成为使用最多的JavaEE企业应用

  • http 500状态码「建议收藏」

    http请求返回500状态码,整体原因是:服务器内部错误。这个原因太过笼统,看了和没看直接懵逼。今天遇到这么一个崩溃的问题,这么大的范围,怎么找呢?然后,静下来打开思路,慢慢想一下,分析过程:1.客户端请求服务端的时候,返回500,首先服务端的请求发出去了,并且返回了500,错误定位到服务端。2.服务端里面代码竟然没有执行任何打印语句,说明还没有执行到逻辑,就已经出错了。3.这边服务

  • 使用line_profiler查看api接口函数每行代码执行时间

    使用line_profiler查看api接口函数每行代码执行时间

  • Winform 窗体美化(IrisSkin 换肤库)[通俗易懂]

    Winform 窗体美化(IrisSkin 换肤库)[通俗易懂]IrisSkin换肤库IrisSkin是为MicrosoftVisualStudiodotNET开发的最易用的界面增强dotNET(WinForm)组件包。能完全自动的为应用程序添加支持换肤功能。IrisSkin换肤库百度网盘下载提取码:1pb7皮肤编辑器下载打开下载解压后的文件路径:WinFormSkinDemo\WinFormSkin\WinFormSkin\bi…

  • 博弈论基础_博弈论基础罗伯特

    博弈论基础_博弈论基础罗伯特博弈论这个环节特别好玩,游戏嘛(不会的话做题就不好玩了,当年打比赛比赛结束后两三分钟才推出来,一看答案想撕草稿纸)本篇文章含有大量逻辑证明,做题用不到,不想看的可以略过直接看结论和模板参考文献特别鸣谢孙大佬的PPT和精彩讲解威佐夫博弈尼姆博弈SG函数斐波那契博弈区间最值查询ST表详解预处理查询巴什博弈问题模型只有一堆n个物品,两个人轮流从这堆物品中取物,规定每次至少取一个,最多取…

    2022年10月15日
  • document.all(“”)的使用

    document.all(“”)的使用document.all(name)         document.all(“”)的使用                                   varone=document.all(“one”);          alert(one.length);//单个元素时,不

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号