使用GUI Guider工具开发嵌入式GUI应用(6)-切换多screen换场景

本文介绍了如何使用GUIGuider开发嵌入式GUI应用,涉及创建多个页面,配置事件以实现页面循环切换。遇到的Bug涉及到LVGL内核的判定条件,通过修改自动生成的C代码解决了问题。

使用GUI Guider工具开发嵌入式GUI应用(6)-切换多screen换场景

本节将展示使用GUI Guider实现切换显示页面功能。

这里设计的用例是:

  • 创建3张页面,screen_0,screen_1screen_2
  • 分别在每个页面上中放置一个Label(最简单的显示组件),分别填入不同的字符串,例如WelcomeYOUHello等。
  • 为每个页面创建触发事件,配置GUI Guider让3个页面循环切换。当上一个页面载入完成后,切换页面开始载入下一个页面,循环往复。

在这里插入图片描述

图x 在GUI Guider中创建多页面

在GUI Guider编辑区的左上角,有页面管理窗口,鼠标单击对应的加号"+"按钮,就可以新建页面。如果要改新建页面的名字,不能在页面管理窗口中直接重命名,此时可在GUI Guider编辑区右侧的“属性设置”标签页改变“名字”中的内容。为了减少生成不必要的键盘组件,记得要把“是否显示键盘”的选项关闭。如图x所示。

在这里插入图片描述

图x 为新建页面改名

然后,在“事件添加”标签页中,创建一个事件:

  • 指定触发方式为“Loaded”,对应当载入本页面中所有的显示内容后,触发该事件
  • 指定目标对象为“screen_1”,对应当该事件发生后,对页面screen_1进行操作
  • 指定动作为“加载页面”,及加载screen_1的页面。这里还可以选择加载页面的速度为1000ms内启动加载,以及加载新的页面后停留多久1000ms,甚至还可以选择加载的特效为“move left”,即从右向左移入。

在这里插入图片描述

图x 为页面配置事件

对新建的3个页面都是如此配置,即screen_0的载入完成后加载screen_1,screen_1加载完成后加载screen_2,screen_2加载完成后加载screen_0,形成循环。之后,就可以生成代码并仿真了。

在实际调试到这里的时候,发现了当前版本GUI Guider的一个Bug:生成C代码后使用模拟器运行,切换到screen_1就卡住了,不会继续切换screen_2。但是使用MicroPython的模拟器运行配置好的GUI Guider工程就可以正常切换。经过对比源码以及调试过程后发现,生成C代码中,确定最终能产生触发信号的一个判定条件未被合理使用,该排判定条件始终不能被满足,因此无法正确执行到预设的触发事件的语句。但在Python代码中,就避开了这个判断,从而能够正常切换页面。一个临时的解法,是人工改动GUI Guider生成events_init.c文件源码,将其中的d->prev_src == NULL这个判断条件屏蔽掉。见源码如下:

static void screen_0_event_handler(lv_event_t *e)
{
   
   
	lv_event_code_t code = lv_event_get_code(e);
	switch (code)
	{
   
   
	case LV_EVENT_SCREEN_LOADED:
	{
   
   
		lv_obj_t * act_scr = lv_scr_act();
		lv_disp_t * d = lv_obj_get_disp(act_scr)
<think>好的,用户想知道如何在gui-guider框架中实现手势滑动切换页面的功能。首先,我需要回忆一下gui-guider的相关知识。gui-guider是NXP推出的一个GUI开发工具,基于LVGL库,主要用于嵌入式设备的界面设计。手势检测通常是LVGL本身支持的功能,所以在gui-guider中应该可以通过事件回调来实现。 接下来,用户的需求是手势滑动切换页面。我需要分步骤考虑:首先,如何检测滑动手势;其次,如何管理页面切换的动画效果;最后,如何组织页面结构。 在LVGL中,滑动事件可以通过给对象添加事件回调函数来处理。比如,在页面容器上添加事件监听,当检测到LV_EVENT_GESTURE,判断手势方向,然后切换到下一个或上一个页面。可能需要使用lv_scr_act()获取当前屏幕,然后加载新的屏幕。 页面切换的动画效果可以通过LVGL的动画API实现,比如使用lv_scr_load_anim()函数来加载带有动画效果的屏幕。左右滑动对应不同的动画方向,比如LV_SCR_LOAD_ANIM_LEFT或RIGHT。 关于页面管理,gui-guider生成的代码通常会有个屏幕(screen),每个屏幕对应一个页面切换可能需要根据当前屏幕决定下一个屏幕是哪个。可能需要维护一个页面列表或使用索引来跟踪当前页面。 另外,需要注意手势的灵敏度,可能需要调整LVGL的输入设备配置,比如设置滑动阈值。还要考虑在页面边缘是否禁止滑动,比如第一页不能再左滑,最后一页不能右滑。 最后,用户可能需要示例代码来具体实现。需要确保代码中的事件处理函数正确绑定到容器对象上,并且在gui-guider的设计器中正确设置对象的可拖动属性或添加手势支持。 可能遇到的问题包括:手势事件没有被正确触发,可能是容器没有设置可拖动或者没有足够大的区域来检测手势。另外,页面切换动画不流畅,可能需要优化动画参数或确保没有其他任务阻塞主线程。 总结步骤:1. 在页面容器上启用手势检测;2. 添加事件回调处理滑动方向;3. 使用动画函数切换屏幕;4. 管理页面顺序和边界条件。</think>在GUI-Guider框架中实现手势滑动切换页面,主要依托LVGL库的手势检测和页面管理功能。以下是分步骤实现方案: ### 一、基础手势检测实现 1. 在页面容器添加事件回调 ```c lv_obj_add_event_cb(container, gesture_event_handler, LV_EVENT_GESTURE, NULL); ``` 2. 配置手势检测参数(在lv_conf.h) ```c #define LV_INDEV_DEF_SCROLL_THROW 10 // 滑动惯性阈值 #define LV_INDEV_DEF_GESTURE_LIMIT 30 // 手势识别最小移动距离 ``` ### 二、完整手势处理示例 ```c static void gesture_event_handler(lv_event_t * e) { lv_dir_t dir = lv_indev_get_gesture_dir(lv_indev_get_act()); lv_obj_t * act_scr = lv_scr_act(); if(dir == LV_DIR_LEFT) { lv_scr_load_anim(ui_Screen2, LV_SCR_LOAD_ANIM_MOVE_LEFT, 300, 0, false); } else if(dir == LV_DIR_RIGHT) { lv_scr_load_anim(ui_Screen1, LV_SCR_LOAD_ANIM_MOVE_RIGHT, 300, 0, false); } } ``` ### 三、进阶功能实现 1. 页面边界限制(在事件处理函数中添加): ```c // 获取当前页面索引 static uint8_t current_page = 0; const uint8_t max_page = 3; if(dir == LV_DIR_LEFT && current_page < max_page-1) { current_page++; // 加载下一页... } else if(dir == LV_DIR_RIGHT && current_page > 0) { current_page--; // 加载上一页... } ``` 2. 使用页面管理器(推荐方式): ```c typedef struct { lv_obj_t* screens[5]; uint8_t current_index; } page_manager_t; // 初始化注册所有页面 page_manager_t pm = { .screens = {ui_Home, ui_Settings, ui_Profile}, .current_index = 0 }; ``` ### 四、GUI-Guider专项配置 1. 在GUI设计器中: - 为容器对象启用"Scrollable"属性 - 设置输入设备为触摸屏 - 调整容器的尺寸占满整个屏幕 2. 在生成代码中定位: - 页面切换逻辑应添加在`custom/custom.c`文件 - 屏幕对象引用使用`ui_`前缀(如ui_Screen1) ### 五、性能优化建议 1. 预加载相邻页面: ```c lv_scr_load_anim(ui_Screen2, LV_SCR_LOAD_ANIM_MOVE_LEFT, 300, 0, true); // 参数5为预加载 ``` 2. 使用硬件加速: ```c lv_disp_set_driver_data(disp, &draw_ctx); // 在显示驱动配置中启用GPU加速 ``` [实际操作演示视频](https://example.com/gesture_demo)[^1]
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值