LVGL编写自定义控件:中文输入法

代码:

#ifndef LV_VIRTUALKEYBOARD_T_H
#define LV_VIRTUALKEYBOARD_T_H

#include "lvgl/lvgl.h"
#include <vector>
#include <string>

struct KeyboardLayout
{
    const char **layout; // 字符串数组的指针
    const lv_btnmatrix_ctrl_t *controls; // 控制结构体数组的指针
};

enum KeyboardMode
{
    Lowercase,          //小写模式
    Capital,            //大写模式
    Number,             //数字
    Select,             //选择键盘
    Special_symbols     //特殊符号
};

const int chineseWord_maxSize = 100;

typedef struct
{
    lv_obj_t obj;
    lv_obj_t * editPanel;
    lv_obj_t * chineseCharacterPanel;
    lv_obj_t * chineseCharacterPanel_container;//chineseCharacterPanel的容器,为了使中文太多chineseCharacterPanel显示不下可以滚动
    lv_obj_t * textArea;
    lv_obj_t * inputChineseCharacterLabel;
    std::vector<KeyboardLayout> layouts;
    KeyboardMode keyboardMode;
    bool isChinese;
    lv_style_t chineseCharacterPanel_style_main;
    lv_style_t chineseCharacterPanel_style_item;
    lv_style_t chineseCharacterPanel_container_style;
    std::string inputChineWord;
    const char * inputChineWordArray[chineseWord_maxSize + 1];
} lv_virtualKeyboard_t;

lv_obj_t * lv_virtualkeyboard_create(lv_obj_t * parent);
void lv_virtualKeyboard_set_textarea(lv_obj_t * obj, lv_obj_t * textArea);
void lv_virtualKeyboard_set_keyboardMode(lv_obj_t * obj,KeyboardMode mode);

#endif // LV_VIRTUALKEYBOARD_T_H
#include "lv_virtualkeyboard_t.h"
#include "utf8chinese.h"
#include <iostream>

LV_FONT_DECLARE(lv_font_siyuanheiti16);

#define MY_CLASS &lv_virtualKeyboard_class

#define LV_KB_BTN(width) LV_BTNMATRIX_CTRL_POPOVER | width

void lv_virtualkeyboard_constructor(const lv_obj_class_t * class_p, lv_obj_t * obj);
void lv_virtualkeyboard_destructor(const lv_obj_class_t * class_p, lv_obj_t * obj);
void lv_virtualKeyboard_def_event_cb(lv_event_t *e);
void updateMatchChinaWordList(lv_virtualKeyboard_t * keyboard);
void closeChineseCharacterPanel(lv_virtualKeyboard_t * keyboard);

const lv_obj_class_t lv_virtualKeyboard_class =
{
    .base_class     = &lv_obj_class,
    .constructor_cb = lv_virtualkeyboard_constructor,
    .destructor_cb  = lv_virtualkeyboard_destructor,
    .width_def      = LV_PCT(100),
    .height_def     = LV_PCT(50),
    .group_def      = LV_OBJ_CLASS_GROUP_DEF_TRUE,
    .instance_size  = sizeof(lv_virtualKeyboard_t),
};

lv_obj_t * lv_virtualkeyboard_create(lv_obj_t * parent)
{
    LV_LOG_INFO("begin");
    lv_obj_t * obj = lv_obj_class_create_obj(MY_CLASS, parent);
    lv_obj_class_init_obj(obj);
    return obj;
}

const char * layout_Lowercase_letters[] =
{
    "数字", "q", "w", "e", "r", "t", "y", "u", "i", "o", "p", LV_SYMBOL_BACKSPACE, "\n",
    "大小写", "a", "s", "d", "f", "g", "h", "j", "k", "l", LV_SYMBOL_NEW_LINE, "\n",
    "中/英文", "z", "x", "c", "v", "b", "n", "m", ".", ",", ":", "\n",
    LV_SYMBOL_KEYBOARD, LV_SYMBOL_LEFT, " ", LV_SYMBOL_RIGHT, LV_SYMBOL_OK, ""
};

const char * layout_Capital_letters[] =
{
    "数字", "Q", "W", "E", "R", "T", "Y", "U", "I", "O", "P", LV_SYMBOL_BACKSPACE, "\n",
    "大小写", "A", "S", "D", "F", "G", "H", "J", "K", "L", LV_SYMBOL_NEW_LINE, "\n",
    "中/英文", "Z", "X", "C", "V", "B", "N", "M", ".", ",", ":", "\n",
    LV_SYMBOL_KEYBOARD, LV_SYMBOL_LEFT, " ", LV_SYMBOL_RIGHT, LV_SYMBOL_OK, ""
};

const lv_btnmatrix_ctrl_t ctrl_Lowercase_letters[] =
{
    LV_KEYBOARD_CTRL_BTN_FLAGS | 5, LV_KB_BTN(4), LV_KB_BTN(4), LV_KB_BTN(4), LV_KB_BTN(4), LV_KB_BTN(4), LV_KB_BTN(4), LV_KB_BTN(4), LV_KB_BTN(4), LV_KB_BTN(4), LV_KB_BTN(4), LV_BTNMATRIX_CTRL_CHECKED | 7,
    LV_KEYBOARD_CTRL_BTN_FLAGS | 6, LV_KB_BTN(3), LV_KB_BTN(3), LV_KB_BTN(3), LV_KB_BTN(3), LV_KB_BTN(3), LV_KB_BTN(3), LV_KB_BTN(3), LV_KB_BTN(3), LV_KB_BTN(3), LV_BTNMATRIX_CTRL_CHECKED | 7,
    LV_KEYBOARD_CTRL_BTN_FLAGS | 2 | LV_BTNMATRIX_CTRL_CHECKABLE, LV_KB_BTN(1), LV_KB_BTN(1), LV_KB_BTN(1), LV_KB_BTN(1), LV_KB_BTN(1), LV_KB_BTN(1), LV_KB_BTN(1), LV_BTNMATRIX_CTRL_CHECKED | LV_KB_BTN(1), LV_BTNMATRIX_CTRL_CHECKED | LV_KB_BTN(1), LV_BTNMATRIX_CTRL_CHECKED | LV_KB_BTN(1),
    LV_KEYBOARD_CTRL_BTN_FLAGS | 2, LV_BTNMATRIX_CTRL_CHECKED | 2, 6, LV_BTNMATRIX_CTRL_CHECKED | 2, LV_KEYBOARD_CTRL_BTN_FLAGS | 2
};

const char * layout_number[] =
{
    "1", "2", "3", LV_SYMBOL_KEYBOARD, "\n",
    "4", "5", "6", LV_SYMBOL_OK, "\n",
    "7", "8", "9", LV_SYMBOL_BACKSPACE, "\n",
    "+/-", "0", ".", LV_SYMBOL_LEFT, LV_SYMBOL_RIGHT, ""
};

const lv_btnmatrix_ctrl_t ctrl_number[] =
{
    LV_KB_BTN(1), LV_KB_BTN(1), LV_KB_BTN(1), LV_KEYBOARD_CTRL_BTN_FLAGS | 2,
    LV_KB_BTN(1), LV_KB_BTN(1), LV_KB_BTN(1), LV_KEYBOARD_CTRL_BTN_FLAGS | 2,
    LV_KB_BTN(1), LV_KB_BTN(1), LV_KB_BTN(1), 2,
    LV_KEYBOARD_CTRL_BTN_FLAGS | 1, LV_KB_BTN(1), 1, 1, 1
};

const char * layout_select[] =
{
    " ","小写键盘","大写键盘","数字键盘","特殊符号"," ",""
};

const lv_btnmatrix_ctrl_t ctrl_select[] =
{
    LV_BTNMATRIX_CTRL_HIDDEN,LV_KEYBOARD_CTRL_BTN_FLAGS |1,LV_KEYBOARD_CTRL_BTN_FLAGS |1,LV_KEYBOARD_CTRL_BTN_FLAGS |1,LV_KEYBOARD_CTRL_BTN_FLAGS |1,LV_BTNMATRIX_CTRL_HIDDEN
};

const char * layout_special_symbols[] =
{
    "`", "~", "!", "@", "#", "$", "%", "^", "&", LV_SYMBOL_BACKSPACE, "\n",
    "+", "-", "*", "/", "|", "=", ":", "<", ">", "(", ")", "\n",
    "\\", "_", "\"", "'", ".", "?", ";", "{", "}", "[", "]", "\n",
    LV_SYMBOL_KEYBOARD, LV_SYMBOL_LEFT, " ", LV_SYMBOL_RIGHT, LV_SYMBOL_OK, ""
};

const lv_btnmatrix_ctrl_t ctrl_special_symbols[] =
{
    LV_KB_BTN(1), LV_KB_BTN(1), LV_KB_BTN(1), LV_KB_BTN(1), LV_KB_BTN(1), LV_KB_BTN(1), LV_KB_BTN(1), LV_KB_BTN(1), LV_KB_BTN(1), LV_BTNMATRIX_CTRL_CHECKED | 2,
    LV_KB_BTN(1), LV_KB_BTN(1), LV_KB_BTN(1), LV_KB_BTN(1), LV_KB_BTN(1), LV_KB_BTN(1), LV_KB_BTN(1), LV_KB_BTN(1), LV_KB_BTN(1), LV_KB_BTN(1), LV_KB_BTN(1),
    LV_KB_BTN(1), LV_KB_BTN(1), LV_KB_BTN(1), LV_KB_BTN(1), LV_KB_BTN(1), LV_KB_BTN(1), LV_KB_BTN(1), LV_KB_BTN(1), LV_KB_BTN(1), LV_KB_BTN(1), LV_KB_BTN(1),
    LV_KEYBOARD_CTRL_BTN_FLAGS | 2, LV_BTNMATRIX_CTRL_CHECKED | 2, 6, LV_BTNMATRIX_CTRL_CHECKED | 2, LV_KEYBOARD_CTRL_BTN_FLAGS | 2
};

void lv_virtualkeyboard_constructor(const lv_obj_class_t * class_p, lv_obj_t * obj)
{
    LV_UNUSED(class_p);
    LV_TRACE_OBJ_CREATE("begin");

    lv_obj_set_size(obj, LV_PCT(100), LV_PCT(55));
    lv_obj_align(obj,LV_ALIGN_BOTTOM_MID,0,0);

    lv_virtualKeyboard_t * virtualKeyboard = (lv_virtualKeyboard_t *)obj;
    virtualKeyboard->chineseCharacterPanel_container = lv_obj_create(obj);
    virtualKeyboard->chineseCharacterPanel = lv_btnmatrix_create(virtualKeyboard->chineseCharacterPanel_container);
    virtualKeyboard->editPanel = lv_btnmatrix_create(obj);
    virtualKeyboard->inputChineseCharacterLabel = lv_label_create(obj);
    virtualKeyboard->textArea = nullptr;
    virtualKeyboard->keyboardMode = KeyboardMode::Lowercase;
    virtualKeyboard->isChinese = false;
    virtualKeyboard->layouts.push_back(KeyboardLayout{layout_Lowercase_letters, ctrl_Lowercase_letters});
    virtualKeyboard->layouts.push_back(KeyboardLayout{layout_Capital_letters, ctrl_Lowercase_letters});
    virtualKeyboard->layouts.push_back(KeyboardLayout{layout_number, ctrl_number});
    virtualKeyboard->layouts.push_back(KeyboardLayout{layout_select, ctrl_select});
    virtualKeyboard->layouts.push_back(KeyboardLayout{layout_special_symbols, ctrl_special_symbols});

    lv_obj_set_style_text_font(virtualKeyboard->editPanel, &lv_font_siyuanheiti16, 0);
    lv_obj_set_style_text_font(virtualKeyboard->chineseCharacterPanel, &lv_font_siyuanheiti16, 0);

    lv_obj_set_size(virtualKeyboard->editPanel, LV_PCT(100), LV_PCT(75));
    lv_obj_set_size(virtualKeyboard->chineseCharacterPanel_container, LV_PCT(100), LV_PCT(15));
    lv_obj_set_height(virtualKeyboard->chineseCharacterPanel, LV_PCT(98));

    lv_obj_align_to(virtualKeyboard->editPanel, obj, LV_ALIGN_BOTTOM_MID, 0, 0);
    lv_obj_align_to(virtualKeyboard->chineseCharacterPanel_container, virtualKeyboard->editPanel, LV_ALIGN_OUT_TOP_MID, 0, 0);

    lv_obj_set_height(virtualKeyboard->inputChineseCharacterLabel,LV_PCT(10));
    lv_obj_align_to(virtualKeyboard->inputChineseCharacterLabel, virtualKeyboard->chineseCharacterPanel_container, LV_ALIGN_OUT_TOP_LEFT, 0, 0);
    lv_label_set_text(virtualKeyboard->inputChineseCharacterLabel,"");

    auto layout = virtualKeyboard->layouts[0];
    lv_btnmatrix_set_map(virtualKeyboard->editPanel,layout.layout);
    lv_btnmatrix_set_ctrl_map(virtualKeyboard->editPanel,layout.controls);

    lv_obj_add_flag(virtualKeyboard->editPanel, LV_OBJ_FLAG_EVENT_BUBBLE);
    lv_obj_add_flag(virtualKeyboard->chineseCharacterPanel,LV_OBJ_FLAG_EVENT_BUBBLE);
    lv_obj_add_flag(virtualKeyboard->chineseCharacterPanel_container,LV_OBJ_FLAG_EVENT_BUBBLE);

    lv_group_remove_obj(virtualKeyboard->editPanel);//有这行才聚焦
    lv_group_remove_obj(virtualKeyboard->chineseCharacterPanel);//有这行才聚焦

    lv_obj_add_event_cb(obj, lv_virtualKeyboard_def_event_cb, LV_EVENT_VALUE_CHANGED, NULL);    
    lv_obj_set_style_base_dir(obj, LV_BASE_DIR_LTR, 0);

    lv_style_init(&virtualKeyboard->chineseCharacterPanel_style_main);
    lv_style_set_pad_all(&virtualKeyboard->chineseCharacterPanel_style_main,1);
    lv_style_set_border_width(&virtualKeyboard->chineseCharacterPanel_style_main,0);
    lv_style_set_bg_opa(&virtualKeyboard->chineseCharacterPanel_style_main,LV_OPA_TRANSP);
    lv_obj_add_style(virtualKeyboard->chineseCharacterPanel,&virtualKeyboard->chineseCharacterPanel_style_main,LV_PART_MAIN);

    lv_style_init(&virtualKeyboard->chineseCharacterPanel_style_item);
    lv_style_set_pad_all(&virtualKeyboard->chineseCharacterPanel_style_item,1);
    lv_obj_add_style(virtualKeyboard->chineseCharacterPanel,&virtualKeyboard->chineseCharacterPanel_style_item,LV_PART_ITEMS);

    lv_style_init(&virtualKeyboard->chineseCharacterPanel_container_style);
    lv_style_set_pad_all(&virtualKeyboard->chineseCharacterPanel_container_style,0);
    lv_obj_add_style(virtualKeyboard->chineseCharacterPanel_container,&virtualKeyboard->chineseCharacterPanel_container_style,LV_PART_MAIN);
    lv_obj_set_scroll_dir(virtualKeyboard->chineseCharacterPanel_container,LV_DIR_LEFT | LV_DIR_RIGHT);//可以左右滚动
    lv_obj_set_scrollbar_mode(virtualKeyboard->chineseCharacterPanel_container,LV_SCROLLBAR_MODE_OFF);

    for (int i = 0; i < chineseWord_maxSize; ++i)
    {
        virtualKeyboard->inputChineWordArray[i] = "";
    }
    virtualKeyboard->inputChineWordArray[chineseWord_maxSize] = "";
    lv_btnmatrix_set_map(virtualKeyboard->chineseCharacterPanel, virtualKeyboard->inputChineWordArray);
}

void lv_virtualkeyboard_destructor(const lv_obj_class_t * class_p, lv_obj_t * obj)
{
}

void lv_virtualKeyboard_set_textarea(lv_obj_t *obj, lv_obj_t *textArea)
{
    if(textArea)
    {
        LV_ASSERT_OBJ(textArea, &lv_textarea_class);
    }

    LV_ASSERT_OBJ(obj, MY_CLASS);
    lv_virtualKeyboard_t * keyboard = (lv_virtualKeyboard_t *)obj;

    lv_obj_set_style_text_font(textArea, &lv_font_siyuanheiti16, 0);

    if(keyboard->textArea)
    {
        lv_obj_clear_state(obj, LV_STATE_FOCUSED);
    }

    keyboard->textArea = textArea;

    if(keyboard->textArea)
    {
        lv_obj_add_flag(obj, LV_STATE_FOCUSED);
    }
}

bool isSingleAlpha(const char* str)
{
    if (strlen(str) != 1)
    {
        return false;
    }

    return (isalpha(*str) && isalpha(tolower(*str)));// 输入字符是字母且小写转换后也是字母,符合条件
}

void lv_virtualKeyboard_def_event_cb(lv_event_t *e)
{
    lv_obj_t * obj = lv_event_get_current_target(e);//整个控件

    LV_ASSERT_OBJ(obj, MY_CLASS);

    lv_virtualKeyboard_t * keyboard = (lv_virtualKeyboard_t *)obj;
    lv_obj_t * btnmatrix = lv_event_get_target(e);// 上/下部分的按钮矩阵

    if(btnmatrix == keyboard->editPanel)
    {
        uint16_t btn_id = lv_btnmatrix_get_selected_btn(btnmatrix);
        if(btn_id == LV_BTNMATRIX_BTN_NONE)
            return;

        const char * txt = lv_btnmatrix_get_btn_text(btnmatrix, lv_btnmatrix_get_selected_btn(btnmatrix));
        if(!txt)
            return;

        if(strcmp(txt, LV_SYMBOL_CLOSE) == 0)
        {
            lv_res_t res = lv_event_send(btnmatrix, LV_EVENT_CANCEL, NULL);
            if(res != LV_RES_OK)
                return;

            if(keyboard->textArea)
            {
                res = lv_event_send(keyboard->textArea, LV_EVENT_CANCEL, NULL);
                if(res != LV_RES_OK)
                    return;
            }
            return;
        }
        else if(strcmp(txt, LV_SYMBOL_OK) == 0)
        {
            // lv_res_t res = lv_event_send(btnmatrix, LV_EVENT_READY, NULL);
            // if(res != LV_RES_OK)
            //     return;

            // if(keyboard->textArea)
            // {
            //     res = lv_event_send(keyboard->textArea, LV_EVENT_READY, NULL);
            //     if(res != LV_RES_OK)
            //         return;
            // }
            // return;
        }
        else if(strcmp(txt, LV_SYMBOL_KEYBOARD) == 0)
        {
            lv_virtualKeyboard_set_keyboardMode(obj,KeyboardMode::Select);
            return;
        }
        else if(strcmp(txt, "大小写") == 0)
        {
            if(keyboard->keyboardMode == KeyboardMode::Lowercase)
            {
                lv_virtualKeyboard_set_keyboardMode(obj,KeyboardMode::Capital);
            }
            else if(keyboard->keyboardMode == KeyboardMode::Capital)
            {
                lv_virtualKeyboard_set_keyboardMode(obj,KeyboardMode::Lowercase);
            }
            return;
        }
        else if(strcmp(txt, "数字") == 0)
        {
            lv_virtualKeyboard_set_keyboardMode(obj,KeyboardMode::Number);
            return;
        }
        else if(strcmp(txt, "小写键盘") == 0)
        {
            lv_virtualKeyboard_set_keyboardMode(obj,KeyboardMode::Lowercase);
            return;
        }
        else if(strcmp(txt, "大写键盘") == 0)
        {
            lv_virtualKeyboard_set_keyboardMode(obj,KeyboardMode::Capital);
            return;
        }
        else if(strcmp(txt, "数字键盘") == 0)
        {
            lv_virtualKeyboard_set_keyboardMode(obj,KeyboardMode::Number);
            return;
        }
        else if(strcmp(txt, "特殊符号") == 0)
        {
            lv_virtualKeyboard_set_keyboardMode(obj,KeyboardMode::Special_symbols);
            return;
        }
        else if(strcmp(txt, "中/英文") == 0)
        {
            keyboard->isChinese = !keyboard->isChinese;
            if(!keyboard->inputChineWord.empty())
            {
                closeChineseCharacterPanel(keyboard);
            }
            return;
        }

        if(!keyboard->textArea)
            return;

        if(strcmp(txt, LV_SYMBOL_NEW_LINE) == 0)
        {
            lv_textarea_add_char(keyboard->textArea, '\n');
            if(lv_textarea_get_one_line(keyboard->textArea))
            {
                lv_res_t res = lv_event_send(keyboard->textArea, LV_EVENT_READY, NULL);
                if(res != LV_RES_OK)
                    return;
            }
        }
        else if(strcmp(txt, LV_SYMBOL_LEFT) == 0)
        {
            lv_textarea_cursor_left(keyboard->textArea);
        }
        else if(strcmp(txt, LV_SYMBOL_RIGHT) == 0)
        {
            lv_textarea_cursor_right(keyboard->textArea);
        }
        else if(strcmp(txt, LV_SYMBOL_BACKSPACE) == 0)
        {
            if(keyboard->isChinese)
            {
                if (keyboard->inputChineWord.empty())
                {
                    lv_textarea_del_char(keyboard->textArea);
                }
                else
                {
                    keyboard->inputChineWord.erase(keyboard->inputChineWord.length() - 1);  // 去掉末尾的一个字符
                    updateMatchChinaWordList(keyboard);
                }
            }
            else
            {
                lv_textarea_del_char(keyboard->textArea);
            }
        }
        else if(strcmp(txt, "+/-") == 0)
        {
            uint16_t cur = lv_textarea_get_cursor_pos(keyboard->textArea);
            const char * ta_txt = lv_textarea_get_text(keyboard->textArea);
            if(ta_txt[0] == '-')
            {
                lv_textarea_set_cursor_pos(keyboard->textArea, 1);
                lv_textarea_del_char(keyboard->textArea);
                lv_textarea_add_char(keyboard->textArea, '+');
                lv_textarea_set_cursor_pos(keyboard->textArea, cur);
            }
            else if(ta_txt[0] == '+')
            {
                lv_textarea_set_cursor_pos(keyboard->textArea, 1);
                lv_textarea_del_char(keyboard->textArea);
                lv_textarea_add_char(keyboard->textArea, '-');
                lv_textarea_set_cursor_pos(keyboard->textArea, cur);
            }
            else
            {
                lv_textarea_set_cursor_pos(keyboard->textArea, 0);
                lv_textarea_add_char(keyboard->textArea, '-');
                lv_textarea_set_cursor_pos(keyboard->textArea, cur + 1);
            }
        }
        else if(isSingleAlpha(txt))
        {
            if(keyboard->isChinese)
            {
                keyboard->inputChineWord += tolower(*txt);
                updateMatchChinaWordList(keyboard);
            }
            else
            {
                lv_textarea_add_text(keyboard->textArea, txt);
            }
        }
        else
        {
            lv_textarea_add_text(keyboard->textArea, txt);
        }
    }
    else if(btnmatrix == keyboard->chineseCharacterPanel)
    {
        uint16_t btn_id = lv_btnmatrix_get_selected_btn(btnmatrix);
        if(btn_id == LV_BTNMATRIX_BTN_NONE)
            return;

        const char * txt = lv_btnmatrix_get_btn_text(btnmatrix, lv_btnmatrix_get_selected_btn(btnmatrix));
        if(!txt)
            return;

        lv_textarea_add_text(keyboard->textArea, txt);
        closeChineseCharacterPanel(keyboard);
    }
}

void lv_virtualKeyboard_set_keyboardMode(lv_obj_t * obj,KeyboardMode mode)
{
    LV_ASSERT_OBJ(obj, MY_CLASS);

    lv_virtualKeyboard_t * keyboard = (lv_virtualKeyboard_t *)obj;
    auto layout = keyboard->layouts[mode];
    lv_btnmatrix_set_map(keyboard->editPanel,layout.layout);
    lv_btnmatrix_set_ctrl_map(keyboard->editPanel,layout.controls);
    keyboard->keyboardMode = mode;

    if(!keyboard->inputChineWord.empty())
    {
        closeChineseCharacterPanel(keyboard);
    }
}

void updateMatchChinaWordList(lv_virtualKeyboard_t * keyboard)
{
    std::vector<std::string> vec;
    if(!keyboard->inputChineWord.empty())
    {
        vec = utf8Chinese::getInstance()->getHanziList(keyboard->inputChineWord);
    }

    lv_coord_t wordAllLength{0};
    for(size_t i = 0;i < vec.size();++i)
    {
        const auto & str = vec[i];
        keyboard->inputChineWordArray[i] = str.c_str();
        wordAllLength += (20 * str.size());
    }

    for(size_t i = vec.size();i < chineseWord_maxSize;++i)
    {
        keyboard->inputChineWordArray[i] = "";
    }

    lv_btnmatrix_set_map(keyboard->chineseCharacterPanel, keyboard->inputChineWordArray);

    lv_obj_set_width(keyboard->chineseCharacterPanel,/*std::max(*/wordAllLength/*,LV_HOR_RES)*/);

    for (int i = 0; i < chineseWord_maxSize; ++i)
    {
        lv_btnmatrix_set_btn_ctrl(keyboard->chineseCharacterPanel,i,LV_BTNMATRIX_CTRL_CLICK_TRIG | LV_BTNMATRIX_CTRL_NO_REPEAT);
    }
    lv_label_set_text(keyboard->inputChineseCharacterLabel,keyboard->inputChineWord.c_str());
}

void closeChineseCharacterPanel(lv_virtualKeyboard_t * keyboard)
{
    for (int i = 0; i < chineseWord_maxSize; ++i)
    {
        keyboard->inputChineWordArray[i] = "";
    }
    lv_btnmatrix_set_map(keyboard->chineseCharacterPanel, keyboard->inputChineWordArray);
    keyboard->inputChineWord.clear();
    lv_label_set_text(keyboard->inputChineseCharacterLabel,"");
    lv_obj_scroll_to_x(keyboard->chineseCharacterPanel_container,0,LV_ANIM_OFF);
}
#ifndef UTF8CHINESE_H
#define UTF8CHINESE_H

#include <map>
#include <vector>

class utf8Chinese
{
public:
    static utf8Chinese *getInstance();
    std::vector<std::string> getHanziList(const std::string& pinyin);

private:
    utf8Chinese();
    std::multimap<std::string,std::string> pinyin_map;
};

#endif // UTF8CHINESE_H

使用:

        lv_obj_t *ta = lv_textarea_create(lv_scr_act());
        lv_obj_t * keyBoard = lv_virtualkeyboard_create(lv_scr_act());
        lv_virtualKeyboard_set_textarea(keyBoard,ta);

效果:

有个管理汉字的类太大贴不上来,完整代码免费下载

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值