返回一级菜单进入时的焦点框

我用的是实体按键的外部设备,在桌面创建了6个btn,将他们放到一个组里,不管在哪个btn进入二级菜单再返回主菜单时选择框显示的都是第一个,有什么思路返回时选择框在进入时的那个。

列举我的一个进入和返回的回调函数
//进入界面6,删除主界面
static void screen_btn_6_event_handler (lv_event_t *e)
{
lv_event_code_t code = lv_event_get_code(e);

switch (code) {
case LV_EVENT_CLICKED:
{
	ui_load_scr_animation(&guider_ui, &guider_ui.screen_6, guider_ui.screen_6_del, &guider_ui.screen_del, setup_scr_screen_6, LV_SCR_LOAD_ANIM_NONE, 200, 200, true, true);
	
	break;
}
default:
	break;
}

}
//进入主界面,删除界面6
static void screen_6_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_6_del, setup_scr_screen, LV_SCR_LOAD_ANIM_NONE, 200, 200, true, true);
	break;
}
default:
	break;
}

}
主菜单的6个btn
lv_group_add_obj(g,ui->screen_btn_1);
lv_group_add_obj(g,ui->screen_btn_2);
lv_group_add_obj(g,ui->screen_btn_3);
lv_group_add_obj(g,ui->screen_btn_4);
lv_group_add_obj(g,ui->screen_btn_5);
lv_group_add_obj(g,ui->screen_btn_6);
另外还想请教下这个选择框的样式可以设置的么
1712912913315

这个很简单,只需要记录上次聚焦(lv_group_get_focused)的是哪个btn ,返回来的时候手动聚焦(lv_group_focus_obj)到该对象。

参考文档: https://lvgl.100ask.net/8.3/overview/indev.html?highlight=lv_group_focus_obj#id1

        if(data->key == LV_KEY_ENTER) {
			act1 = lv_group_get_focused(g);
            /*Send the ENTER as a normal KEY*/
            lv_group_send_data(g, LV_KEY_ENTER);
            if(indev_reset_check(&i->proc)) return;

            if(!dis) lv_event_send(act1, LV_EVENT_PRESSED, indev_act);
            if(indev_reset_check(&i->proc)) return;
        }
        else if(data->key == LV_KEY_ESC) {
            /*Send the ESC as a normal KEY*/				
            lv_group_send_data(g, LV_KEY_ESC);
            if(indev_reset_check(&i->proc)) return;
			lv_group_focus_obj(act1);
            lv_event_send(act1, LV_EVENT_CANCEL, indev_act);				
            if(indev_reset_check(&i->proc)) return;
        } 我在lv_index.c中这么修改,原文是          

if(data->key == LV_KEY_ENTER) {
/Send the ENTER as a normal KEY/
lv_group_send_data(g, LV_KEY_ENTER);
if(indev_reset_check(&i->proc)) return;

            if(!dis) lv_event_send(indev_obj_act, LV_EVENT_PRESSED, indev_act);
            if(indev_reset_check(&i->proc)) return;
        }
        else if(data->key == LV_KEY_ESC) {
            /*Send the ESC as a normal KEY*/				
            lv_group_send_data(g, LV_KEY_ESC);
            if(indev_reset_check(&i->proc)) return;

            lv_event_send(indev_obj_act, LV_EVENT_CANCEL, indev_act);				
            if(indev_reset_check(&i->proc)) return;
        },改完后按ESC就会卡死,这样改的有问题嘛

lvgl的按键和组不是这么使用的,不管如何都不应该修改lvgl文件夹中的内容

image
image
我现在在进入的回调函数获取,取消的回调函数设置这个焦点,这样用法有问题嘛,这样使用还不行

聚焦到某个对象之前要确保两个点:该对象支持聚焦、该对象当前能聚焦(可见)

试了几次发现都还是回到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是不一样的,死机问题也是这样引起的,聚焦找不到焦点嘛。

我也遇到了这个问题,聚焦(lv_group_get_focused)的信息,当页面切换的时候删除了当前页面的控件对象,后面再次切换回来的时候保存的焦点地址就变了,这种情况怎么解决

不能删除就把他隐藏了,等需要的时候在显示出来