#if 1
// 声明为全局变量
static lv_obj_t * scr1;
static lv_obj_t * scr2;
LV_FONT_DECLARE(FontAwesome_40); // 外部声明生成的特殊字体
LV_FONT_DECLARE(myfont); // 基本常用汉字,大小36号
LV_FONT_DECLARE(SourceHanSansCN_Medium_36);
// 创建主屏幕
void createhome(void) {
scr1 = lv_obj_create(NULL);
if (scr1 == NULL)
LV_LOG_USER("错误,无法创建scr1\n");
else
LV_LOG_USER("创建scr1成功\n");
}
// 创建大棚按钮屏幕
void createdapengbtn(void) {
scr2 = lv_obj_create(NULL);
if (scr2 == NULL)
LV_LOG_USER("错误,无法创建scr2\n");
else
LV_LOG_USER("创建scr2成功\n");
}
// 删除屏幕 scr1
void delete_scr1(void) {
if (scr1 != NULL) {
lv_obj_del(scr1);
scr1 = NULL;
LV_LOG_USER("scr1 已删除\n");
}
}
// 删除屏幕 scr2
void delete_scr2(void) {
if (scr2 != NULL) {
lv_obj_del(scr2);
scr2 = NULL;
LV_LOG_USER("scr2 已删除\n");
}
}
// 按钮事件处理程序 3
static void btn_event_handler3(lv_event_t * e) {
// 获取触发事件的目标对象
lv_obj_t * btn = lv_event_get_target(e);
// 获取触发事件的代码
lv_event_code_t code = lv_event_get_code(e);
if (code == LV_EVENT_CLICKED) {
delete_scr2();
createhome();
create_scr1();//确保调用create_scr1
LV_LOG_USER("点击按钮 3,切换到 scr1\n");
}
}
// 创建屏幕 2 的函数
void create_scr2(void) {
if (scr2 == NULL)
createdapengbtn();
lv_scr_load(scr2);
LV_LOG_USER("scr2 加载\n");
// 设置返回按钮
lv_obj_t * btn2 = lv_btn_create(scr2);
lv_obj_t * label2 = lv_label_create(btn2);
lv_obj_set_size(btn2, 150, 100); // 设置按钮大小
lv_obj_align(btn2, LV_ALIGN_BOTTOM_LEFT, 350, 30);
lv_obj_set_style_text_font(label2, &FontAwesome_40, 0);
lv_label_set_text(label2, "\xEF\x80\x95");
lv_obj_set_style_text_color(label2, lv_color_hex(0xffffff), 0);
lv_obj_align(label2, LV_ALIGN_CENTER, 0, 0);
lv_obj_add_event_cb(btn2, btn_event_handler3, LV_EVENT_CLICKED, NULL); // 添加事件
}
// 按钮事件处理程序
static void btn_event_handler(lv_event_t * e) {
// 获取触发事件的目标对象
lv_obj_t * btn = lv_event_get_target(e);
// 获取触发事件的代码
lv_event_code_t code = lv_event_get_code(e);
if (code == LV_EVENT_CLICKED) {
LV_LOG_USER("按钮点击切换到 scr2\n");
create_scr2();
}
}
// 创建屏幕 1 的函数
void create_scr1(void) {
if (scr1 == NULL)
createhome();
lv_scr_load(scr1);
LV_LOG_USER("scr1 加载\n");
lv_obj_t * btn = lv_btn_create(scr1);
lv_obj_set_size(btn, 150, 150); // 设置按钮大小
lv_obj_align(btn, LV_ALIGN_TOP_LEFT, 30, 80); // 设置按钮位置
lv_obj_set_style_bg_color(btn, lv_color_hex(0x4684FD), LV_PART_MAIN);
// 创建按钮文本
lv_obj_t * label3 = lv_label_create(btn);
lv_obj_set_style_text_font(label3, &SourceHanSansCN_Medium_36, 0);
lv_obj_set_style_text_opa(label3, LV_OPA_100, 0);
lv_label_set_text(label3, "大棚");
lv_obj_align(label3, LV_ALIGN_BOTTOM_MID, 0, 0);
lv_obj_set_style_text_color(label3, lv_color_hex(0xffffff), 0);
// 创建特殊字体图标
lv_obj_t * label4 = lv_label_create(btn);
lv_obj_set_style_text_font(label4, &FontAwesome_40, 0);
lv_label_set_text(label4, "\xEF\x92\x94");
lv_obj_set_style_text_color(label4, lv_color_hex(0xffffff), 0);
lv_obj_align(label4, LV_ALIGN_CENTER, 0, -20);
// 添加点击后创建新屏幕事件
lv_obj_add_event_cb(btn, btn_event_handler, LV_EVENT_CLICKED, NULL);
}
#endif
周老师,你的意思是主按钮绑定的事件进入src2屏幕也应该加上删除scr1的代码吗,请问一下如果我这个屏幕中有其他按钮,并且按钮事件绑定控制下位机实体按键的功能,我进去其他屏幕,删除这个屏幕会不会删除这些按钮,如果删除这些按钮后,那绑定的功能我单片机上还会像没有删除之前那样执行吗,还是说删除那个屏幕后,单片机的按键也无法工作了?
你这个问题是有一个页面的退出并没有做好资源回收,并且又重复创建了新的控件,不管你有多少按钮或者其他控件都应该做好处理、不要一直重复创建。
如果你硬件的资源足够,你可以只创建一次,后续只需要将他们隐藏起来即可。