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

移植 AWTK 到 纯血鸿蒙 (HarmonyOS NEXT) 系统 (6) - 触屏事件

AWTK 作为一个GUI引擎,自然少不了对触屏事件的支持。这里我们先支持单点触摸,后续再支持多点手势。

1. 注册 XComponent 的触屏事件回调

这个在 AppNapi 的构造函数中完成:

AppNapi::AppNapi(std::string &id) {id_ = id;component_ = nullptr;auto appCallback = AppNapi::GetNXComponentCallback();appCallback->OnSurfaceCreated = OnSurfaceCreatedCB;appCallback->OnSurfaceChanged = OnSurfaceChangedCB;appCallback->OnSurfaceDestroyed = OnSurfaceDestroyedCB;appCallback->DispatchTouchEvent = DispatchTouchEventCB;auto appMouseEventCallback = AppNapi::GetNXComponentMouseEventCallback();appMouseEventCallback->DispatchMouseEvent = DispatchMouseEventCB;awtk_app_ = new AwtkApp(id);
}

2. 在触屏事件的回调函数中,将事件分发给 awtk_app

事件需要根据当前屏幕的缩放比例,转换为 awtk 的坐标系。

void AppNapi::DispatchTouchEvent(OH_NativeXComponent *component, void *window) {int32_t ret = OH_NativeXComponent_GetTouchEvent(component, window, &touchEvent_);if (ret == OH_NATIVEXCOMPONENT_RESULT_SUCCESS) {double dpr = awtk_app_->GetDevicePixelRatio();int x = touchEvent_.x / dpr;int y = touchEvent_.y / dpr;int button = 0;switch (touchEvent_.type) {case OH_NATIVEXCOMPONENT_DOWN: {awtk_app_->DispatchPointerDown(button, x, y);break;}case OH_NATIVEXCOMPONENT_MOVE: {awtk_app_->DispatchPointerMove(button, x, y);break;}case OH_NATIVEXCOMPONENT_UP: {awtk_app_->DispatchPointerUp(button, x, y);break;}default: {break;}}} else {LOGE("Touch fail");}
}

3. 将事件注入主循环

void AwtkApp::DispatchPointerDown(int button, int x, int y) {mPressed = true;pointer_event_t event;widget_t *widget = window_manager();pointer_event_init(&event, EVT_POINTER_DOWN, widget, x, y);event.pressed = mPressed;event.button = button;event_queue_req_t r;memset(&r, 0x00, sizeof(r));r.pointer_event = event;main_loop_queue_event(main_loop(), &r);
}

4. 加入触屏事件支持后,就可以通过触屏操作界面了

在这里插入图片描述


http://www.mrgr.cn/news/64948.html

相关文章:

  • 为什么使用hooks,什么情况下使用hooks
  • 【Kettle的安装与使用】使用Kettle实现mysql和hive的数据传输(使用Kettle将mysql数据导入hive、将hive数据导入mysql)
  • 《高频电子线路》—— 角度调制(调相、调频)
  • Git 使用指南:从基础到实战
  • RT-Thread学习
  • 大型语言模型(LLM)的小型化研究进展
  • mysql的存储函数
  • 《CLR via C#》读书笔记--CLR的执行模型
  • 小白投资理财 - 看懂布林线 BOLL
  • Android笔记(三十一):Deeplink失效问题
  • 英语写作中“出于……”out of的用法
  • 实习冲刺Day12
  • notify和notifyAll的区别,以及sleep、wait和join的区别
  • OPENAI官方建议
  • 推荐一款Windows维护和修复工具包:RepairKit
  • 代码随想录day14| 226.翻转二叉树 、101. 对称二叉树 、 104.二叉树的最大深度、 111.二叉树的最小深度
  • ssm+vue669基于web的学生考勤管理系统设计与实现
  • 使用uniapp使用音乐播放组件网易云
  • 系统架构师如何备考-超有用的备考经验(送博主用到的资料)
  • 国内PLC市场份额报告,西门子老大的地位从未动摇
  • Web服务器(理论)
  • 青少年编程能力等级测评CPA试卷(2)Python编程(一级)
  • 华为HCIP —— QinQ技术实验配置
  • 你还在用一串数字访问你的系统吗?
  • Android IPC机制(三)进程间通信方式
  • CentOS8.5.2111(6)冬日阳光下跳一曲桑巴--SAMBA共享存储