Yue@123 发表于 2023-11-13 13:52:01

请问V8上list控件的lv_list_focus接口函数怎么没有了?V7还有的

我们项目升级到V8.3的LVGL了,我要用LIST控件实现菜单界面,发现LIST接口改了,lv_list_focus接口函数没有了,请问这个办?

eric2013 发表于 2023-11-13 15:42:07

那就继续用低版本。

Yue@123 发表于 2023-11-13 16:01:55

V7到V8改动太大了感觉,我们同事说版本升上去就不降了。。。。

baobao5 发表于 2023-11-13 16:04:50

换个实现方法,lv_obj_scroll_to_view,这个更简单,而且是通用的,list、tabvie什么的都能用。

Yue@123 发表于 2023-11-14 13:41:46

       lv_obj_t * btn = lv_obj_get_child(list, 0);

       lv_obj_scroll_to_view(btn, LV_ANIM_ON);

是类似这样的代码吧?

Yue@123 发表于 2023-11-14 15:40:54

baobao5 发表于 2023-11-13 16:04
换个实现方法,lv_obj_scroll_to_view,这个更简单,而且是通用的,list、tabvie什么的都能用。


       lv_obj_t * btn = lv_obj_get_child(list, 0);

       lv_obj_scroll_to_view(btn, LV_ANIM_ON);

我这样写了,没有任何效果,我们是实体按键的项目,屏是不支持触摸的

baobao5 发表于 2023-11-14 20:46:26

Yue@123 发表于 2023-11-14 15:40
lv_obj_t * btn = lv_obj_get_child(list, 0);

       lv_obj_scroll_to_view(btn, LV_ANIM_ ...

和屏幕没关系,只要调用了这个函数就行,是不是btn的父容器list也不在屏幕上面,这样的话需要用   lv_obj_scroll_to_view_recursive   递归的滚动到可见。

这个函数的作用就是让控件滚动至可见,和lv_list_focus 的功能是一样的。

Yue@123 发表于 2023-11-15 09:05:58

baobao5 发表于 2023-11-14 20:46
和屏幕没关系,只要调用了这个函数就行,是不是btn的父容器list也不在屏幕上面,这样的话需要用   lv_obj ...

好的,我试试,多谢

Yue@123 发表于 2023-11-15 09:19:24

        if (setting_screen == NULL){
                setting_screen = lv_obj_create(NULL);
        }
        lv_scr_load(setting_screen);
       lv_obj_t * list = lv_list_create(setting_screen);
       //lv_obj_t * btn;

        lv_list_add_btn(list, LV_SYMBOL_LIST, "Display Setting");

        lv_list_add_btn(list, LV_SYMBOL_LIST, "Information");

        lv_list_add_btn(list, LV_SYMBOL_LIST, "Language");

        lv_list_add_btn(list, LV_SYMBOL_LIST, "Theme");

        lv_list_add_btn(list, LV_SYMBOL_LIST, "Password");

        lv_list_add_btn(list, LV_SYMBOL_LIST, "Bluetooth");

        lv_list_add_btn(list, LV_SYMBOL_LIST, "Factory Reset");

        lv_list_add_btn(list, LV_SYMBOL_LIST, "Exit");
       
        lv_obj_set_pos(list, 0, 51);
        lv_obj_set_size(list, 800, 320+110);
        //lv_obj_set_scrollbar_mode(list, LV_SCROLLBAR_MODE_OFF);
        lv_obj_add_flag(list, LV_OBJ_FLAG_CLICK_FOCUSABLE);

       lv_obj_t * btn = lv_obj_get_child(list, 1);

       lv_obj_scroll_to_view(btn, LV_ANIM_ON);

我这个list是在屏幕上面啊,但是就是没有焦点在list上的效果


   

Yue@123 发表于 2023-11-15 09:22:47

我是想实现进入这个列表界面,默认选中第一个列表菜单这样的效果,用了上面的代码但是没有效果

baobao5 发表于 2023-11-15 10:21:54

Yue@123 发表于 2023-11-15 09:22
我是想实现进入这个列表界面,默认选中第一个列表菜单这样的效果,用了上面的代码但是没有效果


下面是lv_list_focus_btn的源码,主要是两个作用,一个是清除其他按钮的focused状态,然后给当前按钮添加focused状态,然后是lv_page_focus,就是让当天按钮可以显示在屏幕上;

lv_obj_scroll_to_view(btn, LV_ANIM_ON)是显示按钮,再加上lv_obj_add_state(btn, LV_STATE_FOCUSED)就可以了;

记得先清除其他按钮的focused状态lv_obj_clear_state。


void lv_list_focus_btn(lv_obj_t * list, lv_obj_t * btn)
{
    LV_ASSERT_OBJ(list, LV_OBJX_NAME);
    if(btn) {
      LV_ASSERT_OBJ(btn, "lv_btn");
    }

    lv_list_ext_t * ext = lv_obj_get_ext_attr(list);

    /*Defocus the current button*/
    if(ext->act_sel_btn) lv_obj_clear_state(ext->act_sel_btn, LV_STATE_FOCUSED);

#if LV_USE_GROUP
    /*Don't forget which button was selected.
   * It will be restored when the list is focused again.*/
    if(btn) ext->last_sel_btn = btn;
#endif
    /*Focus the new button*/
    ext->act_sel_btn = btn;

    if(ext->act_sel_btn) {
      lv_obj_add_state(ext->act_sel_btn, LV_STATE_FOCUSED);
      lv_page_focus(list, ext->act_sel_btn, LV_ANIM_ON);
    }
}

Yue@123 发表于 2023-11-15 10:43:35

baobao5 发表于 2023-11-15 10:21
下面是lv_list_focus_btn的源码,主要是两个作用,一个是清除其他按钮的focused状态,然后给当前按钮添 ...

好的,我试下,多谢回复

Yue@123 发表于 2023-11-15 10:53:08

       lv_obj_t * list = lv_list_create(setting_screen);
       lv_obj_t * btn = lv_list_add_btn(list, LV_SYMBOL_LIST, "Display Setting");

        lv_list_add_btn(list, LV_SYMBOL_LIST, "Information");

        lv_list_add_btn(list, LV_SYMBOL_LIST, "Language");

        lv_list_add_btn(list, LV_SYMBOL_LIST, "Theme");

        lv_list_add_btn(list, LV_SYMBOL_LIST, "Password");

        lv_list_add_btn(list, LV_SYMBOL_LIST, "Bluetooth");

        lv_list_add_btn(list, LV_SYMBOL_LIST, "Factory Reset");

        lv_list_add_btn(list, LV_SYMBOL_LIST, "Exit");
       
        lv_obj_set_pos(list, 0, 51);
        lv_obj_set_size(list, 800, 320+110);
        //lv_obj_set_scrollbar_mode(list, LV_SCROLLBAR_MODE_OFF);
        lv_obj_add_flag(list, LV_OBJ_FLAG_SCROLL_WITH_ARROW);

       //lv_obj_t * btn = lv_obj_get_child(list, 1);
       for (int i = 0; i<lv_obj_get_child_cnt(list); i++){
               lv_obj_clear_state(lv_obj_get_child(list, i), LV_STATE_FOCUSED);
       }
       lv_obj_scroll_to_view(btn, LV_ANIM_ON);
       //lv_obj_scroll_to_view(btn, LV_ANIM_ON);
      lv_obj_add_state(btn, LV_STATE_FOCUSED);

      lv_obj_add_event_cb(btn, btn_click_event_cb, LV_EVENT_CLICKED, NULL);

还是没有效果,见附件的图,就是没有选中的效果

baobao5 发表于 2023-11-15 15:52:48

Yue@123 发表于 2023-11-15 10:53
lv_obj_t * list = lv_list_create(setting_screen);
       lv_obj_t * btn = lv_list_add_btn(li ...

选中的效果要自己加,是自定义的。

lv_obj_set_style_xxx(btn, parm, LV_STATE_FOCUSED);

看你的需求的话只需要设置背景色和背景透明度就可以了
lv_obj_set_style_bg_color(subject_btn, lv_color_hex(0x2094f0), LV_STATE_FOCUSED);
lv_obj_set_style_bg_opa(subject_btn, LV_OPA_100, LV_STATE_FOCUSED);

Yue@123 发表于 2023-11-16 15:08:58

baobao5 发表于 2023-11-15 15:52
选中的效果要自己加,是自定义的。

lv_obj_set_style_xxx(btn, parm, LV_STATE_FOCUSED);


列表高亮的已经可以了,多谢!
再请教下,如果我有两个SCREEN界面,从SCREEN1到SCREEN2后,我要返回到SCREEN1,是调用什么接口函数呢?
我现在用的是下面这个:
        lv_scr_load_anim(screen2, LV_SCR_LOAD_ANIM_NONE, 0, 0, true);
页: [1]
查看完整版本: 请问V8上list控件的lv_list_focus接口函数怎么没有了?V7还有的