Android ViewPostImeInputStage输入事件处理

ops/2024/10/19 2:09:02/

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

ViewPostImeInputStage处理view控件的事件

 

@frameworks/base/core/java/android/view/InputEventReceiver.java    dispatchInputEvent
@frameworks/base/core/java/android/view/ViewRootImpl.javaonInputEvent(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::onProcessapply(q, result);if (result == FORWARD) {   forward(q);  } onDeliverToNext(q);mNext.deliver(q);result = onProcess(q);  //NativePostImeInputStage::onProcessmNext.deliver(q);result = onProcess(q); //ViewPostImeInputStage::onProcessif((source & InputDevice.SOURCE_CLASS_POINTER) != 0) { return processPointerEvent(q); }
@frameworks/base/core/java/android/view/View.javaboolean 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)注册的Listenerif (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.javapublic boolean onHover(View view, MotionEvent motionEvent) { return false; }  //回调Button控件的onHoverdispatchGenericMotionEventInternal(event)onGenericMotionEvent(event)maybeUpdatePointerIcon(event);if (event.getActionMasked() != MotionEvent.ACTION_HOVER_EXIT) { if (!updatePointerIcon(event) && }InputManager.getInstance().setPointerIconType(pointerType);  // pointerType = 1002, 鼠标样式由箭头变成小手


http://www.ppmy.cn/ops/56600.html

相关文章

怎样优化 PostgreSQL 中对复杂查询的执行计划分析?

文章目录 怎样优化 PostgreSQL 中对复杂查询的执行计划分析 怎样优化 PostgreSQL 中对复杂查询的执行计划分析 在数据库管理的领域中,PostgreSQL 作为一款强大且广泛应用的关系型数据库,经常面临着处理复杂查询的挑战。对于复杂查询,执行计划…

基于CentOS Stream 9平台搭建MinIO以及开机自启

1. 官网 https://min.io/download?licenseagpl&platformlinux 1.1 下载二进制包 指定目录下载 cd /opt/coisini/ wget https://dl.min.io/server/minio/release/linux-amd64/minio1.2 文件赋权 chmod x /opt/coisini/minio1.3 创建Minio存储数据目录: mkdi…

子任务:IT运维的精细化管理之道

在当今的企业运营中,信息技术已成为支撑业务发展的核心力量。根据Gartner的报告,IT服务管理(ITSM)的有效实施可以显著提升企业的运营效率,降低成本高达15%,同时提高服务交付速度和质量。随着业务的复杂性和…

服务器为什么大多用 Linux?

这个事,IIS(微软的 Web Server)至少要负一大半责任。 首先,大家不要去按照现在Linux的情况跟Windows比。 很多东西在发展过程中就是一种生态强弱的比较。在那个关键的时间点,你的生态强,大家都用你&#x…

html5——CSS3基础

目录 CSS概念 CSS3基本语法 HTML中引入CSS样式 1、行内样式 2、内部样式 3、链接样式 CSS概念 表现HTML或XHTML文件样式的计算机语言 包括对字体、颜色、边距、高度、宽度、背景图片、网页定位等设定 CSS3基本语法 选择器 { 声明1; 声明2; …… } CSS的最后一条声…

【原理+使用】DeepCache: Accelerating Diffusion Models for Free

论文:arxiv.org/pdf/2312.00858 代码:horseee/DeepCache: [CVPR 2024] DeepCache: Accelerating Diffusion Models for Free (github.com) 介绍 DeepCache是一种新颖的无训练且几乎无损的范式,从模型架构的角度加速了扩散模型。DeepCache利…

QT调节屏幕亮度

1、目标 利用QT实现调节屏幕亮度功能:在无屏幕无触控时,将屏幕亮度调低,若有触控则调到最亮。 2、调节亮度命令 目标装置使用嵌入式Linux系统,调节屏幕亮度的指令为: echo x > /sys/class/backlight/backlight/…

微服务中的 “服务发现机制” 简介

微服务的服务发现机制是一种在微服务架构中动态定位服务实例以进行通信的方法。 它主要依赖于注册中心来实现服务注册、查询以及支持负载均衡,从而提高系统的可扩展性和灵活性。 一、基本概念 服务发现是指在分布式系统中,自动发现和识别可用的服务的…