LVGL切换菜单返回焦点

        记录一下。

        用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是不一样的,死机问题也是这样引起的,聚焦找不到焦点嘛。

        目前还没发现其他问题,如有错误请各位大佬指正,另外有什么更好的方法可以指出,谢谢。

        有问题需要探讨的可以留下联系方式,看到加。

  • 17
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值