目录
官方文档:
中文版翻译:
🎨百问网LVGL中文教程手册文档 — 百问网LVGL中文教程手册文档 1.0 文档 (100ask.net)
ESP32, 240x320电容触摸LCD屏,驱动IC为ILI9341.
ESP32 Aruduino移植好了LVGL, 使用TFT_eSPI库作为LCD驱动库.
(其实在此之前我还做了一系列的准备活动,但是篇幅有限不一一展开,有兴趣的可以自行摸索)
按键的一般行为有如下几种:
1. pressed;
2. released;
3. long pressed.
官方example的实例

实现代码
- static void event_handler(lv_event_t * e)
- {
- lv_event_code_t code = lv_event_get_code(e);
-
- if(code == LV_EVENT_CLICKED) {
- LV_LOG_USER("Clicked");
- }
- else if(code == LV_EVENT_VALUE_CHANGED) {
- LV_LOG_USER("Toggled");
- }
- }
-
- void lv_example_btn_1(void)
- {
- lv_obj_t * label;
-
- lv_obj_t * btn1 = lv_btn_create(lv_scr_act());
- lv_obj_add_event_cb(btn1, event_handler, LV_EVENT_ALL, NULL);
- lv_obj_align(btn1, LV_ALIGN_CENTER, 0, -40);
-
- label = lv_label_create(btn1);
- lv_label_set_text(label, "Button");
- lv_obj_center(label);
-
- lv_obj_t * btn2 = lv_btn_create(lv_scr_act());
- lv_obj_add_event_cb(btn2, event_handler, LV_EVENT_ALL, NULL);
- lv_obj_align(btn2, LV_ALIGN_CENTER, 0, 40);
- lv_obj_add_flag(btn2, LV_OBJ_FLAG_CHECKABLE);
- lv_obj_set_height(btn2, LV_SIZE_CONTENT);
-
- label = lv_label_create(btn2);
- lv_label_set_text(label, "Toggle");
- lv_obj_center(label);
- }
函数原型:

关于该函数的parent参数,需要先通过下面的说明了解基础概念:
对象(Objects) — 百问网LVGL中文教程手册文档 1.0 文档 (100ask.net)
其中描述到LVGL的Object的工作机制:
1. 亲子结构:
2. 追随原则:
3. 子对象仅在父对象的范围内可见
在这里调用的时候使用的lv_scr_act函数,函数原型如下:

需要先阅读下面两篇文章有基础概念:
显示接口 — 百问网LVGL中文教程手册文档 1.0 文档 (100ask.net)
显示(Displays) — 百问网LVGL中文教程手册文档 1.0 文档 (100ask.net)
这里面涉及到了Multiple display,而一般来说只用默认的一个显示使用lv_src_act获取当前活跃显示的屏幕即可.
这部分非常关键,可以分为两个部分,第一个部分:如果不是触摸屏,只有硬件的按键应该怎么将Button控件和硬件的按键关联起来;第二个部分:触摸屏如何点击按键触发.
下面这篇博文基本把以上两个问题都覆盖到了,这里就不展开:
ESP32 LVGL8.1 ——Input devices 输入设备 (Input devices 18)_请叫我啸鹏的博客-CSDN博客_lvgl输入设备
在 LVGL 中输入设备,有下面几种类型:
指针式输入设备,如触摸板或鼠标
键盘,如普通键盘或简单的数字键盘
带有左/右转向和推入选项的编码器
外部硬件按钮,分配给屏幕上的特定点
详细的介绍查看如下两篇文章:
输入设备接口 — 百问网LVGL中文教程手册文档 1.0 文档 (100ask.net)
输入设备(Input devices) — 百问网LVGL中文教程手册文档 1.0 文档 (100ask.net)
初始化输入设备:
其中touch pad的type为LV_INDEV_TYPE_POINTER; 注册touch pad的回调函数,
- static lv_indev_drv_t indev_drv;
- lv_indev_drv_init( &indev_drv );
- indev_drv.type = LV_INDEV_TYPE_POINTER;
- indev_drv.read_cb = my_touchpad_read;
- lv_indev_drv_register( &indev_drv );
my_touchpad_read的实现:
注册回调的时候,如果是touch pad类型的输入, 需要将触摸的x, y坐标通过data参数传给LVGL,我这里使用的是TFT_eSPI库的接口getTouch,可以直接获取点击的坐标:
- void my_touchpad_read( lv_indev_drv_t * indev_driver, lv_indev_data_t * data )
- {
- uint16_t touchX, touchY;
-
- bool touched = tft.getTouch( &touchX, &touchY );
-
- if( !touched )
- {
- data->state = LV_INDEV_STATE_REL;
- }
- else
- {
- data->state = LV_INDEV_STATE_PR;
-
- /*Set the coordinates*/
- data->point.x = touchX;
- data->point.y = touchY;
- }
- }