硬汉嵌入式论坛

 找回密码
 立即注册
查看: 443|回复: 14
收起左侧

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

[复制链接]

1

主题

23

回帖

26

积分

新手上路

积分
26
发表于 2023-11-13 13:52:01 | 显示全部楼层 |阅读模式
我们项目升级到V8.3的LVGL了,我要用LIST控件实现菜单界面,发现LIST接口改了,lv_list_focus接口函数没有了,请问这个办?
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106660
QQ
发表于 2023-11-13 15:42:07 | 显示全部楼层
那就继续用低版本。
回复

使用道具 举报

1

主题

23

回帖

26

积分

新手上路

积分
26
 楼主| 发表于 2023-11-13 16:01:55 | 显示全部楼层
V7到V8改动太大了感觉,我们同事说版本升上去就不降了。。。。
回复

使用道具 举报

3

主题

47

回帖

56

积分

初级会员

积分
56
发表于 2023-11-13 16:04:50 | 显示全部楼层
换个实现方法,lv_obj_scroll_to_view,这个更简单,而且是通用的,list、tabvie什么的都能用。
回复

使用道具 举报

1

主题

23

回帖

26

积分

新手上路

积分
26
 楼主| 发表于 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);

是类似这样的代码吧?
回复

使用道具 举报

1

主题

23

回帖

26

积分

新手上路

积分
26
 楼主| 发表于 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);

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

使用道具 举报

3

主题

47

回帖

56

积分

初级会员

积分
56
发表于 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 的功能是一样的。
回复

使用道具 举报

1

主题

23

回帖

26

积分

新手上路

积分
26
 楼主| 发表于 2023-11-15 09:05:58 | 显示全部楼层
baobao5 发表于 2023-11-14 20:46
和屏幕没关系,只要调用了这个函数就行,是不是btn的父容器list也不在屏幕上面,这样的话需要用   lv_obj ...

好的,我试试,多谢
回复

使用道具 举报

1

主题

23

回帖

26

积分

新手上路

积分
26
 楼主| 发表于 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上的效果


   
回复

使用道具 举报

1

主题

23

回帖

26

积分

新手上路

积分
26
 楼主| 发表于 2023-11-15 09:22:47 | 显示全部楼层
我是想实现进入这个列表界面,默认选中第一个列表菜单这样的效果,用了上面的代码但是没有效果
list.png
回复

使用道具 举报

3

主题

47

回帖

56

积分

初级会员

积分
56
发表于 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。


[C] 纯文本查看 复制代码
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);
    }
}
回复

使用道具 举报

1

主题

23

回帖

26

积分

新手上路

积分
26
 楼主| 发表于 2023-11-15 10:43:35 | 显示全部楼层
baobao5 发表于 2023-11-15 10:21
下面是lv_list_focus_btn的源码,主要是两个作用,一个是清除其他按钮的focused状态,然后给当前按钮添 ...

好的,我试下,多谢回复
回复

使用道具 举报

1

主题

23

回帖

26

积分

新手上路

积分
26
 楼主| 发表于 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);

还是没有效果,见附件的图,就是没有选中的效果
2.jpg
回复

使用道具 举报

3

主题

47

回帖

56

积分

初级会员

积分
56
发表于 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);
回复

使用道具 举报

1

主题

23

回帖

26

积分

新手上路

积分
26
 楼主| 发表于 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);
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-4-28 21:08 , Processed in 0.449480 second(s), 29 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表