环境
GUI 指南:1.10.1
LVGL:8.3
小部件:按钮
款式部分:LV_PART_MAIN
样式状态:LV_STATE_DEFAULT
问题描述
我在 GUI Guider 1.10.1 中发现了一个可重现的代码生成问题。
当按钮配置了背景颜色,但其背景不透明度设置为 0 时,GUI Guider 不会生成相应的背景颜色属性。
当在运行时动态更改背景不透明度时,这会导致意外行为。
生殖
创建按钮并进行配置:
背景颜色:#F08300
背景不透明度:0
然后生成 LVGL 8.3 代码。
GUI 指南程序生成:
lv_obj_set_style_bg_opa(ui->screen_password_btn_15,
0,
LV_PART_MAIN | LV_STATE_DEFAULT);
但是,配置的背景颜色并未生成:
lv_obj_set_style_bg_color(ui->screen_password_btn_15,
lv_color_hex(0xF08300),
LV_PART_MAIN | LV_STATE_DEFAULT);
测试:仅将背景不透明度从 0 改为 1
我只将背景不透明度从 0 改为 1,而背景颜色保持为 #F08300。
代码重新生成后,GUI Guider 会生成:
lv_obj_set_style_bg_opa(ui->screen_password_btn_15,
1、
LV_PART_MAIN | LV_STATE_DEFAULT);
lv_obj_set_style_bg_color(ui->screen_password_btn_15,
lv_color_hex(0xF08300),
LV_PART_MAIN | LV_STATE_DEFAULT);
lv_obj_set_style_bg_grad_dir(ui->screen_password_btn_15,
LV_GRAD_DIR_NONE,
LV_PART_MAIN | LV_STATE_DEFAULT);
因此,生成的代码取决于背景不透明度是否恰好为 0。
背景不透明度 = 0:
生成 bg_opa
bg_color 未生成
背景不透明度 = 1:
生成 bg_opa
bg_color 已生成
还会生成其他背景属性。
运行时影响
我的应用程序使用背景不透明度来指示当前选定的密码数字。
GUI Guider 中将背景颜色配置为 #F08300,而应用程序仅动态更改背景不透明度。
例如:
lv_obj_set_style_bg_opa(btn,
LV_OPA_COVER,
LV_PART_MAIN | LV_STATE_DEFAULT);
对于初始背景不透明度为 0 的按钮,生成的代码不包含配置的背景颜色。
当应用程序将不透明度从 0 更改为 LV_OPA_COVER 时,按钮将显示 LVGL 主题或默认背景颜色,而不是 GUI Guider 中配置的 #F08300 颜色。
这种行为是:
GUI引导程序配置:
背景颜色 = #F08300
背景不透明度 = 0
生成的代码:
bg_opa = 0
bg_color 未生成
运行时:
bg_opa 已更改为 LV_OPA_COVER
结果:
显示的是默认背景色或主题背景色,而不是 #F08300。
临时解决方案
在应用程序代码中显式设置背景颜色可以解决此问题:
lv_obj_set_style_bg_color(btn,
lv_color_hex(0xF08300),
LV_PART_MAIN | LV_STATE_DEFAULT);
lv_obj_set_style_bg_opa(btn,
LV_OPA_COVER,
LV_PART_MAIN | LV_STATE_DEFAULT);
另一种可能的解决方法是在 GUI Guider 中将背景不透明度设置为 1,因为这会导致 GUI Guider 生成配置的背景颜色。
但是,这会改变初始用户界面状态,因此并不理想。
预期行为
背景颜色和背景不透明度是独立的 LVGL 样式属性。
如果用户明确配置:
背景颜色 = #F08300
背景不透明度 = 0
我希望 GUI Guider 能在生成的代码中保留这两个属性:
lv_obj_set_style_bg_opa(btn,
0,
LV_PART_MAIN | LV_STATE_DEFAULT);
lv_obj_set_style_bg_color(btn,
lv_color_hex(0xF08300),
LV_PART_MAIN | LV_STATE_DEFAULT);
虽然当 bg_opa 为 0 时 bg_color 没有明显的影响,但当应用程序在运行时动态更改 bg_opa 时,它就变得重要了。
当前代码生成行为会丢失在 GUI Guider 中配置的背景颜色信息。
实际行为
GUI Guider 1.10.1 在背景不透明度为 0 时似乎会忽略背景样式属性。
仅将不透明度从 0 改为 1,会导致背景颜色和其他背景属性重新生成。
重现步骤
在 GUI Guider 1.10.1 中创建按钮。
将背景颜色设置为 #F08300。
将背景不透明度设置为0。
生成LVGL 8.3代码。
注意,已生成值为 0 的 lv_obj_set_style_bg_opa。
请注意,未生成颜色为 #F08300 的 lv_obj_set_style_bg_color。
仅将背景不透明度从 0 改为 1。
重新生成代码。
请注意,现在已生成颜色为 #F08300 的 lv_obj_set_style_bg_color。
在运行时,将原始按钮的不透明度更改为 LV_OPA_COVER。
请注意,除非应用程序明确设置了 bg_color,否则配置的背景颜色不会显示。
问题
这是 GUI Guider 1.10.1 中有意为之的代码大小优化,还是代码生成问题?
如果这种优化是有意为之,GUI Guider 能否提供一个选项,在背景不透明度为 0 时保留背景属性?
运行时应用程序通常会动态更改 LVGL 样式属性,因此仅根据其初始不透明度省略 bg_color 可能会导致运行时行为与 UI 配置不同。
你好@zzjgood,
感谢你的帖子。
我可以重现您描述的情况。我认为这是一个代码生成问题。如果用户明确配置了背景颜色,即使初始背景不透明度为 0,GUI Guider 也应该保留相应的 bg_color 代码,或者提供一个选项来保留透明对象的背景样式属性。我会将此问题报告给 GUI-Guider 团队,以便他们进一步修复。此外,根据我们的内部升级流程,如果您能提供以下信息,我们将不胜感激:
- 你用的是哪款NXP产品?
- 你的最终应用是什么?
目前实际的变通方法是在应用代码中明确设置背景色和不透明度:
lv_obj_set_style_bg_color(btn,
lv_color_hex(0xF08300),
LV_PART_MAIN | LV_STATE_DEFAULT);
lv_obj_set_style_bg_opa(btn,
LV_OPA_COVER,
LV_PART_MAIN | LV_STATE_DEFAULT);
希望它有帮助。
BR
塞莱斯特