记录一下。
用gui_guider做了一个三级菜单的界面,我没有触摸屏幕,用的是物理按键控制菜单,进入二级界面后返回一级界面时候焦点自动聚焦的是第一个btn,实际需要返回进入时的焦点。
切换界面的话我理解是要先把旧的页面删除掉,再显示新的,不然容易引起内存问题,所有我后面还傻乎乎的没发现问题。下面是界面切换的函数,我就不过多解释。
void ui_load_scr_animation(lv_ui *ui, lv_obj_t ** new_scr, bool new_scr_del, bool * old_scr_del, ui_setup_scr_t setup_scr,
lv_scr_load_anim_t anim_type, uint32_t time, uint32_t delay, bool is_clean, bool auto_del)
{
lv_obj_t * act_scr = lv_scr_act();
lv_disp_t * d = lv_obj_get_disp(act_scr);
if (d->prev_scr == NULL && (d->scr_to_load == NULL || d->scr_to_load == act_scr)) {
#if LV_USE_FREEMASTER
if(auto_del) {
gg_edata_task_clear(act_scr);
}
#endif
if (auto_del && is_clean) {
lv_obj_clean(act_scr);
}
if (new_scr_del) {
setup_scr(ui);
}
lv_scr_load_anim(*new_scr, anim_type, time, delay, auto_del);
*old_scr_del = auto_del;
}
}
然后回归正传,看了一些文档说是先使用lv_obj_t * lv_group_get_focused(const lv_group_t * group)获取焦点,返回的时候用void lv_group_focus_obj(lv_obj_t * obj)聚焦到刚才那个焦点。
于是我定义了一个静态对象变量
static lv_obj_t *current_focused_obj = NULL;
然后在一级菜单进入二级界面的回调函数中调用lv_group_get_focused保存焦点
static void screen_btn_2_event_handler (lv_event_t *e)
{
lv_event_code_t code = lv_event_get_code(e);
switch (code) {
case LV_EVENT_CLICKED:
{
current_focused_obj = lv_group_get_focused(guider_ui.g1);//获得进入时的焦点
printf("focused address: %p\n",(void *)current_focused_obj);
ui_load_scr_animation(&guider_ui, &guider_ui.screen_2, guider_ui.screen_2_del, &guider_ui.screen_del, setup_scr_screen_2, LV_SCR_LOAD_ANIM_OVER_BOTTOM, 200, 200, true, true);//删除旧界面,创建新页面
break;
}
default:
break;
}
}
然后在二级菜单的回调函数中调用lv_group_focus_obj
static void screen_2_list_1_item0_event_handler (lv_event_t *e)
{
lv_event_code_t code = lv_event_get_code(e);
switch (code) {
case LV_EVENT_CANCEL:
{
ui_load_scr_animation(&guider_ui, &guider_ui.screen, guider_ui.screen_del, &guider_ui.screen_2_del, setup_scr_screen, LV_SCR_LOAD_ANIM_NONE, 200, 200, true, true);//删除旧界面,创建新页面
lv_group_focus_obj(current_focused_obj);
printf("current_focused_obj address :%p\n",(void *)current_focused_obj);
break;
}
case LV_EVENT_CLICKED:
{
ui_load_scr_animation(&guider_ui, &guider_ui.screen_7, guider_ui.screen_7_del, &guider_ui.screen_2_del, setup_scr_screen_7, LV_SCR_LOAD_ANIM_NONE, 200, 200, true, true);//删除旧界面,创建新页面
break;
}
default:
break;
}
}
试了几次发现都还是回到screen_btn_1的焦点而没有回到screen_btn_2的焦点,还造成了死机,之前还以为是用法有问题,然后我突然想起,那我直接聚焦我要聚焦的对象就行了嘛,直接lv_group_focus_obj(guider_ui.screen_btn_2);发现是可以的,那说明了我直接保存的焦点current_focused_obj和screen_btn_2是不一样的,于是我分别打印了他们的地址,发现每次进入退出的时候screen_btn_2的地址都是变化的,那我就找到原因了。因为每次进入新界面,旧界面的所有子对象都被删除了,而重新创建的对象地址是重新分配的,所有current_focused_obj和screen_btn_2是不一样的,死机问题也是这样引起的,聚焦找不到焦点嘛。
目前还没发现其他问题,如有错误请各位大佬指正,另外有什么更好的方法可以指出,谢谢。
有问题需要探讨的可以留下联系方式,看到加。