LVGL 妙用 LV_OBJ_FLAG_FLOATING

点击删除的时候需要一个确定和取消的提示界面,按钮的大小和删除的按钮一致。

static constexpr int kAlarmActionBtnWidth = 100;

static constexpr int kAlarmActionBtnHeight = 60;

static void ui_alarm_close_confirm_dialog(void)

{

if (ui_alarm_confirm_dialog != NULL) {

int alarm_id = static_cast<int>(reinterpret_cast<intptr_t>(lv_obj_get_user_data(btn)));

AlarmManager::GetInstance().RemoveAlarm(alarm_id);

ui_alarm_show_delete_confirm(alarm_id);

}

lv_obj_t * delete_btn = lv_button_create(delete_container);

lv_obj_set_width(delete_btn, 100);

lv_obj_set_height(delete_btn, 60);

ui_alarm_close_confirm_dialog();

lv_obj_clean(ui_Alarm_body);

| ^~~~~~~~~~ D:/ESP32P4/HC01/xiaozhi_code/xiaozhi-esp32-2.2.6/main/alarm_ui.cc: In function 'void ui_Alarm_refresh_from_manager()': D:/ESP32P4/HC01/xiaozhi_code/xiaozhi-esp32-2.2.6/main/alarm_ui.cc:311:85: warning: bitwise operation between different enumeration types '<unnamed enum>' and '<unnamed enum>' is deprecated -Wdeprecated-enum-enum-conversion 311 | lv_obj_set_style_text_align(empty_label, LV_TEXT_ALIGN_CENTER, LV_PART_MAIN | LV_STATE_DEFAULT); | ~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~

lv_obj_t * delete_btn = ui_alarm_create_action_button(delete_container, "删除", ui_event_Alarm_delete, alarm.id);

ui_alarm_create_action_button(delete_container, "删除", ui_event_Alarm_delete, alarm.id);

已加上删除确认弹窗,交互如下:

  1. 点击「删除」→ 弹出半透明遮罩 + 居中对话框,提示「确定删除此闹钟?」
  2. 确定(100×60)→ 执行 RemoveAlarm() 并关闭弹窗,列表自动刷新
  3. 取消(100×60)→ 仅关闭弹窗,不删除

细节:

  • 确定/取消/删除三个按钮统一用 ui_alarm_create_action_button(),尺寸均为 100×60 px
  • 按钮文字与备注一样,都用 lcd_display_get_theme_text_font()
  • 弹窗挂在 ui_Alarm 顶层,不会随列表刷新被清掉;刷新列表前会先关闭未确认的弹窗

重新编译烧录后即可测试。

我点击删除,弹窗没有显示出来

排查删除弹窗未显示的原因,先看弹窗创建逻辑和 ui_Alarm 的布局。

/** Close delete-confirm overlay if open. */

void ui_Alarm_close_confirm_dialog(void);

static void ui_alarm_close_confirm_dialog(void)

extern "C" void ui_Alarm_close_confirm_dialog(void)

{

int alarm_id = ui_alarm_pending_delete_id;

ui_alarm_close_confirm_dialog();

ui_Alarm_close_confirm_dialog();

if (alarm_id > 0) {

ui_alarm_close_confirm_dialog();

ui_Alarm_close_confirm_dialog();

ui_alarm_pending_delete_id = alarm_id;

ui_alarm_close_confirm_dialog();

ui_Alarm_close_confirm_dialog();

lv_obj_clean(ui_Alarm_body);

}

if(event_code == LV_EVENT_SCREEN_UNLOADED) {

ui_Alarm_close_confirm_dialog();

}

| ~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~ D:/ESP32P4/HC01/xiaozhi_code/xiaozhi-esp32-2.2.6/main/alarm_ui.cc: In function 'void ui_Alarm_refresh_from_manager()': D:/ESP32P4/HC01/xiaozhi_code/xiaozhi-esp32-2.2.6/main/alarm_ui.cc:314:85: warning: bitwise operation between different enumeration types '<unnamed enum>' and '<unnamed enum>' is deprecated -Wdeprecated-enum-enum-conversion 314 | lv_obj_set_style_text_align(empty_label, LV_TEXT_ALIGN_CENTER, LV_PART_MAIN | LV_STATE_DEFAULT); | ~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~

原因: ui_Alarm 是纵向 flex 布局(顶部 10% + 列表 90%)。弹窗作为第三个子控件参与 flex 排布,高度被压成 0,等于在屏幕外,所以看不到。

修复:

  1. 给弹窗加上 LV_OBJ_FLAG_FLOATING,脱离 flex 布局
  2. 全屏尺寸 + 居中 + lv_obj_move_foreground() 盖在最上层
  3. 离开闹钟页(SCREEN_UNLOADED)时自动关闭弹窗

请重新编译烧录后再点「删除」,应能看到半透明遮罩和「确定删除此闹钟?」对话框。

说明: 请 monitor 使用 xiaozhi-esp32-2.2.6/build/xiaozhi.elf,不要用 mipilcd.elf,否则可能还在跑旧固件

相关推荐
大蓝头1 天前
安装包UI美化之路-nsNiuniuSkin全新UI调试与预览方法
ui·electron·安装包·截图控件·截屏控件
慧都小项1 天前
当边缘AI上产线:QtitanDocking 如何让工业 HMI 实现多视图协同
人工智能·qt·ui·边缘计算·qt6.3
兰亭妙微UI设计公司2 天前
兰亭妙微UI设计公司分享:EQUA 智能健康生态系统 UI/UX 设计深度解析
ui·交互
Cx330❀3 天前
Qt 常用控件属性与底层机制详解:从窗口半透明、浮点数陷阱到 QSS 与焦点策略
qt·ui·图形渲染
Cx330❀3 天前
Qt 常用 UI 控件详解:从QPushButton到QLabel 核心用法解析
qt·ui·图形渲染
传奇开心果编程3 天前
【ArkUI 练中学】第15课:UI 界面设计与实战
学习·ui·华为·harmonyos
HwJack203 天前
【HarmonyOS开发小实践】ArkUI 动画系统属性动画、显式动画与路径动画
ui·性能优化·harmonyos
传奇开心果编程3 天前
【Flutter入门练中学】第2课:布局系统
学习·flutter·ui
传奇开心果编程3 天前
【Jetpack Compose基础语法学与练】第8课 rememberSaveable,页面旋转/系统重建保留状态
android·学习·ui·kotlin·android jetpack
xy34533 天前
Axure 9.0 中继器核心结构
前端·ui·html·axure·原型·产品设计