Android触屏输入处理:记录“立即购买”短暂的一生(上)

Android中getevent获取Input事件的用法 getevent 指令用于获取android系统中 input 输入事件,比如获取按键上报信息、获取触摸屏上报信息等。具体的代码目录:/system/core/toolbox/getevent.c。 先看看效果: 查看getevent -h获得相关信息: msm8909w:/ $ getevent -h getevent -h Usage: getevent [-t] [-n] [-... 阅读详情

背景

相较于传统的键盘输入的繁琐,移动智能终端提供了更加便捷的交互方式,只需要简单的点击和滑动就可以实现非常复杂的功能。如下图所示,当你的女朋友按下“立即购买”按钮的时候,除了让你的支付宝余额减少之外又发生了什么?这些点击和滑动的背后又隐藏着什么样的秘密?本文章将会一一揭晓。

故事的开始

那是一个疫情隔离的下午,你的女朋友百无聊赖地躺在沙发上逛京东,突然看到了苹果发布的iPhone13新款,看了看手里略显卡顿的iPhone12,在经过了反复的思考(0.00001秒)之后,十分纠结(毫不犹豫)地按下了立即购买,在她的手指触碰到手机屏幕的那一刻究竟发生了什么?我们先来看一下案发现场,那是一块常见手机屏幕,那么它又是如何对你女朋友的操作心领神会的呢?现在的智能手机屏幕主要包含以下三个部分,盖板玻璃是手机屏幕最外层的部件,起到保护手机内部结构的作用。触控模组可实现触控感应,是提升人机交互体验的关键。手机屏幕基本以电容式触摸屏为主。触摸感应层下面是前面板,主要用来安装滤光片,生成图像;再下一层是背板,用来处理薄膜晶体管。显示模组主要以LCD和OLED为主,是两种最主流的手机屏幕种类。LCD屏幕显示模组由偏光片、彩色滤光片、TFT、液晶、背板等构成,图像显色度好、画面柔和不伤眼,是当前应用最广泛的手机显示屏幕;OLED屏幕显示模组由偏光片、有机发光层、玻璃、TFT等材料构成,屏幕可自发光,具有轻薄、可弯曲、低耗能的优点,是目前新兴的屏幕显示技术。其中就是电容式触摸屏将负责传达你女朋友的点击意图,那么它又是如何实现的呢?

其实对于触摸屏而言并不知道你女朋友点击的是“加入购物车”还是“立即购买”或者其他内容,其实可以把触摸屏想象成一个二维的坐标系,触摸屏知道的只是你女朋友点击的坐标,触摸屏的工作原理概括来说就是上报坐标值,X轴、Y轴的值。其过程如下图所示,电容屏通过任何持有电荷的物体包括人体皮肤工作。(人体所带的电荷)电容式触摸屏是由诸如合金或是銦錫氧化物(ITO)这样的材料构成,电荷存储在一根根比头发还要细的微型静电网中。当手指点击屏幕,会从接触点吸收小量电流,造成角落电极的压降,利用感应人体微弱电流的方式来达到触控的目的。(这是为什么当你戴上手套触摸屏幕时,没有反应的原因),然后通过触摸屏中的触控IC计算出坐标。

童年:从硬件走向系统

谁人能想到这一次简单的碰撞会擦出如此的火花,如果将这样的一次操作映射为人的一生,那么“立即购买”此时刚呱呱坠地,而它背后的坐标就如同它的生辰八字,而这个生辰八字也将深深地影响它的一生,至于是如何影响的对于它来说那将会是很久以后的事情,我们暂时不表,先看看它现在面对的困境:如何从硬件走向系统。众所周知Android是基于Linux系统的,所以Android对于用户输入的处理依然是沿用Linux的输入子系统.工作机理是底层在按键、触摸等动作发生时产生一个中断(或驱动timer定时查询),然后CPU通过SPI、I2C或外部存储器总线读取键值,坐标等数据。

Linux内核为了能够处理各种不同类型的输入设备,比如 触摸屏、鼠标、键盘、操纵杆,设计并实现了为驱动层程序的实现提供统一接口函数,为上层应用提供统一的抽象层,即是Linux 输入子系统。如下图所示,Linux输入子系统主要包含三个部分Input driver(设备驱动层)、Input core(输入核心层)、Event handler(事件处理层)。“立即购买”诞生之后会依次通过Input driver、Input core和Event handler最后到达用户空间。输入子系统是所有I/O设备驱动的中间层,为上层提供了一个统一的界面。例如,在终端系统中,我们不需要去管有多少个键盘,多少个鼠标。它只要从输入子系统中去取对应的事件(按键,鼠标移位等)就可以了。

  • Input driver :主要实现对硬件设备的读写访问,中断设置,并把硬件产生的事件转换为核心层定义的规范提交给事件处理层。
  • Input core :承上启下。为设备驱动层提供了规范和接口,通知事件处理层对事件进行处理;
  • Event handler :提供用户编程的接口(设备节点),并处理驱动层提交的数据处理。

正如之前所提到的,Linux支持不同类型的输入设备,不同的输入设备支持的操作事件也不相同,Linux支持的上报时间如下表所示:

事件事件码解释
EV_SYN0x00同步事件
EV_KEY0x01按键事件
EV_REL0x02相对坐标(如:鼠标移动,报告相对最后一次位置的偏移)
EV_ABS0x03绝对坐标(如:触摸屏或操作杆,报告绝对的坐标位置)
EV_MSC0x04其它
EV_SW0x05开关
EV_LED0x11按键/设备灯
EV_SND0x12声音/警报
EV_REP0x14重复
EV_FF0x15力反馈
EV_PWR0x16电源
EV_FF_STATUS0x17力反馈状态
EV_MAX0x1f事件类型最大个数和提供位掩码支持

“立即购买”属于触摸屏的输入上报EV_ABS绝对坐标,整个上报过程如下:

  • input_reprot_abs(input_dev,ABS_X,x);上报x坐标
  • input_reprot_abs(input_dev,ABS_Y,y); 上报y坐标
  • input_reprot_abs(input_dev,ABS_PRESSURE,1); 上报压力
  • input_sync(input_dev); 同步结束
    下面这张图可以更形象的说明这个过程,通过Linux的输入子系统,“立即购买”完成了从硬件到内核最后到到用户空间的过程。

在Android中是存在/dev/input/event* 设备节点中,Android SDK中还提供了getevent工具可以查看设备下挂载的输入设备以及查看设备节点中的输入数据。

root@rk3288:/ # getevent
getevent
add device 1: /dev/input/event3
  name:     "ILITEK Multi-Touch-V3020"
add device 2: /dev/input/event2
  name:     "PC Camera"
add device 3: /dev/input/event1
  name:     "gsensor"
add device 4: /dev/input/event0
  name:     "rk29-keypad"

root@rk3288:/ # ls /dev/input
ls /dev/input
event0
event1
event2
event3
// 读取 event3 数据(触摸屏)
root@rk3288:/ # getevent -t /dev/input/event3
getevent -t /dev/input/event3
[    1141.248434] 0003 0039 0000000e
[    1141.248434] 0003 0035 00002cd4
[    1141.248434] 0003 0036 00001a09
[    1141.248434] 0001 014a 00000001
[    1141.248434] 0003 0000 00002cd4
[    1141.248434] 0003 0001 00001a09
[    1141.248434] 0000 0000 00000000
[    1141.322181] 0003 0039 ffffffff
[    1141.322181] 0001 014a 00000000
[    1141.322181] 0000 0000 00000000

上面就是“立即购买”存储在设备节点中的形式,[ 1141.248434] 0003 0039 0000000e为例说明一下其中的含义,其中[1141.248434]是时间戳,0003是事件类型,0039是事件码,0000000e是事件的值。getevent以文本形式输出事件类型和名称,其结果如下

root@rk3288:/ # getevent -l /dev/input/event3
getevent -l /dev/input/event3 // 事件类型      事件码              事件值
EV_ABS       ABS_MT_TRACKING_ID   0000000f
EV_ABS       ABS_MT_POSITION_X    00002bbc
EV_ABS       ABS_MT_POSITION_Y    00001b6d
EV_KEY       BTN_TOUCH            DOWN
EV_ABS       ABS_X                00002bbc
EV_ABS       ABS_Y                00001b6d
EV_SYN       SYN_REPORT 00000000 EV_ABS       ABS_MT_TRACKING_ID   ffffffff
EV_KEY       BTN_TOUCH            UP
EV_SYN       SYN_REPORT 00000000

正如之前所提到的,“立即购买”会以EV_ABS事件传递,存储的就是它的绝对坐标。经过以上分析,我们已经跟随着“立即购买”的脚步从硬件到内核,最后到了用户空间,算是走完了它童年,那么接下来又将面对什么样的挑战呢?让我们拭目以待。

最后

有兴趣可以关注公众号QStack,会分享一些文章和免费学习资源。
在这里插入图片描述

推荐阅读

实习面试总结

Android事件分发机制

【QNX+Android虚拟化方案】48 - Android 侧用户层 输入子系统获取 /dev/input/event0 节点数据 代码流程分析 阅读详情

相关推荐

Android/Linux平台触摸屏驱动开发详解与实战

你以为触摸只是一个简单的坐标上报?错了!从电信号采集、通信协议传输、坐标解析、滤波去噪、非线性补偿,再到事件分发、UI 响应,整个链条涉及硬件、驱动、系统、框架多个层级的精密协作。每一个环节的微小优化,都会直接影响用户体验。比如:- 差 10ms 的延迟,你就觉得“卡”;- 差 5px 的精度,你就说“不准”;- 多一次误触,你就想砸手机 🤬。所以,下次当你流畅地滑动页面时,请记得背后有无数工程师为此付出的努力。

weixin_42602241的博客 921

一文简单了解Android中的input流程

在 Android 中,输入事件(例如触摸、按键)从硬件传递到应用程序并最终由应用层消费。整个过程涉及多个系统层次,包括硬件层、Linux 内核、Native 层、Framework 层和应用层。我们将深入解析这一流程,并结合代码逐步了解输入事件的传递。

执剑人 2154

uniapp监听扫码枪键盘事件|无输入框式监听

一般的扫码枪通过USB或蓝牙连接手机或电脑,充当的是一个外接设备。当扫码后,扫码枪会自动识别内容,然后向连接的电脑或手机发送键盘事件keydown或keyup。

tcy9099的专栏 9753

Android 屏幕操作原理

给大家介绍下AndroidonTouchEven的实现原理以及调用流程 android Activity或View 里有 onTouchEvent() 事件,当我们对手机的屏幕进行操作,如点击、移动、抬起,都会触发 onTouchEvent 事件

crasheye的博客 1327

飞塔防火墙之Link Monitor

Link Monitor类似于SLA,飞塔防火墙线路质量探测的一个功能。

weixin_41903258的博客 2410

高速设计注意事项总结——MDI篇

在以太网高速通信系统中,MDI(Medium Dependent Interface,介质相关接口)是连接物理层芯片(PHY)与传输介质(如网线)的关键接口,其设计直接影响信号完整性、传输速率和抗干扰能力。本文围绕 MDI 及 RJ45 接口电路、关键参数、设计与布线要点展开,为高速以太网设计提供参考。本文包含MDI 及 RJ45 接口电路组成、电路设计注意事项、布局布线要求等内容

qq_16237389的博客 1453

getevent/sendevent源代码

getevent/sendevent源码 这两个命令的源码在system/core/toolbox/下,sendevent.c getevent.c getevent 使用getevent获得/dev/input/eventX设备汇报的事件,这个命令还会输出所有event设备的基本信息,如下: add device 1: /dev/input/event1   n

AndyTsui的专栏 2911

提升仿真效率:Synopsys VCS高级编译选项优化技巧(2023最新版)

本文深入探讨了Synopsys VCS 2023版本中的高级编译选项优化技巧,帮助工程师提升仿真效率。通过并行编译、智能代码分析、精准覆盖率采样等策略,结合真实案例展示如何显著缩短仿真周期并优化资源使用,适用于数字芯片验证和大型SoC设计。

weixin_30338481的博客 115

Android 平台电容式触摸屏的驱动基本原理

硬件工作原理 驱动基本原理 中断(工作队列) input子系统 电容式触摸屏的驱动基本原理

Younix凌乱的草稿本 1万+

StarRocks 面试题及参考答案详解(万字详解)

Broker Load的过程通常涉及到数据的解析、转换和加载,它支持多种数据格式,并且可以处理复杂的数据导入任务。一方面,压缩可以减少磁盘I/O操作,因为压缩后的数据占用的空间更小,需要读取的数据块数量也就更少。在StarRocks中,表数据可以被划分成多个分区,每个分区包含表的一部分数据。在传统的行存储模型中,数据是按行组织的,这意味着在执行分析查询时,系统需要读取并处理整行数据,即使很多时候只需要查询其中的少数几列。物化视图的更新可以是完全重算,也可以是增量更新,取决于物化视图的定义和数据变更的模式。

大模型大数据攻城狮的专栏 2084

百元价位霍尔摇杆手柄深度评测:西圣GC1如何解决漂移痛点?

游戏手柄作为人机交互的重要外设,其核心在于精准、可靠地将玩家操作转化为游戏指令。传统电位器摇杆因物理磨损易导致‘漂移’问题,严重影响操作体验。为解决这一顽疾,基于霍尔效应的电磁摇杆技术应运而生,它通过非接触式磁感应原理,从根本上杜绝了物理磨损,实现了更高的精度与超长寿命,为玩家提供了稳定可靠的操作基础。这项技术的价值在于显著提升了手柄的耐用性和操作一致性,使其在动作游戏、赛车模拟等需要精细操控的场景中表现出色。西圣GC1手柄正是将这一先进技术下放至百元价位的代表产品,它通过搭载**霍尔摇杆**有效解决了漂移

weixin_34184158的博客 428

RH850从0搭建Autosar开发环境系列讲解 - 总目录

Davinci Autosar实战开发从0构建开发能力。OS,COM,DCM,BSWMM,ECUM,VLINK,XCP,MEMMAP等模块配置,带你熟悉运行的autosar代码,包括MICROSAR的启动运行,使用GreenHills生成运行的hex。

weixin_42412049的博客 1万+

Android getevent用法实例详解

Android getevent用法实例详解最近在测试设备按键的常用命令,感觉这些命令都有的,但就是不知道怎么查找。翻阅了几篇博文,才发现有一个getevent,就是指这样的命令.首先需要说明的是getevent命令后面可以带上具体的input设备,列如getevent /dev/iput/event0,这样可以过滤掉一些不用显示的input的设备.我在之前的使用中,还是有些找不到点子,也是一步一...

Mouse的专栏 2030

二极管限幅电路和钳位电路

二极管限幅电路和钳位电路学习

HW-BASE的博客 930

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

为了讲清楚Android触摸事件,我“拆了部手机”

本篇文章稍微有点长,从硬件驱动,系统内核,到 Framework 都有涉及。其中,了解 IMS 的实现原理,APP 和 IMS 通信的建立,以及 ViewGroup 的 dispatchTouchEvent() 方法的事件派发逻辑,是本篇文章比较重要的内容。

chuyouyinghe的专栏 866

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

Android按键事件——上层与驱动的映射

http://blog.youkuaiyun.com/zengdaquan007/article/details/8686431 首先查看android对上层按键事件的定义,在头文件中: [cpp] view plaincopy "font-size:14px;">static const KeycodeLabel KEYCODES[] = {      { "SOFT_

pillarbuaa的专栏 7387

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

安卓/dev/input/event1 模拟触屏输入

原因:linux万物皆文件的哲学理念,输入也是一种文件。 进入/data/local/tmp/ 然后执行命令cat /dev/input/event1> exp.bin 。然后app点击几次,按ctrl+c结束之前的命令得到exp.bin,adb pull下来之后叠加 ,越大越好。然后adb push exp.bin /data/local/tmp,之后上传并运行以下脚本: #!/system/bin/sh while true do cat exp.bin >> /dev/input

fjh1997的博客 9143

Android 查看按键信息的常用命令详解

getevent //查看所有键值事件的键值数值getevent -l //查看所有键值事件的键值字符串dumsys input //查看输入事件的相关信息,event对于的名称等信息。

wenzhi的博客 5460

Android Framework 输入子系统 (11)sendevent与getevent命令解读

系列文章解读&说明: Android Framework 输入子系统 的 分析主要分为以下部分: Android Framework 输入子系统(01)核心机制 inotify和epoll Android Framework 输入子系统(02)核心机制 双向通信(socketpair+binder) Android Framework 输入子系统(03)输入系统框架 Androi...

wangdsh的博客 3513

Android下event事件深度解析

Android手机下getevent/sendevent,源代码路径system/core/toolbox/下,sendevent.c getevent.c getevent.h getevent 使用getevent获得/dev/input/eventX设备汇报的事件,这个命令还会输出所有event设备的基本信息, add device 1: /dev/input/even

杨小扬的专栏 5972

Android 中input event的分析

Android 的Input Event 子系统在framework中的来龙去脉。

learnrose的专栏 3万+

Android 源码分析 - 输入 - 细节

类型和标志位 Policy Policy标志位,来源与RawEvent,通常由Map文件设置。 enum { POLICY_FLAG_WAKE = 0x00000001, POLICY_FLAG_WAKE_DROPPED = 0x00000002, POLICY_FLAG_SHIFT = 0x00000004, POLICY_FLAG_CAPS_LOCK = 0x00000008, POLICY_FLAG_...

luansxx的专栏 1177

Android通过代码模拟物理、屏幕点击事件

本文讲的是通过使用代码,可以控制手机的屏幕和物理按键,也就是说不只是在某一个APP里去操作,而是整个手机系统。 getevent/sendevent getevent&sendevent 是android系统下的一个工具,可以模拟多种按键和触屏操作,产生的是raw event,raw event经过event hub处理产生最终的gesture事件。getevent用于获取...

dawuafang 7252

Android显示已拔出设备,android input设备event处理以及hotplug检测

android平台2.3.4,发现插上usb鼠标和键盘开机,那么都能正常使用,一旦拔出以后再插回去,就不能使用了。首先检测/dev/input下的设备节点是否正常,发现拔出和插入设备,节点文件都能正常删除和创建。# ls /dev/input/ -altotal 8drwxrwxrwx 2 root root 4096 Feb 29 2012 ./drwxrwxr...

weixin_29890207的博客 931

linux android getevent,Android(Linux)模拟按键、触摸屏等事件

前提:在我们应用程序或者在写Android自己主动化測试时候经常会须要模拟实体按键,来给我们做測试用。这也是我要整理的目的。基本的涉及的是Linux Input Event事件。下面的样例基于Android 5.1(Linux-3.10)。一、利用getevent、sendevent模拟按键(1)命令:getevent -t结果:...add device 6: /dev/input/event9...

weixin_42102634的博客 731
上一篇: 元宇宙:未来or骗局?
下一篇: 每日算法之数组(一)
QStack
博客等级 码龄6年 30粉丝 80原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值