当前位置: 首页 > news >正文

Android NDK系列(三)输入事件分发到Native层的流程

 在Android NDK系列(一)手动搭建Native Project 创建的Native工程中,是可以接收输入事件的,只需在android_main中注册输入事件的处理函数,当触摸屏幕后,handleInputEvent函数便会调用,代码如下。

static int32_t handleInputEvent(struct android_app* app, AInputEvent* event)
{LOGI("android_main handleInputEvent");if(AInputEvent_getType(event) == AINPUT_EVENT_TYPE_MOTION && AInputEvent_getSource(event) == AINPUT_SOURCE_TOUCHSCREEN){int32_t action = AMotionEvent_getAction(event);float x = AMotionEvent_getX(event,0);float y = AMotionEvent_getY(event,0);switch(action){case AMOTION_EVENT_ACTION_DOWN:LOGI("android_main AMOTION_EVENT_ACTION_DOWN (x %f, y %f)", x,y);break;case AMOTION_EVENT_ACTION_MOVE:LOGI("android_main AMOTION_EVENT_ACTION_MOVE");break;case AMOTION_EVENT_ACTION_UP:LOGI("android_main AMOTION_EVENT_ACTION_UP");break;default:break;}}return 0;
}void android_main(struct android_app* app)
{app->onInputEvent = handleInputEvent;
}

   本文主要介绍触摸事件是如何传递过来的,主要分为以下两个部分。

一、创建输入队列

    要收到输入事件,首先要创建输入队列,ViewRootImpl在处理setView请求时开始创建输入队列,代码如下。

public final class ViewRootImpl implements ViewParent,View.AttachInfo.Callbacks, ThreadedRenderer.DrawCallbacks,AttachedSurfaceControl {public void setView(View view, WindowManager.LayoutParams attrs, View panelParentView,int userId) {if (mInputQueueCallback != null) {mInputQueue = new InputQueue();mInputQueueCallback.onInputQueueCreated(mInputQueue);}}
}
public final class InputQueue {public InputQueue() {mPtr = 
http://www.lryc.cn/news/351975.html

相关文章:

  • Kafka之【生产消息】
  • asp.net core接入prometheus
  • C++ 变量类型与转换
  • 【杂七杂八】Huawei Gt runner手表系统降级
  • FMEA做不出来的原因究竟是什么?——FMEA软件
  • pandas ExcelWriter写excel报错openpyxl.utils.exceptions.IllegalCharacterError
  • Golang创建文件夹
  • 头歌OpenGauss数据库-I.复杂查询第5关:至少学了某位学生(Oliver)所学的全部课程的学生
  • 【数据结构】哈夫曼树和哈夫曼编码
  • 深入探索微软Edge:领略新一代浏览器的无限可能
  • JavaScript表达式和运算符
  • 爬虫实训案例:中国大学排名
  • C++ IO流
  • debian nginx upsync consul 实现动态负载
  • 前端基础入门三大核心之HTML篇 —— 同源策略的深度解析与安全实践
  • go 微服务框架 kratos 日志库使用方法及原理探究
  • VC++位移操作>>和<<以及逻辑驱动器插拔产生的掩码dbv.dbcv_unitmask进行分析的相关代码
  • 查看gpu
  • CSS与表格设计
  • 阴影映射(线段树)
  • Docker 容器间通讯
  • C语言章节学习归纳--数据类型、运算符与表达式
  • Centos 7.9 使用 iso 搭建本地 YUM 源
  • NFT Insider #131:Mocaverse NFT市值破3.5万ETH,The Sandbox 参加NFCsummit
  • BatBot智慧能源管理平台,更加有效地管理能源
  • 医院预约挂号系统微信小程序APP
  • 【代码随想录 二叉树】二叉树前序、中序、后序遍历的迭代遍历
  • Error:(6, 43) java: 程序包org.springframework.data.redis.core不存在
  • Qt 科目一考试系统(有源码)
  • 在 Visual Studio 2022 (VS2022) 中删除 Git 分支的步骤如下