Android ViewPostImeInputStage输入事件处理

news2025/2/24 15:28:33

InputDispatcher向InputChannel使用socket写入输入事件,触发InputEventReceiver调用来接收输入事件。

ViewPostImeInputStage处理view控件的事件

 

@frameworks/base/core/java/android/view/InputEventReceiver.java    
            dispatchInputEvent
@frameworks/base/core/java/android/view/ViewRootImpl.java
                onInputEvent(event);
                    enqueueInputEvent(event, this, 0, true);
                        if (processImmediately) { doProcessInputEvents(); }
                            deliverInputEvent(q);  //在deliverInputEvent函数中做输入事件的实际分发
                                stage = q.shouldSkipIme() ? mFirstPostImeInputStage : mFirstInputStage;  //这里开始选择 责任链的入口,具体请看InputStage的处理流程
                                stage.deliver(q);  //这里主要调用InputStage的deliver方法进行分发,InputStage代表了输入事件的处理阶段,使用责任链模式设计模式。
                                    result = onProcess(q);  // EarlyPostImeInputStage::onProcess
                                            apply(q, result);
                                                if (result == FORWARD) {   forward(q);  } 
                                                    onDeliverToNext(q);
                                                        mNext.deliver(q);
                                                            result = onProcess(q);  //NativePostImeInputStage::onProcess
                                                                mNext.deliver(q);
                                                                    result = onProcess(q); //ViewPostImeInputStage::onProcess
                                                                        if((source & InputDevice.SOURCE_CLASS_POINTER) != 0) { return processPointerEvent(q); }
@frameworks/base/core/java/android/view/View.java
                                                                            boolean handled = mView.dispatchPointerEvent(event);
                                                                                //MotionEvent { action=ACTION_DOWN, actionButton=0, id[0]=0, x[0]=692.0, y[0]=993.0, toolType[0]=TOOL_TYPE_FINGER, displayId=0, buttonState=0, classification=NONE, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=0, eventTime=455777, downTime=455777, deviceId=-1, source=0x5002, eventId=-701920562 }}
                                                                                dispatchTouchEvent(event); 
                                                                                    if (mInputEventConsistencyVerifier != null) {  mInputEventConsistencyVerifier.onTouchEvent(event, 0);    }                                                                 
@XrView.java
                                                                                    //调用app setOnTouchListener(mTouchListener)注册的Listener
                                                                                    if (li != null && li.mOnTouchListener != null && (mViewFlags & ENABLED_MASK) == ENABLED && li.mOnTouchListener.onTouch(this, event)) {result = true;} 
                                                                                        return true;    //返回true表示已经处理完成,不往下走,fasle则相反
                                                                                    if (!result && onTouchEvent(event)) { result = true;}   //调用app的onTouchEvent或者View.java的onTouchEvent
                                                                                //MotionEvent { action=ACTION_HOVER_MOVE, actionButton=0, id[0]=0, x[0]=664.80475, y[0]=407.85626, toolType[0]=TOOL_TYPE_MOUSE, displayId=0, buttonState=0, classification=NONE, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=0, eventTime=284960, downTime=284790, deviceId=3, source=0x2002, eventId=1040558423 }
                                                                                dispatchGenericMotionEvent(event);
                                                                                    if (action == MotionEvent.ACTION_HOVER_ENTER || action == MotionEvent.ACTION_HOVER_MOVE || action == MotionEvent.ACTION_HOVER_EXIT) { if (dispatchHoverEvent(event)) }
                                                                                        li.mOnHoverListener.onHover(this, event))
@MyApplication/app/src/main/java/com/example/myapplication/MainActivity.java
                                                                                            public boolean onHover(View view, MotionEvent motionEvent) { return false; }  //回调Button控件的onHover
                                                                                    dispatchGenericMotionEventInternal(event)
                                                                                        onGenericMotionEvent(event)
                                                                            maybeUpdatePointerIcon(event);
                                                                                if (event.getActionMasked() != MotionEvent.ACTION_HOVER_EXIT) { if (!updatePointerIcon(event) && }
                                                                                    InputManager.getInstance().setPointerIconType(pointerType);  // pointerType = 1002, 鼠标样式由箭头变成小手

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1902183.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Shell编程类-网站检测

Shell编程类-网站检测 面试题参考答法 a(1 2 3 4) echo ${a[0]} echo ${a[*]}这里声明一个数值,并选择逐个调用输出还是全部输出 curl -w %{http_code} urL/IPADDR常用-w选项去判断网站的状态,因为不加选择访问到的网站可能出现乱码无法判断是否网站down…

Nuxt框架中内置组件详解及使用指南(一)

title: Nuxt框架中内置组件详解及使用指南(一) date: 2024/7/6 updated: 2024/7/6 author: cmdragon excerpt: 本文详细介绍了Nuxt框架中的两个内置组件和的使用方法与功能。确保包裹的内容仅在客户端渲染,适用于处理浏览器特定功能或异步…

第1章 项目背景(学成在线),项目介绍,环境搭建

1.项目背景 1.1 在线教育市场环境 以下内容摘自https://report.iresearch.cn/content/2021/01/358854.shtml 在线教育行业是一个有着极强的广度和深度的行业,从校内到校外;从早幼教到职业培训;从教育工具到全信息化平台等等。 2020年的新…

智慧文旅(景区)解决方案PPT(42页)

智慧文旅解决方案摘要 行业分析中国旅游业正经历消费大众化、需求品质化、发展全域化和产业现代化的发展趋势。《“十三五”旅游业发展规划》的发布,以及文化和旅游部的设立,标志着旅游业的信息化和智能化建设成为国家战略。2018年推出的旅游行业安全防范…

Linux:Ubuntu18.04下开机自启动QT图形化界面

Linux:Ubuntu18.04下开机自启动QT图形化界面 Chapter1 Linux:Ubuntu18.04下开机自启动QT图形化界面一、创建rc.local文件二、建立rc-local.service文件三、启动服务查看启动状态四、重启 Chapter2 将QT应用作为开机自启动(Linux系统&#xff…

ePTFE膜(膨体聚四氟乙烯膜)应用前景广阔 本土企业技术水平不断提升

ePTFE膜(膨体聚四氟乙烯膜)应用前景广阔 本土企业技术水平不断提升 ePTFE膜全称为膨体聚四氟乙烯膜,指以膨体聚四氟乙烯(ePTFE)为原材料制成的薄膜。ePTFE膜具有耐化学腐蚀、防水透气性好、耐候性佳、耐磨、抗撕裂等优…

跟着峰哥学java 第四天 商品分类 前后端显示

1.后端 1.1mybatis-plus分页查询配置 在商品热卖数据中,只让其显示八条数据 将要使用分页 也就是service.page方法 此时需要配置 mp拦截器 Configuration public class MybatisPlusConfig {Beanpublic PaginationInterceptor paginationInterceptor() {return …

基于Echarts进行图表组件的封装

什么是Echarts 是一个使用js实现的开源可视库,提供了多种图表,但是当我们在项目中进行使用的时候可能就是需要进行一系列的相关配置如: 标题,类型,x轴,y轴等,当我们使用较为频繁的时候就容易导…

[数据结构] 基于交换的排序 冒泡排序快速排序

标题:[数据结构] 基于交换的排序 冒泡排序&&快速排序 水墨不写bug (图片来源于网络) 目录 (一)冒泡排序 优化后实现: (二)快速排序 I、实现方法: &#…

Adobe Photoshop 2024 v25.5.1 中文激活版下载以及安装方法教程

软件介绍 Adobe Photoshop 2024 v25.5.1 是Adobe公司的最新版图像处理软件,它提供了强大的图像编辑工具和智能自动化功能,包括图像修复、色彩校正和滤镜效果,以满足专业人士和业余爱好者的需求。这款软件还支持矢量图形设计和实时协作&#…

【程序人生】来CSDN五周年了,简单总结下初心、收获、未来憧憬

最近CSDN站内私信说,已经创作五周年了。想想确实应该写一点东西,总结一下初心是什么、经历了什么、收获了什么、现状怎么样、未来会如何规划写文章这件事。算是我自己的一份总结,也许也可以给一些刚上大学的年轻朋友参考一下,坚持…

【Linux】进程创建和终止 | slab分配器

进程创建 fork 1.fork 之后发生了什么 将给子进程分配新的内存块和内核数据结构(形成了新的页表映射)将父进程部分数据结构内容拷贝至子进程添加子进程到系统进程列表当中fork 返回,开始调度器调度 这样就可以回答之前返回两个值&#xff1f…

Autosar Dcm配置-0x85服务配置及使用-基于ETAS软件

文章目录 前言Dcm配置DcmDsdDcmDsp代码实现总结前言 0x85服务用来控制DTC设置的开启和关闭。某OEM3.0架构强制支持0x85服务,本文介绍ETAS工具中的配置 Dcm配置 DcmDsd 配置0x85服务 此处配置只在扩展会话下支持(具体需要根据需求决定),两个子服务Disable为0x02,Enable…

3.pwn 函数调用流程,调用约定

前置准备 pop: Pop指令的作用是弹栈,将栈顶的数据弹出到寄存器,然后栈顶指针向下移动一个单位。 具体来说:如pop rax,作用就是mov rax[rsp];add rsp 8; push: Push指令的作用就是压栈,将栈顶指针向上移动一个单位的距离&#xf…

38 IO流

目录 C语言的输入和输出流是什么CIO流stringstream的简单介绍 1. C语言的输入与输出 C语言中我们用到的最频繁的输出方式是scanf和printf,scanf:从标准输入设备(键盘)读取数据,并将值存在变量中。printf:…

【MySQL】锁(黑马课程)

【MySQL】锁 0. 锁的考察点1. 概述1. 锁的分类1.1 属性分类1.2 粒度分类 2. 全局锁2.1 全局锁操作2.2.1 备份问题 3. 表级锁3.1 表锁3.2 语法3.3 表共享读锁(读锁)3.4 表独占写锁(写锁)3.5 元数据锁(meta data lock, MDL)3.6 意向…

第5章 认证授权:需求分析,Security介绍(OAuth2,JWT),用户认证,微信扫码登录,用户授权

1 模块需求分析 1.1 什么是认证授权 截至目前,项目已经完成了课程发布功能,课程发布后用户通过在线学习页面点播视频进行学习。如何去记录学生的学习过程呢?要想掌握学生的学习情况就需要知道用户的身份信息,记录哪个用户在什么…

AIGC专栏12——EasyAnimateV3发布详解 支持图文生视频 最大支持960x960x144帧视频生成

AIGC专栏12——EasyAnimateV3发布详解 支持图&文生视频 最大支持960x960x144帧视频生成 学习前言项目特点生成效果相关地址汇总项目主页Huggingface体验地址Modelscope体验地址源码下载地址 EasyAnimate V3详解技术储备Diffusion Transformer (DiT)Hybrid Motion ModuleU-V…

智慧校园-教职工管理系统总体概述

在当今信息化时代,智慧校园教职工管理系统成为了提升教育机构管理效能的重要工具。该系统巧妙融合了先进的信息技术,为教职工的日常管理带来了一场静悄悄的革命。它不仅是一个信息存储库,记录着每位教职工从加入到离开的完整职业轨迹&#xf…

笔记12:if语句编程练习(打印输出三个数据中的最小值)

输入三个数,分别放入变量x,y,z中 打印输入数据中最小的那一个数 解决方案1 定义中间变量 t 1.比较x和y的大小关系,将较小的值赋值给t 2.比较t和z的大小关系,将较小的值赋值给t 3.t 中保存的就是3个数中的较小值 &am…