LVGL实现页面切换
一、定义全局容器变量
static lv_obj_t *contanier1= NULL;
static lv_obj_t *contanier2= NULL;
二、在LVGL初始化代码后初始化容器
contanier1= lv_obj_create(lv_scr_act());
lv_obj_set_size(contanier1,320,240);//设置容器大小
lv_obj_set_style_radius(contanier1,0,0);//设置容器圆角为直角
contanier2= lv_obj_create(lv_scr_act());
lv_obj_set_size(contanier2,320,240);
lv_obj_set_style_radius(contanier2,0,0);
三、将要显示的控件创建到对应的容器中
类似于这样,此处为了方便演示写了两个按钮用于切换界面,使用按键回调函数来实现切换
lv_obj_t * SETTINGS = lv_btn_create(contanier1);
lv_obj_add_event_cb(SETTINGS, SETTINGS_event_handler, LV_EVENT_CLICKED, NULL);
lv_obj_set_pos(SETTINGS,125,125);
lv_obj_set_size(SETTINGS, 80, 80);
lv_obj_t * SETTINGS_TXT = lv_label_create(SETTINGS);
lv_label_set_text_fmt(SETTINGS_TXT, "SETTINGS");
lv_obj_center(SETTINGS_TXT);
lv_obj_t * MUSIC = lv_btn_create(contanier2);
lv_obj_add_event_cb(MUSIC, MUSIC_event_handler, LV_EVENT_CLICKED, NULL);
lv_obj_set_pos(MUSIC,125,20);
lv_obj_set_size(MUSIC, 80, 80);
lv_obj_t * MUSIC_TXT = lv_label_create(MUSIC);
lv_label_set_text_fmt(MUSIC_TXT, "MUSIC");
lv_obj_center(MUSIC_TXT);
四、在对应的回调函数中隐藏其他容器
static void MUSIC_event_handler(lv_event_t * e)//菜单界面触发音乐
{
lv_event_code_t code = lv_event_get_code(e);
if(code == LV_EVENT_CLICKED)
{
lv_obj_add_flag(contanier1, LV_OBJ_FLAG_HIDDEN);
lv_obj_clear_flag(contanier2, LV_OBJ_FLAG_HIDDEN);
}
}
static void SETTINGS_event_handler(lv_event_t * e)//菜单界面触发设置
{
lv_event_code_t code = lv_event_get_code(e);
if(code == LV_EVENT_CLICKED)
{
lv_obj_add_flag(contanier2, LV_OBJ_FLAG_HIDDEN);
lv_obj_clear_flag(contanier1, LV_OBJ_FLAG_HIDDEN);
}
}
五、其它
如果创建的页面很多得话而只需要显示一个容器建议写一个display函数
void display_containers (lv_obj_t * obj)
{
//将所有容器以如下形式放在此处
lv_obj_add_flag(container1, LV_OBJ_FLAG_HIDDEN);
lv_obj_add_flag(container2, LV_OBJ_FLAG_HIDDEN);
lv_obj_add_flag(container3, LV_OBJ_FLAG_HIDDEN);
lv_obj_add_flag(container4, LV_OBJ_FLAG_HIDDEN);
lv_obj_clear_flag(obj,LV_OBJ_FLAG_HIDDEN);
}
之后要切换容器只需将在回调函数中调用display_containers函数即可
您这个方法是将页面全部创建然后依次显示,带来的问题就是这么做会导致单片机预留的内存容易溢出。
2023-09-05 · IP 属地安徽