首页 > 其他分享 >移植 AWTK 到 纯血鸿蒙 (HarmonyOS NEXT) 系统 (8) - 原生输入法

移植 AWTK 到 纯血鸿蒙 (HarmonyOS NEXT) 系统 (8) - 原生输入法

时间:2024-11-04 12:20:02浏览次数:5  
标签:输入法 IME 纯血 HarmonyOS im harmony INPUT input method

AWTK 在嵌入式平台使用内置的输入法,在移动设备上使用系统的原生输入法。在 AWTK-Android 和 AWTK-IOS 中,使用的是 SDL 封装之后的系统原生输入法。在 AWTK-HarmonyOS 中,要使用系统的原生输入法。需要实现 input_method 接口:

1. 启动输入法

编辑器得到焦点时,启动输入法。

调用 OH_InputMethodController_Attach 函数启动输入法,注意需要先设置输入法需要的回调函数。

static ret_t input_method_harmony_enable(input_method_t *input_method) {
    InputMethod_ErrorCode code = InputMethod_ErrorCode::IME_ERR_OK;
    input_method_harmony_t *im = (input_method_harmony_t *)input_method;
    return_value_if_fail(im != NULL, RET_BAD_PARAMS);
    auto options = OH_AttachOptions_Create(true);
    auto textEditorProxy = OH_TextEditorProxy_CreateAndInit();
    auto inputMethodProxy = &(im->inputMethodProxy);

    code = OH_InputMethodController_Attach(textEditorProxy, options, inputMethodProxy);
    if (code == InputMethod_ErrorCode::IME_ERR_OK) {
        log_debug("attach input method ok\n");
    } else {
        log_warn("attach input method failed\n");
    }

    im->options = options;
    im->textEditorProxy = textEditorProxy;

    return RET_OK;
}

2. 关闭输入法

编辑器失去焦点时,关闭输入法。

static ret_t input_method_harmony_disable(input_method_t *input_method) {
    InputMethod_ErrorCode code = InputMethod_ErrorCode::IME_ERR_OK;
    input_method_harmony_t *im = (input_method_harmony_t *)input_method;
    return_value_if_fail(im != NULL, RET_BAD_PARAMS);

    code = OH_InputMethodController_Detach(im->inputMethodProxy);
    if (code != InputMethod_ErrorCode::IME_ERR_OK) {
        log_warn("Detach input method failed!");
    }
    im->inputMethodProxy = nullptr;
    OH_TextEditorProxy_Destroy(im->textEditorProxy);
    im->textEditorProxy = nullptr;
    OH_AttachOptions_Destroy(im->options);
    im->options = nullptr;

    return RET_OK;
}

3. 输入法回调

  • 获取输入法配置
static void input_method_harmony_get_text_config(InputMethod_TextEditorProxy *textEditorProxy,
                                                 InputMethod_TextConfig *config) {
    input_method_t *im = input_method();
    return_if_fail(im != NULL && im->widget != NULL);

    input_type_t type = (input_type_t)widget_get_prop_int(im->widget, WIDGET_PROP_INPUT_TYPE, INPUT_TEXT);
    InputMethod_TextInputType harmony_type = IME_TEXT_INPUT_TYPE_TEXT;

    switch (type) {
    case INPUT_TEXT: {
        harmony_type = IME_TEXT_INPUT_TYPE_TEXT;
        break;
    }
    case INPUT_INT:
    case INPUT_UINT: {
        harmony_type = IME_TEXT_INPUT_TYPE_NUMBER;
        break;
    }
    case INPUT_FLOAT:
    case INPUT_UFLOAT: {
        harmony_type = IME_TEXT_INPUT_TYPE_NUMBER_DECIMAL;
        break;
    }
    case INPUT_ASCII: {
        harmony_type = IME_TEXT_INPUT_TYPE_TEXT;
        break;
    }
    case INPUT_DATE:
    case INPUT_TIME:
    case INPUT_CUSTOM:
    case INPUT_TIME_FULL: {
        harmony_type = IME_TEXT_INPUT_TYPE_DATETIME;
        break;
    }
    case INPUT_EMAIL: {
        harmony_type = IME_TEXT_INPUT_TYPE_EMAIL_ADDRESS;
        break;
    }
    case INPUT_CUSTOM_PASSWORD:
    case INPUT_PASSWORD: {
        harmony_type = IME_TEXT_INPUT_TYPE_NEW_PASSWORD;
        break;
    }
    case INPUT_PHONE: {
        harmony_type = IME_TEXT_INPUT_TYPE_PHONE;
        break;
    }
    default: {
        break;
    }
    if (tk_str_eq(im->widget->vt->type, WIDGET_TYPE_MLEDIT)) {
        harmony_type = IME_TEXT_INPUT_TYPE_MULTILINE;
        OH_TextConfig_SetEnterKeyType(config, IME_ENTER_KEY_NEWLINE);
    } else {
        OH_TextConfig_SetEnterKeyType(config, IME_ENTER_KEY_NEXT);
    }
    OH_TextConfig_SetInputType(config, harmony_type);
    OH_TextConfig_SetPreviewTextSupport(config, true);
}
  • 输入文本
static ret_t wstr_from_char16(wchar_t *wstr, size_t size, const char16_t *text, size_t length) {
    size_t i = 0;
    for (i = 0; i < length && i < size; i++) {
        wstr[i] = text[i];
    }

    return RET_OK;
}

static void input_method_harmony_insert_text(InputMethod_TextEditorProxy *textEditorProxy, const char16_t *text,
                                             size_t length) {
    char str[512] = {0};
    wchar_t wstr[256] = {0};
    input_method_t *im = input_method();
    return_if_fail(im != NULL && im->widget != NULL);

    memset(wstr, 0x00, sizeof(wstr));
    wstr_from_char16(wstr, ARRAY_SIZE(wstr) - 1, text, length);

    tk_utf8_from_utf16(wstr, str, sizeof(str) - 1);

    input_method_commit_text(im, str);
}
  • 向前删除文本
static void input_method_harmony_delete_forward(InputMethod_TextEditorProxy *textEditorProxy, int32_t length) {
    input_method_t *im = input_method();
    return_if_fail(im != NULL && im->widget != NULL);
    input_method_dispatch_key(input_method(), TK_KEY_DELETE);
}
  • 向后删除文本
static void input_method_harmony_delete_backward(InputMethod_TextEditorProxy *textEditorProxy, int32_t length) {
    input_method_t *im = input_method();
    return_if_fail(im != NULL);
    input_method_dispatch_key(input_method(), TK_KEY_BACKSPACE);
}
  • 发送回车键
static void input_method_harmony_send_enter_key(InputMethod_TextEditorProxy *textEditorProxy,
                                                InputMethod_EnterKeyType enterKeyType) {
    input_method_t *im = input_method();
    return_if_fail(im != NULL && im->widget != NULL);
    switch (enterKeyType) {
    case IME_ENTER_KEY_NEXT: {
        widget_focus_next(im->widget);
        break;
    }
    case IME_ENTER_KEY_PREVIOUS: {
        widget_focus_prev(im->widget);
        break;
    }
    case IME_ENTER_KEY_NEWLINE: {
        input_method_dispatch_key(im, TK_KEY_RETURN);
        break;
    }
    default:
        break;
    }
}

4. 效果图

  • 文本输入

在这里插入图片描述

  • 数字输入

在这里插入图片描述

  • 多行输入

在这里插入图片描述

5. 已知问题

  • 目前只实现了基本功能,部分不常用的回调函数没有实现。

  • 鸿蒙系统没有提供设置输入位置的接口,所以在编辑器的位置偏下时,软键盘弹出时不会自动上推窗口,导致编辑器被软键盘遮挡。

标签:输入法,IME,纯血,HarmonyOS,im,harmony,INPUT,input,method
From: https://blog.csdn.net/absurd/article/details/143475489

相关文章

  • HarmonyOS:使用本地真机运行应用/服务
    ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★➤博客园地址:为敢技术(https://www.cnblogs.com/strengthen/ )➤GitHub地址:https://github.com/strengthen➤原文地址:https://www.cnblogs.com/strengthen/p/18523167➤如果链接不是为敢技术的博客园地址,则可能......
  • HarmonyOS NEXT开发实战教程:选择相册和拍照
    今天的内容是介绍在鸿蒙开发中从相册选择照片,和调用相机拍照,并使用这两个功能实现朋友圈编辑页面。  这部分内容没什么好废话的,都是固定用法,直接上代码。首先添加权限:ohos.permission.CAMERAohos.permission.READ_IMAGEVIDEO选择相册:​asyncgetAlbum(){co......
  • 移植 AWTK 到 纯血鸿蒙(HarmonyOS NEXT)系统 (0) - 序
    移植AWTK到纯血鸿蒙(HarmonyOSNEXT)系统(0)-序前段时间纯血鸿蒙系统HarmonyOS5.0(又称HarmonyOSNEXT)正式推出,这是继苹果iOS和安卓系统后,全球第三大移动操作系统。纯正国产操作系统登场,国人无不欢欣鼓舞,激动不已。HarmonyOS2.0时代我就尝试将AWTK移植到H......
  • 高并发IPC通信实现:HarmonyOS中的异步调用与多线程处理
    本文旨在深入探讨华为鸿蒙HarmonyOSNext系统(截止目前API12)的技术细节,基于实际开发实践进行总结。主要作为技术分享与交流载体,难免错漏,欢迎各位同仁提出宝贵意见和问题,以便共同进步。本文为原创内容,任何形式的转载必须注明出处及原作者。在当今的移动应用开发领域,高并发通信场......
  • HarmonyOS跨设备通信:多端协同的RPC数据传输实现
    本文旨在深入探讨华为鸿蒙HarmonyOSNext系统(截止目前API12)的技术细节,基于实际开发实践进行总结。主要作为技术分享与交流载体,难免错漏,欢迎各位同仁提出宝贵意见和问题,以便共同进步。本文为原创内容,任何形式的转载必须注明出处及原作者。在智能设备日益普及的今天,多设备协同工......
  • HarmonyOS:应用隐私保护
    ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★➤博客园地址:为敢技术(https://www.cnblogs.com/strengthen/ )➤GitHub地址:https://github.com/strengthen➤原文地址:https://www.cnblogs.com/strengthen/p/18519104➤如果链接不是为敢技术的博客园地址,则可能是......
  • HarmonyOS:应用数据安全
    ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★➤博客园地址:为敢技术(https://www.cnblogs.com/strengthen/ )➤GitHub地址:https://github.com/strengthen➤原文地址:https://www.cnblogs.com/strengthen/p/18519105➤如果链接不是为敢技术的博客园地址,则可能是......
  • HarmonyOS:长列表加载性能优化
    ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★➤博客园地址:为敢技术(https://www.cnblogs.com/strengthen/ )➤GitHub地址:https://github.com/strengthen➤原文地址:https://www.cnblogs.com/strengthen/p/18517770➤如果链接不是为敢技术的博客园地址,则可能是......
  • HarmonyOS:帧率和丢帧分析实践
    ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★➤博客园地址:为敢技术(https://www.cnblogs.com/strengthen/ )➤GitHub地址:https://github.com/strengthen➤原文地址:https://www.cnblogs.com/strengthen/p/18517566➤如果链接不是为敢技术的博客园地址,则可能是......
  • HarmonyOS:合理使用布局
    ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★➤博客园地址:为敢技术(https://www.cnblogs.com/strengthen/ )➤GitHub地址:https://github.com/strengthen➤原文地址:https://www.cnblogs.com/strengthen/p/18516696➤如果链接不是为敢技术的博客园地址,则可能是......