LVGL采用的是一种面对对象编程思维,在 C语言中,并没有“类”的概念,而LVGL通过结构体的形式实现了“类”的功能(并 非真的“类”),具体的实现逻辑如下图所示:
lv_obj_t 定义控件(界面、按钮、文本)变量 必须是指针类型
LVGL 的所有样式设置、坐标对齐、事件绑定函数,参数类型统一都是lv_obj_t *;同时lv_obj_t 结构体的大小并不是完全固定死的,它会根据你在 lv_conf.h 里的配置(比如是否开启扩展属性、是否开启用户数据 LV_USE_USER_DATA、开启了哪些模块)而在编译期改变结构体的大小,因此在 LVGL 中定义控件变量时,必须(且只能)是指针类型(lv_obj_t *)
lv_obj_create() 创建容器、界面,常用它创建界面、自定义控件的基础
创建新界面首先要获取屏幕正在显示的活动屏幕对象,lv_scr_act() 是 lv_screen_active()(或 lv_scr_act 宏)的缩写,它是整个 UI 树的根节点(Root Node)。
在 LVGL 中,所有控件都遵循父子树形结构(Parent-Child Tree)。创建任何控件或容器(比如 lv_obj_create)时,必须指定一个“父对象”(parent):
lv_obj_t *scr = lv_scr_act();
lv_obj_t *page = lv_obj_create(scr);
lv_obj_create这些创建函数返回一个lv_obj_t类型的指针,指向你创建的控件lv_obj_t结构体
lv_obj_t结构体:
typedef struct _lv_obj_t {
const lv_obj_class_t * class_p;
struct _lv_obj_t * parent;
_lv_obj_spec_attr_t * spec_attr;
_lv_obj_style_t * styles;
#if LV_USE_USER_DATA
void * user_data;
#endif
lv_area_t coords;
lv_obj_flag_t flags;
lv_state_t state;
uint16_t layout_inv : 1;
uint16_t scr_layout_inv : 1;
uint16_t skip_trans : 1;
uint16_t style_cnt : 6;
uint16_t h_layout : 1;
uint16_t w_layout : 1;
} lv_obj_t;
里面包含控件类型,父对象,样式列表
先获取当前正在显示的屏幕对象,作为父节点 page为子对象,作为创建的界面,然后定义大小、样式;同样,界面里面的按钮文本这些控件也是page的子对象
lv_btn_create() 创建按钮
lv_label_create() 创建文本
lv_obj_set_size(btn_back, 70, 46); //控件大小
lv_obj_align(btn_back, LV_ALIGN_BOTTOM_RIGHT, -82, -44); //控件对齐方式,也就是控件位置 param(控件对象,相对于父容器对齐方式,x轴,y轴左负右正)
lv_obj_add_event_cb( //按钮绑定事件回调函数,也就是点击按钮会触发什么事件、触摸动作
btn_back,
page_navigate_cb, //事件回调函数
LV_EVENT_CLICKED, //触摸事件
(void *)(intptr_t)PAGE_HOME); //传给回调函数的变量,用户自定义数据
lv_timer_create()LVGL的软定时器,
lv_timer_t * lv_timer_create(lv_timer_cb_t timer_xcb, uint32_t period, void * user_data); 可以周期行的执行回调函数
eg :lv_timer_create(machine_running_ui_timer_cb, 100, NULL); 100ms 执行一次machine_running_ui_timer_cb函数
字体:eg:
lv_obj_t *lbl_prefix = lv_label_create(loop_cont); //文本标签
lv_label_set_text(lbl_prefix, "剩余圈数"); //显示文本内容
lv_obj_set_style_text_color(lbl_prefix, lv_color_hex(0x354554), 0); //字体颜色 第三个参数selector 选择器,常用0 也可以根据按钮状态动态的显示颜色
lv_obj_set_style_text_font(lbl_prefix, &lv_my_Font_20, 0); //使用的是哪一个字体
LVGL没有中文字库,显示的汉字需要到LVGL官方转换器里面把汉字转换成C语言文件,得到这个C语言文件之后添加到LVGL源码font目录下,并添加到项目工程,
然后在头文件或者.c文件顶部添加中文字体宏定义 LV_FONT_DECLARE(lv_my_Font_20);