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

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

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

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • mysql alter 改密码_MySql修改密码

    mysql alter 改密码_MySql修改密码MySql这个垃圾,从8.0开始修改密码有了变化,在user表加了字段authentication_string,修改密码前先检查authentication_string是否为空1、如果不为空usemysql;updateusersetauthentication_string=”whereuser=’root’;–将字段置为空ALTERuser’root’@’localh…

    2022年7月16日
    34
  • fprintf函数的作用_c语言fopen函数的用法

    fprintf函数的作用_c语言fopen函数的用法fprintf(简介)fprintf是C/C++中的一个格式化库函数,位于头文件中,其作用是格式化输出到一个流文件中;函数原型为intfprintf(FILE*stream,constchar*format,[argument]…),fprintf()函数根据指定的格式(format),向输出流(stream)写入数据(argument)。以“分别用十进制,八进制,十六进制输…

    2022年10月19日
    5
  • python 去掉文件后缀名,python 删除后缀名文件

    python 去掉文件后缀名,python 删除后缀名文件Note:print语句供test用#!/usr/bin/pythonimportos,re,time,sysimportos.pathimportstringfilter_dir=”/home/fengnazh/splittest/files/”filterfile_list=os.listdir(filter_dir)printfilterfile_listfile_i…

    2022年5月7日
    332
  • 有没有支持5V输入和9V输入给两串8.4V锂电池充电的芯片IC「建议收藏」

    有没有支持5V输入和9V输入给两串8.4V锂电池充电的芯片IC「建议收藏」有的FS4062支持5V和9V同步升降压充电8.4V两床锂电池,也就是5V9V适配器自动识别两串8.4V锂电池高效充电管理芯片概述:FS4062是一款宽电压输入,专门为7.4V双节锂电池充电的充电管理芯片,兼容5V,9V适配器。在5V供电的情况下,实现升压充电,电池端最大充电电流1.3A,在9V供电的情况下,实现降压充电,电池端最大充电电流1.2A,充电电流可以通过外置电阻RSET来设定。低阻抗的电源通路可以使充电效率更高,减少充电时间,提高电池使用寿命。.

    2022年10月6日
    5
  • Java的运行机制(一)

    Java的运行机制(一)前言:还是那句话,第一、凡是涉及到概念性内容的时候,我都会到官网去确认内容的真实性!第二、我喜欢偏向于原理学习。在java介绍里面,我认为知道这是一门完全面向对象的语言就足够了。我的导师说C++是认为程序员是很强大的,开放了所有的功能权限;Java是认为程序员不是那么全能的,有些危险的操作,不会让你执行。不知道您是否也这么认为呢?目录一、类的结构二、运行机制1、编译方式…

    2022年7月8日
    27
  • 自动登陆抽屉(1)

    自动登陆抽屉(1)

    2021年6月7日
    105

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

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