Android 4.0 触摸屏消息(一大写的一)

android4.2触摸屏驱动与4.0的差异 1、上报的消息不同: 在android4.0系统中只需要报告: ABS_MT_POSITION_X ABS_MT_POSITION_Y ABS_MT_TOUCH_MAJOR ABS_MT_WIDTH_MAJOR等主要消息; 但android4.2已经修改消息ABS_MT_TOUCH_MAJOR的表示的功能,所以讲ABS_MT_TOUCH_MAJOR修改为ABS_MT_P 阅读详情

        “消息”一词最早出现于《易经》:“日中则昃,月盈则食,天地盈虚,与时消息。“意思是说,太阳到了中午就要逐渐西斜,月亮圆了就逐渐亏缺,天地间的事物,或丰盈或虚弱,都随着时间的推移而变化,有时消减,有时滋长。由此可见,中国古代就把客观世界的变化,把它们的发生、发展和结局,把它们的枯荣、聚散、沉浮、升降、兴衰、动静、得失等等变化中的事实称之为”消息“。----------摘自度娘。

         因此,在此处我们所要学习的消息也是有这样的一种产生,发展和结束的过程。而产生就是指当硬件接受到人的触摸的情况之下,通过中断将消息上报,从而我们能够通过上层的线程得到这个消息,而具体是如何处理的都将通过线程内部或者线程间的调用完成,最后通过分发线程将消息分发出去供消费者去消耗。

        在深入学习之前我们先要思考如下几个问题:

        1 消息是如何让系统得到的?

        2 消息是如何被系统读取和处理的?

        3 应用程序开发者是如何利用消息的?

1     首先kernel中我们会使用下面的函数来上报事件。(linux/input.h)

设置:
    1227     unsigned long evbit[BITS_TO_LONGS(EV_CNT)];
    1228     unsigned long keybit[BITS_TO_LONGS(KEY_CNT)];
    1229     unsigned long relbit[BITS_TO_LONGS(REL_CNT)];
    1230     unsigned long absbit[BITS_TO_LONGS(ABS_CNT)];

上报:

    1474 static inline void input_report_key(struct input_dev *dev, unsigned int code, int value)
    1475 {
    1476     input_event(dev, EV_KEY, code, !!value);
    1477 }
    1478
    1479 static inline void input_report_rel(struct input_dev *dev, unsigned int code, int value)
    1480 {
    1481     input_event(dev, EV_REL, code, value);
    1482 }
    1483
    1484 static inline void input_report_abs(struct input_dev *dev, unsigned int code, int value)
    1485 {
    1486     input_event(dev, EV_ABS, code, value);
    1487 }

其中调用的input_event函数如下:

     347 void input_event(struct input_dev *dev,
     348          unsigned int type, unsigned int code, int value)
     349 {
     350     unsigned long flags;
     351
     352     if (is_event_supported(type, dev->evbit, EV_MAX)) {
     353
     354         spin_lock_irqsave(&dev->event_lock, flags);
     355         add_input_randomness(type, code, value);
     356         input_handle_event(dev, type, code, value);
     357         spin_unlock_irqrestore(&dev->event_lock, flags);
     358     }
     359 }
     360 EXPORT_SYMBOL(input_event);

此处的input_handle_event()会调用到input_pass_event()函数

      77 static void input_pass_event(struct input_dev *dev,
      78                  unsigned int type, unsigned int code, int value)
      79 {
      80     struct input_handler *handler;
      81     struct input_handle *handle;
      82
      83     rcu_read_lock();
      84
      85     handle = rcu_dereference(dev->grab);
      86     if (handle)
      87         handle->handler->event(handle, type, code, value);
      88     else {
      89         bool filtered = false;
      90
      91         list_for_each_entry_rcu(handle, &dev->h_list, d_node) {
      92             if (!handle->open)
      93                 continue;
      94
      95             handler = handle->handler;
      96             if (!handler->filter) {
      97                 if (filtered)
      98                     break;
      99
     100                 handler->event(handle, type, code, value);
     101
     102             } else if (handler->filter(handle, type, code, value))
     103                 filtered = true;
     104         }
     105     }
     106
     107     rcu_read_unlock();
     108 }

上面的handler就是函数evdev_handler()。定义在evdev.c文件中。在evdev_init()中通过调用input_register_handler(&ev_handler)的注册完成了input_dev和evdev_handler的关联。并且调用了evdev_event()函数完成了对evdev_pass_event()将数据存放在buffer中。代码如下:

 59 static void evdev_pass_event(struct evdev_client *client,
  60                  struct input_event *event)
  61 {
  62     /* Interrupts are disabled, just acquire the lock. */
  63     spin_lock(&client->buffer_lock);
  64
  65     wake_lock_timeout(&client->wake_lock, 5 * HZ);
  66     client->buffer[client->head++] = *event;
  67     client->head &= client->bufsize - 1;
  68
  69     if (unlikely(client->head == client->tail)) {
  70         /*
  71          * This effectively "drops" all unconsumed events, leaving
  72          * EV_SYN/SYN_DROPPED plus the newest event in the queue.
  73          */
  74         client->tail = (client->head - 2) & (client->bufsize - 1);
  75
  76         client->buffer[client->tail].time = event->time;
  77         client->buffer[client->tail].type = EV_SYN;
  78         client->buffer[client->tail].code = SYN_DROPPED;
  79         client->buffer[client->tail].value = 0;
  80
  81         client->packet_head = client->tail;
  82     }
  83
  84     if (event->type == EV_SYN && event->code == SYN_REPORT) {
  85         client->packet_head = client->head;
  86         kill_fasync(&client->fasync, SIGIO, POLL_IN);
  87     }
  88
  89     spin_unlock(&client->buffer_lock);
  90 }

      在底层设备的注册和分配工作也就大体上完成了。此时我们需要考虑如何读取数据的问题了。在kernel部分的读取先暂时不做介绍。

      这样我们就能够完成对触摸屏的设置。这些我们在前面的文章中描述过。http://blog.youkuaiyun.com/codectq/article/details/7478936

2  在frameworks层数据的读取过程

        首先我们需要了解最重要的一个环节就是EventHub。它是系统中所有事件的中央处理站。它管理所有系统中可以识别的输入设备的输入事件。另外,当设备增加和删除时,EventHub将产生相应的输入事件给系统。以下是在EventHub.cpp文件中的getEvents函数中打开设备的代码。主要调用了scanDevicesLocked().

      

0569         if (mNeedToScanDevices) {
0570             mNeedToScanDevices = false;
0571             scanDevicesLocked();
0572             mNeedToSendFinishedDeviceScan = true;
0573         }

而scanDevicesLocked()函数的代码如下:

static const char *DEVICE_PATH = "/dev/input";

0801 void EventHub::scanDevicesLocked() {
0802     status_t res = scanDirLocked(DEVICE_PATH);
0803     if(res < 0) {
0804         LOGE("scan dir failed for %s\n", DEVICE_PATH);
0805     }
0806 }
接着往下调用:
1270 status_t EventHub::scanDirLocked(const char *dirname)
1271 {
1272     char devname[PATH_MAX];
1273     char *filename;
1274     DIR *dir;
1275     struct dirent *de;
1276     dir = opendir(dirname);
1277     if(dir == NULL)
1278         return -1;
1279     strcpy(devname, dirname);
1280     filename = devname + strlen(devname);
1281     *filename++ = '/';
1282     while((de = readdir(dir))) {
1283         if(de->d_name[0] == '.' &&
1284            (de->d_name[1] == '\0' ||
1285             (de->d_name[1] == '.' && de->d_name[2] == '\0')))
1286             continue;
1287         strcpy(filename, de->d_name);
1288         openDeviceLocked(devname);
1289     }
1290     closedir(dir);
1291     return 0;
1292 }

      这时需要底层的文件系统将设备打开并且读取设备中的数据。但是读取的数据并不能够被上层的应用程序直接使用而是需要经过cook处理。

C++视区窗口触摸屏消息捕获 .在 Scratchpad.cpp 中,在 CScratchPadApp::InitInstance(): 后添加以下检查代码: [cpp] view plain copy 1. BYTE digitizerStatus = (BYTE) GetSystemMetrics(SM_DIGITIZER); 2. 3. if ((digitizerStatus & (0x80 + 0x40)) == 0) 4. //堆栈就绪+多触点 5. 6. { 7. 8. AfxMessageBox(L"No touch input is currently available."); 9. 10. return false; 11. 12. } 13. 14. 15. 16. BYTE nInputs = (BYTE) GetSystemMetrics(SM_MAXIMUMTOUCHES); 17. 18. 19. 20. CString str; 21. 22. str.Format(L"Touch input available with %d touch points.", nInputs); 23. 24. AfxMessageBox(str); 25. 26. 27. 28. return true; 立即下载

相关推荐

跨域问题 - 其他 method 都没有跨域问题,只有delete有跨域的问题

跨域的配置等一切正常,GETPOSTPUTOPTIONS都可以正常访问, 唯独有一个DELETE有跨域的问题, 经过排查发现这个DELETE请求有body, 经过一系列排查, 发现头部有一个不太正常的值是为了避免浏览器的影响, 直接在 postman 中新建一个请求, 竟然也有跨域的问题, 后来把的值改成了请求就可以正常调用了.

galoiszhou的博客 528

大写的1到10字怎么写?

想必大家也知道,数字分好几种,阿拉伯数字是最普遍的一种。目前,在我国主要使用的是阿拉伯数字。而在以前,主要使用的是中文数字。它是以汉字的形式表示数字,有小写、大写两种。其中,〇、一、二、三、四、五、六、七、八、九、十是小写。那么,大写的一到十怎么写呢?下面我就来给各位普及一下知识。 一到十的大写是壹、贰、叁、肆、伍、陆、柒、捌、玖、拾。除此之外,大写的还有佰、仟、万、亿、兆、京、垓、秭、穰、沟、涧、正、载、极。 数字是一种用来表示数的书写符号,不同的记数系统可以使用相同的数字。汉字的数字有小写、大写两种,

weixin_44332288的博客 1万+

64、5G 侧链通信技术详解

本文详细解析了5G侧链通信的关键技术,包括资源感知与选择、UE间协调、混合ARQ、功率控制、信道探测与CSI报告以及侧链同步。资源感知与选择通过周期性或随机方式实现资源分配,UE间协调通过主动或被动方式避免资源冲突。混合ARQ机制确保数据传输可靠性,功率控制和信道探测优化传输质量并减少干扰。侧链同步则通过多种方式确保设备间时间一致性。这些技术相互配合,构建了高效稳定的5G侧链通信体系,适用于智能交通、物联网、应急通信等多个领域,为未来无线通信发展提供强大支撑。

oil88的博客 102

触控板和触摸屏动作数据解析

在Windows系统中,预设了一些多点触控手势操作,提供用户进行操作。但有时候我们想要自己定义一些手势,来实现其他的操作,这就需要进行触摸输入的开发。

ccf19881030的专栏 1417

8、内存交织技术详解

本文详细解析了内存交织技术的基本原理、工作机制及实现方式,探讨了其在提升内存访问速度和系统性能中的关键作用。文章还分析了内存交织的优缺点、实际应用场景以及与其他优化技术的结合应用,并提出了未来发展的可能方向,为理解与运用该技术提供了全面参考。

g9h0i1的博客 549

保研考研机试攻略:第一章——从零开始

🧊保研考研机试攻略:第一章——从零开始

qq_63349644的博客 1321

要求改用相应的小写字母输出. 从键盘上输入一大写英文字母

tid=307738 a+32); getch(); }本贴来自ZDNetChina中文社区 http://bbs.zdnet.com.cn a-32); if(a>=A&&a=a&&a<="z") printf("%c" #include main() { char a; printf("Please input a char:/n"); scanf("%c" 本贴

1874

DSPy 入门: 再见提示,你好编程

DSPy("Declarative Self-improving Language Programs (in Python)",发音为 "dee-es-pie")[1] 是斯坦福大学 NLP 研究人员开发的 "基础模型编程 "框架。它强调编程而非提示,并将构建基于 LM 的管道从操作提示转向编程。因此,它旨在解决构建基于 LM 应用程序时的脆弱性问题。DSPy 还将程序的信息流与每一步的参数(提示和 LM 权重)分离开来,为构建基于 LM 的应用程序提供了更系统的方法。

具身机器人和通用AI 3486

Android 4.0 触摸屏消息(二大写的二)

在前文Android 4.0 触摸屏消息(一大写的一)中,我们从跟硬件最接近的两个部分对整个触摸屏消息的获取进行了简单的描述,但是对于我们系统来讲此时的消息并不好用,对于应用程序开发着而言更是极不方便。但是Android的产生就解决了Java开发的问题,使得整个开发过程周期变短。在android中,通过cook函数完成将原始数据转化成应用程序可以使用的数据形式,这样应用程序开发者可以通过Motio

曹太强的专栏 3888

【干货分享】高通 SA8295P PCB 设计规范指南

高通SA8295P芯片是第四代骁龙汽车数字座舱平台的核心组件,采用5nm工艺,集成高性能CPU/GPU和30TOPS算力的NPU。文章详细介绍了该芯片各接口的layout设计规范,包括USB3.1/2.0、eDP/DP、MIPI CSI/DSI、PCIe Gen3等接口的阻抗、损耗、延时等关键指标要求,为新能源汽车电子设计提供重要参考。

一只豌豆象的博客 265

isaaclab无法识别NVIDIA显卡,如何解决?

🏆本文收录于 《全栈Bug调优(实战版)》 专栏,该专栏专注于分享我在真实项目开发中遇到的各类疑难Bug及其深层成因,并系统提供高效、可复现的解决思路和实操方案。无论你是刚入行的新手开发者,还是拥有多年项目经验的资深工程师,本专栏都将为你提供一条系统化、高质量的问题排查与优化路径,助力你加速成长,攻克技术壁垒,迈向技术价值最大化与职业发展的更高峰🚀!    📌 特别说明: 文中部分技术问题来源于真实生产环境及网络公开案例,均经过精挑细选与系统化整理,并结合多位一线资深架构师和工程师多年实战经验沉淀,提

**My Coding Family** 1146

android触摸屏映射,解决android4.0 触摸屏分辨率映射不准

前言几个月以前升级了android4.0,在触摸屏这块一直有个令人头疼的问题,通常触摸屏的分辨率应该是根据当前屏幕分辨率而定。但android4.0上就有点奇怪,不管怎么换屏幕的分辨率,触摸屏始终有不准的情况。最近着手研究了这块,通过修改inputreader.cpp及 com_android_server_InputManager.cpp终于解决的触摸屏不准的问题。正文由于驱动是直接从andro...

weixin_39874350的博客 1023

Python 神经计算实训 实训答案分享

【代码】Python 神经计算实训 实训答案分享。

2403_89314916的博客 351

Android-4.0支持触摸屏参考文档转载

---------------------------------------------------------------------------------------------------------------------------------- 原文链接:http://blog.csdn.net/joard_yang/article/details/7387316 在a

houyizi337825770的专栏 1257

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

在android 4.0上开发触摸设备驱动需要注意的几点

android 4.0已经渐渐流行,很多方案都已经基于其上,android 4.0的linux内核版本已经更新为linux 3.0,这个变化导致和内核直接接触的驱动需要或多或少的变化,以下描述的是触摸设备驱动的一些小变化: 1.当一个(这时候的情境应该是多点触摸的情况)手指或是触摸工具抬起(UP)时,他应该立即消失在多点出没的同步报告中,当所有的工具或手指抬起,驱动应该立即发送一个“空”同步

joard_yang的专栏 5404

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

Android HID触摸屏驱动怎么开发

Android HID触摸屏驱动怎么开发 公司的红外触摸屏要移植到Android平台上去,我们的设备需要发命令下去才会始动,然后返回触摸数据X,Y,需要把这些数据转化为屏幕位置,发送触摸消息给系统,实现触摸。 android 4.0已经渐渐流行,很多方案都已经基于其上,...

chuangxie5305的博客 733

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

Android 4.0 消息处理的流程之我见

最近本人想通过截获触摸屏的消息,从来能够用来进行相关的操作。但是目前的Android系统并不能够提供对这些事件的支持,因此本人采取了围魏救赵的方式试图对此问题能够进行很好的解决。          前面本人已经撰文描述了消息的相关知识。已经比较清晰的交代了消息的一般处理流程包括:从产生到消息的获取以及消息的处理过程。毕竟还是存在一些特殊的消息需要进行特殊的处理。         输入消息的处理

曹太强的专栏 1620

解决android4.0 触摸屏分辨率映射不准

前言   几个月以前升级了android4.0,在触摸屏这块一直有个令人头疼的问题,通常触摸屏的分辨率应该是根据当前屏幕分辨率而定。 但android4.0上就有点奇怪,不管怎么换屏幕的分辨率,触摸屏始终有不准的情况。最近着手研究了这块,通过修改inputreader.cpp 及 com_android_server_InputManager.cpp终于解决的触摸屏不准的问题。

a181622974的专栏 3741

android系统触摸屏虚拟按键

(一)虚拟按键的描述可以见韩超和梁泉的《Android系统级深入开发——移植与调试》的第八章:       虚拟按键(Virtual Key)是Eclair版本开始增加的新特性。Virtual Key的功能是利用触摸屏,模拟按键发生的事件,这样就可以利用触摸屏的边缘,实现一些可以自定义的按键效果。 虚拟按键的实现效果如图8-5所示。 图8-5  虚拟按键的实现效果

lqxandroid2012的专栏 4488

Android 4.0 消息处理的流程之我见

最近本人想通过截获触摸屏的消息,从来能够用来进行相关的操作。但是目前的Android系统并不能够提供对这些事件的支持,因此本人采取了围魏救赵的方式试图对此问题能够进行很好的解决。          前面本人已经撰文描述了消息的相关知识。已经比较清晰的交代了消息的一般处理流程包括:从产生到消息的获取以及消息的处理过程。毕竟还是存在一些特殊的消息需要进行特殊的处理。         输入消

caotaiqiang的专栏 431

Android4.0 input事件输入流程详解(中间层到应用层)

在Android系统中,类似于键盘按键、触摸屏等事件是由WindowManagerService服务来管理的,然后再以消息的形式来分发给应用程序进行处理。系统启动时,窗口管理服务也会启动,该服务启动过程中,会通过系统输入管理器InputManager来负责监控键盘消息。当某一个Activity激活时,会在该Service下注册一个接收消息的通道,表明可以处理具体的消息,然后当有消息时,InputM

撒哈拉的绿洲 8230
上一篇: Android上层启动过程的几个关键点
下一篇: Android 4.0 触摸屏消息(二大写的二)
野-百-合
博客等级 码龄17年 308粉丝 118原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值