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

移植 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.kler.cn/a/382728.html

相关文章:

  • 映像?什么是映像
  • R语言生物群落(生态)数据统计分析与绘图丨tidyverse数据清洗、多元统计分析、随机森林、回归及混合效应模型、结构方程模型等
  • string模拟实现流插入(输出)+流提取(输入)
  • 如何找到养生生活视频素材?推荐几个优秀网站
  • 查看网路信息-ifconfig命令
  • Java中的System类、Runtime类、Math类、BigInteger类、BigDecimal类、Random类
  • 【极客兔兔-Web框架Gee详解】Day2 上下文Context
  • 【UE5】一种老派的假反射做法,可以用于移动端,或对反射的速度、清晰度有需求的地方
  • Unity3D学习FPS游戏(10)子弹攻击敌人掉血(碰撞检测)
  • 【数据结构】线性表——顺序表
  • 基于Python的校园爱心帮扶管理系统
  • Python 学习完基础语法知识后,如何进一步提高?
  • 【系统面试篇】进程与线程类(2)(笔记)——进程调度、中断、异常、用户态、核心态
  • 树莓派Linux 安装 EtherCat Igh
  • 谷歌浏览器安装 Vue.js devtools 插件
  • 讲解JVM日志的查看及解决系统频繁GC问题
  • 链表拆分与快慢指针相关算法题
  • 算法时间复杂度和真实时间测算
  • 枚举,联合(共用体)
  • 前后端跨域联调
  • SpringBooot之事务失效的场景
  • 护肤品类电商代运营的公司介绍与分析
  • 【Docker】X-DOC:使用WSL在Windows中体验Linux发行版安装桌面版Docker
  • 在 MacOS 上跑 kaldi
  • Java+控制台 商城销售系统
  • 【动态规划 数学】2745. 构造最长的新字符串|1607