硬汉嵌入式论坛

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

[LVGL] LVGL求助,急!!!!

  [复制链接]

4

主题

31

回帖

43

积分

新手上路

积分
43
发表于 2023-7-10 11:21:46 | 显示全部楼层 |阅读模式
想询问一下大家,我的每个界面都单独写了一个.c文件,单独显示的话都可以。如果想要实现这些界面之间的轮播的话,我需要怎么设定呢?困扰好久了,试了好几种方法都不行,难道要整体代码的更改吗?
回复

使用道具 举报

3

主题

75

回帖

84

积分

初级会员

积分
84
发表于 2023-7-10 12:10:21
pag

3

主题

75

回帖

84

积分

初级会员

积分
84
发表于 2023-7-10 12:10:32 | 显示全部楼层
切换page
回复

使用道具 举报

4

主题

31

回帖

43

积分

新手上路

积分
43
 楼主| 发表于 2023-7-10 13:36:20 | 显示全部楼层

能仔细说一下吗?不太会操作
回复

使用道具 举报

4

主题

31

回帖

43

积分

新手上路

积分
43
 楼主| 发表于 2023-7-10 13:41:06 | 显示全部楼层

您好,能详细询问您一下这个该怎么操作吗?我跟着网上尝试了好几种方法,都不太行。
回复

使用道具 举报

44

主题

564

回帖

701

积分

金牌会员

积分
701
发表于 2023-7-10 13:58:39 | 显示全部楼层
这不就是页面切换吗,简单的用这个就可以切换页面啊lv_scr_load(obj);
回复

使用道具 举报

4

主题

31

回帖

43

积分

新手上路

积分
43
 楼主| 发表于 2023-7-10 14:12:16 | 显示全部楼层
ou513 发表于 2023-7-10 13:58
这不就是页面切换吗,简单的用这个就可以切换页面啊lv_scr_load(obj);

但是我的每个界面都封装成了一个函数,没有obj对象
回复

使用道具 举报

4

主题

31

回帖

43

积分

新手上路

积分
43
 楼主| 发表于 2023-7-10 14:15:46 | 显示全部楼层
我的每个界面都是单独的.c文件,且封装成了一个函数,尝试过网上界面切换的各种方法,并不适用。我想实现的功能是我写的这几个界面可以实现30s自动切换一个,30s再切换成下一个,我这个界面没有按键,也没有鼠标滑动,只是显示在对应的显示屏上,想要实现这样的效果,请求各位大佬指教一下,非常感谢。
回复

使用道具 举报

2

主题

180

回帖

186

积分

初级会员

积分
186
发表于 2023-7-10 15:29:17 | 显示全部楼层
这个简单啊,删除lv_obj_del(child); 新建switch (index)
                {
                case 1:gui_cail_create(gui_main.cont); break;
                case 2:gui_curve_create(gui_main.cont); break;
                case 3:gui_param_create(gui_main.cont); break;
                case 4:gui_sys_create(gui_main.cont); break;
                }
回复

使用道具 举报

4

主题

31

回帖

43

积分

新手上路

积分
43
 楼主| 发表于 2023-7-10 16:20:46 | 显示全部楼层
qq57379550 发表于 2023-7-10 15:29
这个简单啊,删除lv_obj_del(child); 新建switch (index)
                {
                case 1:gui ...

有点没明白
回复

使用道具 举报

2

主题

180

回帖

186

积分

初级会员

积分
186
发表于 2023-7-10 16:46:54 | 显示全部楼层

更简单点,开机创建一个obj和显示内容放在这里,然后每次切换新建一个全屏obj,每次切换的时候删除这个obj然后把页面create在这个obj,create(obj)
回复

使用道具 举报

3

主题

47

回帖

56

积分

初级会员

积分
56
发表于 2023-7-10 17:12:03 | 显示全部楼层
SAmomolin 发表于 2023-7-10 14:15
我的每个界面都是单独的.c文件,且封装成了一个函数,尝试过网上界面切换的各种方法,并不适用。我想实现的 ...

看一下你的函数,每个界面的父容器是什么?
回复

使用道具 举报

4

主题

31

回帖

43

积分

新手上路

积分
43
 楼主| 发表于 2023-7-10 17:35:40 | 显示全部楼层
baobao5 发表于 2023-7-10 17:12
看一下你的函数,每个界面的父容器是什么?

void display(void)
{
    //黑色背景
    bg_black=lv_obj_create(lv_scr_act());
    lv_obj_set_size(bg_black,800,1300);
    lv_obj_set_style_bg_color(bg_black,lv_color_hex(0x000000),LV_STATE_DEFAULT);
    lv_obj_set_style_radius(bg_black,0,LV_STATE_DEFAULT);
}
好像就是当前显示界面
回复

使用道具 举报

1

主题

6

回帖

9

积分

新手上路

积分
9
发表于 2023-7-11 14:11:55 | 显示全部楼层
lv_obj_t * 屏幕数组[] ={
lv_obj_t  * 屏幕1 = lv_obj_create(NULL);
lv_obj_t  * 屏幕2 = lv_obj_create(NULL);
lv_obj_t  * 屏幕3 = lv_obj_create(NULL);
.......
};
for(i=0;i<count;i++){
  lv_scr_load_anim(屏幕数组[i],动画,延迟时间,动画时间,true)
  延迟30s。。。
}
大概就这样
回复

使用道具 举报

3

主题

47

回帖

56

积分

初级会员

积分
56
发表于 2023-7-11 14:49:22 | 显示全部楼层
[C] 纯文本查看 复制代码
lv_obj_t *bg_black, bg_red, bg_green;

void display1(void)
{
    //黑色背景
    bg_black=lv_obj_create(lv_scr_act());
    lv_obj_set_size(bg_black,800,1300);
    lv_obj_set_style_bg_color(bg_black,lv_color_hex(0x000000),LV_STATE_DEFAULT);
    lv_obj_set_style_radius(bg_black,0,LV_STATE_DEFAULT);
}

void display2(void)
{
    //红色背景
    bg_red=lv_obj_create(lv_scr_act());
    lv_obj_set_size(bg_red,800,1300);
    lv_obj_set_style_bg_color(bg_red,lv_color_hex(0x000000),LV_STATE_DEFAULT);
    lv_obj_set_style_radius(bg_red,0,LV_STATE_DEFAULT);
}

void display3(void)
{
    //绿色背景
    bg_green=lv_obj_create(lv_scr_act());
    lv_obj_set_size(bg_green,800,1300);
    lv_obj_set_style_bg_color(bg_green,lv_color_hex(0x000000),LV_STATE_DEFAULT);
    lv_obj_set_style_radius(bg_green,0,LV_STATE_DEFAULT);
}


void main()
{
    // 显示黑色
    display1();
    os_delay(5000);

    // 删除黑色
    lv_obj_del(bg_black);

    // 显示红色
    display2();
    os_delay(5000);

    // 删除红色
    lv_obj_del(bg_red);
    
    // 显示绿色
    display3();
    os_delay(5000);

    // 删除绿色
    lv_obj_del(bg_green);
}
回复

使用道具 举报

4

主题

31

回帖

43

积分

新手上路

积分
43
 楼主| 发表于 2023-7-11 17:52:23 | 显示全部楼层
baobao5 发表于 2023-7-11 14:49
[mw_shl_code=c,true]
lv_obj_t *bg_black, bg_red, bg_green;

我这个一个界面的话有很多控件,大概有几十个,要一个一个的del吗?
回复

使用道具 举报

4

主题

31

回帖

43

积分

新手上路

积分
43
 楼主| 发表于 2023-7-11 17:53:26 | 显示全部楼层
xx_556678 发表于 2023-7-11 14:11
lv_obj_t * 屏幕数组[] ={
lv_obj_t  * 屏幕1 = lv_obj_create(NULL);
lv_obj_t  * 屏幕2 = lv_obj_crea ...

这个对我的这个好像不太行,因为每个界面都只是写了一个函数放在.c里面
回复

使用道具 举报

1

主题

6

回帖

9

积分

新手上路

积分
9
发表于 2023-7-11 18:57:40 | 显示全部楼层
SAmomolin 发表于 2023-7-11 17:52
我这个一个界面的话有很多控件,大概有几十个,要一个一个的del吗?

屏幕是没有父对象的 删除屏幕对象他包含的子对象都一起删除
回复

使用道具 举报

1

主题

6

回帖

9

积分

新手上路

积分
9
发表于 2023-7-11 19:16:03 | 显示全部楼层
SAmomolin 发表于 2023-7-11 17:53
这个对我的这个好像不太行,因为每个界面都只是写了一个函数放在.c里面

你创建对象的时候不要lv_xxxx_create(lv_scr_act());
lv_scr_act()是获取当前的屏幕 你创建的对象就是当前屏幕的子对象
你要直接用 lv_obj_t  * 新屏幕 = lv_obj_create(NULL);创建新的屏幕  
如何在对应的屏幕下创建新对象 比如 lv_label_create(新屏幕);这样相当于在新屏幕中创建了个标签
但是新屏幕是不会显示的使用 lv_src_load(新屏幕);这个函数加载这个新屏幕就会显示出来
不过这个函数是不会把旧屏幕在内存中删除的 屏幕数量多了以后就会内存溢出
一般是使用lv_scr_load_anim(要加载的新屏幕,过场动画,延迟时间ms后开始,过场动画时间,是否要删除当前屏幕);
这个函数刚才和lv_src_load()差不多 最后一个参数可以指定是否要删除当前的屏幕
这样你大概清楚了吧
回复

使用道具 举报

1

主题

6

回帖

9

积分

新手上路

积分
9
发表于 2023-7-11 19:31:43 | 显示全部楼层
SAmomolin 发表于 2023-7-11 17:53
这个对我的这个好像不太行,因为每个界面都只是写了一个函数放在.c里面

你的问题时每个屏幕写在 不同的c文件中什么关系啊 比如你创建lv_obj_t  * srceen = lv_obj_create(NULL);
这个srceen 可以是全局变量 其他地方直接extren 或者引入头文件都行啊
回复

使用道具 举报

3

主题

13

回帖

22

积分

新手上路

积分
22
发表于 2023-7-12 08:48:27 | 显示全部楼层
xx_556678 发表于 2023-7-11 19:16
你创建对象的时候不要lv_xxxx_create(lv_scr_act());
lv_scr_act()是获取当前的屏幕 你创建的对象就是 ...

我写的程序,基本都是以当前屏幕为父对象创建需要的界面,界面与整个界面尺寸大小一样,然后控件都是放在这个界面对象上来,每次切换对象直接删除这个界面,这样也不需要加载新屏幕。如果想做界面切换的动画效果,也是可以的,不一定非要创建新的屏幕对象
回复

使用道具 举报

3

主题

47

回帖

56

积分

初级会员

积分
56
发表于 2023-7-12 09:32:25 | 显示全部楼层
SAmomolin 发表于 2023-7-11 17:52
我这个一个界面的话有很多控件,大概有几十个,要一个一个的del吗?

lv_obj_del(obj);会把obj和他的所有子对象全部删除,不需要一个一个删除。

或者简单一点的,直接使用 lv_obj_clean(lv_scr_act()); 这样直接把当前屏幕的所有控件都删除了。

如果切换想要动画的话,可以看一下tabview的使用方法。
回复

使用道具 举报

1

主题

6

回帖

9

积分

新手上路

积分
9
发表于 2023-7-19 17:36:16 | 显示全部楼层
那年的岳麓山 发表于 2023-7-12 08:48
我写的程序,基本都是以当前屏幕为父对象创建需要的界面,界面与整个界面尺寸大小一样,然后控件都是放在 ...

虽然你这样也可以 当时项目大了以后就不好管理了 而且做稍微大一点的项目就不可能自己一个个画控件肯定要用SquareLine Studio或Guider的来开发的,它们生成的工程就是多页面的
回复

使用道具 举报

0

主题

10

回帖

10

积分

新手上路

积分
10
发表于 2023-7-20 14:55:20 | 显示全部楼层
xx_556678 发表于 2023-7-19 17:36
虽然你这样也可以 当时项目大了以后就不好管理了 而且做稍微大一点的项目就不可能自己一个个画控件肯定要 ...

实际上就是给每个页面搞一个初始化和退出方法,在载入页面时初始化,退出时清理掉所有的控件就可以了
回复

使用道具 举报

24

主题

122

回帖

194

积分

初级会员

积分
194
发表于 2023-8-13 13:15:54 来自手机 | 显示全部楼层
你这个c文件只是个布局ui文件,当然得驱动才行
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-14 09:09 , Processed in 0.277846 second(s), 25 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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