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

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

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

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

cpp 复制代码
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 的坐标系。

cpp 复制代码
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. 将事件注入主循环

cpp 复制代码
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. 加入触屏事件支持后,就可以通过触屏操作界面了

相关推荐
Android-Flutter1 小时前
android 动画详解
android·kotlin
小孔龙7 小时前
GraphicBuffer 跨进程共享
android
行业研究员7 小时前
Android内置GPS与腾讯地图定位技术对比分析
android·android定位·腾讯地图定位
云端漫步19877 小时前
HarmonyOS 互动卡片实战:快递卡片与睡眠卡片完整开发流程
华为·harmonyos
Android-Flutter8 小时前
android WMS 详解(二)
android·kotlin
智塑未来8 小时前
鸿蒙6.1隐私安心加倍:加密分享、星盾防诈、应用锁三重保护,守护到位
华为·harmonyos
游戏开发爱好者88 小时前
App Store 上传 IPA 自动化,.p8 密钥认证与 CI/CD 接入实战
android·运维·ci/cd·小程序·uni-app·自动化·iphone
byte轻骑兵9 小时前
2026手机远程办公:向日葵、TeamViewer、ToDesk鸿蒙适配+传文件+AI审计功能对比
智能手机·harmonyos·todesk·teamviewer·手机远程办公
贾伟康9 小时前
【知律|06】HarmonyOS ArkTS 法律分类实战:让民法、劳动、消费等入口可维护
harmonyos·arkts·arkui·分类设计·多设备
游戏开发爱好者810 小时前
iOS 推送怎么配置,APNs 推送证书、设备库与群发
android·ios·小程序·https·uni-app·iphone·webview