LVGL系列3--纯物理(外部)按键,数字键盘控制控件

LVGL系列

一、LVGL移植

LVGL系列1–AT32移植LVGL_V8具体步骤
LVGL系列2–linux + lvglv8 + vscode 移植
LVGL系列3–纯物理(外部)按键,数字键盘控制控件


一、背景

LVGL以其轻量级和高度可配置性著称,尤其在触摸屏应用中表现出色。然而,在多样化的嵌入式系统场景中,如需要处理物理按键(如关机键、方向键、数字键盘等)的设备,LVGL的标准交互模型可能需要一定的扩展或调整来适应这些非触摸屏输入方式。

方式一:自定义事件发送与处理函数

static void Event(void* param, int event)
{
    if(event == ButtonEvent::EVENT_ButtonLongPressed)
    {
        if(param == &btOK)
        {
            page.PagePop();
        }
    }
}
void PageManager::PageEventTransmit(void* obj, int event)
{
    /*将事件传递到当前页面*/
    if(PageList[NowPage].EventCallback != NULL)
        PageList[NowPage].EventCallback(obj, event);
}

方式二:利用lv_event_send发送按键数据

映射按键到LVGL控件:根据硬件按键布局,在LVGL中创建相应的控件或逻辑来代表这些按键。
发送事件:在按键ISR或扫描函数中,通过lv_event_send函数向对应的LVGL控件发送按键事件,可以自定义事件类型或利用LVGL内置的事件类型(如点击、长按等)。
处理事件:在LVGL控件的事件处理函数中,根据接收到的事件类型执行相应的操作,如播放关机动画、改变控件状态等。

<think>嗯,用户想了解LVGL 8.3中的键盘映射。首先,我需要回忆一下LVGL的相关知识,特别是版本8.3的键盘组件。键盘映射应该指的是如何将按键事件与实际的输入值关联起来,比如用户点击物理键盘或触摸屏键盘时,如何生成对应的字符或动作。 首先,LVGL的键盘部件(lv_keyboard)通常需要和文本输入区域(如lv_textarea)配合使用。键盘上的每个按钮都有一个关联的映射表,决定按下时发送什么字符或执行什么操作。可能需要解释默认的键盘布局以及如何自定义映射。 接着,用户可能需要知道如何修改键盘的布局,比如切换数字键盘、特殊符号等。在LVGL中,这通常通过设置不同的映射模式来实现,比如设置lv_keyboard_set_mode(kb, LV_KEYBOARD_MODE_NUM)来切换到数字模式。 另外,自定义键盘映射可能涉及到修改按键的映射数组。例如,默认的英文键盘布局可能是一个二维数组,每个子数组代表一行按键。用户如果想自定义按键,可能需要替换这些数组,并处理模式切换时的回调函数。 需要注意的是,LVGL 8.3的API可能与后续版本有所不同,所以需要确认具体的函数名和用法是否正确。例如,lv_keyboard_set_map函数可能用于设置特定模式下的按键映射,而lv_keyboard_set_ctrl_map用于控制键(如切换大小写)的映射。 可能还需要提到事件处理,当用户按下某个键时,如何通过事件回调更新文本区域的内容。例如,使用LV_EVENT_VALUE_CHANGED事件来获取被按下的按钮索引,并根据映射表获取对应的字符。 最后,应该给出一个简单的示例代码,展示如何创建键盘、设置映射,并与文本区域关联。同时提醒用户测试时注意内存分配和组件的父子关系,确保键盘正确显示和交互。 总结步骤: 1. 创建键盘和文本区域组件。 2. 设置键盘的映射模式(如默认、数字)。 3. 自定义映射数组(如果需要)。 4. 绑定事件处理,更新文本内容。 5. 注意事项和常见问题。 需要确保回答结构清晰,分点说明,并给出代码示例帮助用户理解。同时,使用中文口语化表达,避免技术术语过多导致理解困难。</think>关于 LVGL 8.3 的键盘映射,以下是分步说明: ### 1. 基本概念 LVGL 的 `lv_keyboard` 组件用于生成虚拟键盘,通过**映射表**定义按键布局。映射需处理: - 字符显示 - 模式切换(如大小写/数字) - 特殊功能(退格/回车) ### 2. 默认映射结构 LVGL 预置了两种映射模式: ```c // 文本模式示例 static const char * default_kb_map_lc[] = { "q", "w", "e", "r", "t", "y", "u", "i", "o", "p", "\n", "a", "s", "d", "f", "g", "h", "j", "k", "l", "\n", "Shift", "z", "x", "c", "v", "b", "n", "m", "Backspace", "\n", "1#", " ", "Enter", "" }; ``` ### 3. 自定义映射步骤 #### (1) 创建映射数组 ```c static const char * my_kb_map[] = { "1", "2", "3", "\n", "4", "5", "6", "\n", "7", "8", "9", "\n", ".", "0", "Del", "" }; ``` #### (2) 创建控制映射 ```c static const lv_keyboard_ctrl_t my_ctrl_map[] = { LV_KEYBOARD_CTRL_BTN_FLAGS | 5, // 第5个按钮带特殊样式 0, LV_KEYBOARD_CTRL_BTN_FLAGS | 2 // 删除键特殊样式 }; ``` #### (3) 应用自定义映射 ```c lv_keyboard_set_map(kb, LV_KEYBOARD_MODE_NUM, my_kb_map); lv_keyboard_set_ctrl_map(kb, LV_KEYBOARD_MODE_NUM, my_ctrl_map); ``` ### 4. 模式切换实现 ```c // 创建模式切换按钮 lv_obj_t * btn = lv_btn_create(lv_scr_act()); lv_obj_add_event_cb(btn, switch_mode_event, LV_EVENT_CLICKED, kb); // 回调函数示例 void switch_mode_event(lv_event_t * e) { lv_keyboard_t * kb = (lv_keyboard_t *)lv_event_get_user_data(e); lv_keyboard_set_mode(kb, LV_KEYBOARD_MODE_NUM); // 切换数字模式 } ``` ### 5. 事件处理关键代码 ```c lv_obj_add_event_cb(kb, keyboard_event_handler, LV_EVENT_VALUE_CHANGED, ta); void keyboard_event_handler(lv_event_t * e) { lv_obj_t * ta = lv_event_get_user_data(e); uint16_t btn_id = lv_keyboard_get_selected_btn(lv_event_get_target(e)); const char * txt = lv_keyboard_get_btn_text(lv_event_get_target(e), btn_id); if(strcmp(txt, "Backspace") == 0) { lv_textarea_del_char(ta); } else { lv_textarea_add_text(ta, txt); } } ``` ### 6. 常见问题处理 - **布局错位**:确保每行字符数以 `"\n"` 正确分隔 - **输入延迟**:使用 `lv_indev_wait_release(lv_indev_get_act())` 处理物理按键冲突 - **内存优化**:对嵌入式设备建议使用 `LV_FONT_DEFAULT` 精简字体 ### 完整示例 ```c lv_obj_t * ta = lv_textarea_create(lv_scr_act()); lv_obj_align(ta, LV_ALIGN_TOP_LEFT, 10, 10); lv_obj_t * kb = lv_keyboard_create(lv_scr_act()); lv_keyboard_set_textarea(kb, ta); // 设置自定义数字键盘 lv_keyboard_set_map(kb, LV_KEYBOARD_MODE_NUM, my_kb_map); lv_keyboard_set_ctrl_map(kb, LV_KEYBOARD_MODE_NUM, my_ctrl_map); ``` 建议在实际开发中使用 `LVGL 官方模拟器` 进行可视化调试,可通过 `lv_sim_...` 系列函数快速验证键盘布局。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值