UI设计工具文档UI设计工具文档
反馈
  • AC791
  • AC792
  • AC63
  • GPMCU
  • AD14/15/17/18/AD104
  • AD16
  • AD24
  • AC82
  • AW30
  • AW31
反馈
  • AC791
  • AC792
  • AC63
  • GPMCU
  • AD14/15/17/18/AD104
  • AD16
  • AD24
  • AC82
  • AW30
  • AW31
  • 1.工具前言

    • 1.1.工具首页
    • 1.2.前言说明
  • 2.快速使用

    • 2.1.快速使用
    • 2.2.快速上手
    • 2.3.板子配置
    • 2.4.视频教程
    • 2.5.硬件资料
  • 3.控件说明

    • 3.1.控件说明
    • 3.2.基础控件

      • 页面
      • 按钮
      • 图片按钮
      • 标签
      • 图片
      • 文本框
      • 开关
      • 数字微调器
      • 复选框
      • 下拉框
      • 进度条
      • Lottie动画
      • 帧动画
      • 图表
      • 滑动条
      • 弧线
      • 仪表盘
    • 3.3.菜单控件

      • 圆弧菜单
      • 齿轮菜单
      • 列表菜单
      • 曲线菜单
      • 网格菜单
      • 万花筒菜单
      • 多边形菜单
    • 3.4.容器控件

      • 通用容器
      • Flex布局
  • 4.高级功能

    • 4.1.时间轴动画
    • 4.2.模型绑定
    • 4.3.资源管理
    • 4.4.国际化
    • 4.5.硬件仿真
    • 4.6.自动化测试
    • 4.7.控件组
    • 4.8.菜单管理
    • 4.9.页面管理
    • 4.10.动态页面
  • 5.插件系统

    • 5.1.插件说明
    • 5.2.开发指南
    • 5.3.字体合并
    • 5.4.图片编辑
    • 5.5.截图
    • 5.6.项目合并
    • 5.7.项目属性编辑
    • 5.8.视频转图片
  • 6.使用案例

    • 6.1.倒计时案例
  • 7.常见问题

    • 7.1.问题说明
    • 7.2.编译问题
    • 7.3.LVGL问题
    • 7.4.仿真问题
    • 7.5.UI工具问题
    • 7.6.其他问题
  • 8.工具杂项

    • 8.1.杂项1
    • 8.2.杂项2

仿真问题

本章目录
  • 1. 图片控件设置了图片,但是编译仿真后没有显示图片
  • 2. 如何区分是键盘还是鼠标触发的 Click 事件
  • 3. 仿真程序启用性能/内存监控
  • 4. 打包资源时,出现 Unable to load image file 错误
  • 5. 仿真出现闪退现象,例如新添菜单后点击菜单时仿真闪退
  • 6. 控件使用 bmp 图片资源,图片不显示
  • 7. 控件使用 16 位深的 bmp 图片资源,图片显示异常
  • 8. 顶层页面 Gesture 事件无法触发
  • 9. 使用字库中新添加的字体时,仿真出现字体不一致、乱码
本章正文

图片控件设置了图片,但是编译仿真后没有显示图片

  • 原因:没有设置图片路径,或者图片文件不存在。
  • 解决方案:通过检查生成代码,检查图片路径是否正确,图片文件是否存在,是否需要先打包工程,再编译仿真。

下面这种情况,工程设置了图片路径,但是因为将静态图片的压缩方式设置为 Bin ,在编译前,没有先进行打包,导致图片文件没有正常生成,所以图片文件不存在无法正常显示。

提示

当设置静态图片的压缩方式设置为 Bin 时,如果对控件图片进行了修改,或者在 编译资源管理 中进行了图片资源的增删,需要先进行打包,再编译仿真。

如何区分是键盘还是鼠标触发的 Click 事件

  • 解决方法:通过判断事件参数,来区分是键盘还是鼠标触发的 Click 事件。
lv_indev_t * act_indev = lv_indev_get_act();
lv_indev_t * event_indev = (lv_indev_t *)lv_event_get_param(e);
if (act_indev && act_indev == event_indev) {
	lv_indev_type_t type = lv_indev_get_type(act_indev);
	if (type == LV_INDEV_TYPE_ENCODER) {
		LV_LOG_WARN("encoder click");
	} else if (type == LV_INDEV_TYPE_KEYPAD) {
		LV_LOG_WARN("keypad click");
	} else if (type == LV_INDEV_TYPE_BUTTON) {
		LV_LOG_WARN("button click");
	} else if (type == LV_INDEV_TYPE_POINTER) {
		LV_LOG_WARN("pointer click");
	}
}

仿真程序启用性能/内存监控

  • 解决方法:在 项目 -> 项目属性 -> 仿真配置 中启用 实时性能监控、实时内存监控。

提示

  • 启用 实时性能监控、实时内存监控 本质上,是启用 LV_USE_PERF_MONITOR 和 LV_USE_MEM_MONITOR。如果在设备内核上需要启用,可以在SDK中启用这两个宏定义。
  • 在某些仿真内核里,可能启用了 LV_USE_PERF_MONITOR,但是仿真程序还是没有内存监控的label,这可能内核启用了 LV_MEM_CUSTOM 所导致的,说明这时候内核是使用自定义的内存管理,lvgl无法监控内存使用情况。
// lvgl\src\core\lv_refr.c
#if LV_USE_MEM_MONITOR && LV_MEM_CUSTOM == 0 && LV_USE_LABEL
    lv_obj_t * mem_label = mem_monitor.mem_label;
    if(mem_label == NULL) {
        mem_label = lv_label_create(lv_layer_sys());
        lv_obj_set_style_bg_opa(mem_label, LV_OPA_50, 0);
        lv_obj_set_style_bg_color(mem_label, lv_color_black(), 0);
        lv_obj_set_style_text_color(mem_label, lv_color_white(), 0);
        lv_obj_set_style_pad_top(mem_label, 3, 0);
        lv_obj_set_style_pad_bottom(mem_label, 3, 0);
        lv_obj_set_style_pad_left(mem_label, 3, 0);
        lv_obj_set_style_pad_right(mem_label, 3, 0);
        lv_label_set_text(mem_label, "?");
        lv_obj_align(mem_label, LV_USE_MEM_MONITOR_POS, 0, 0);
        mem_monitor.mem_label = mem_label;
    }

    if(lv_tick_elaps(mem_monitor.mem_last_time) > 300) {
        mem_monitor.mem_last_time = lv_tick_get();
        lv_mem_monitor_t mon;
        lv_mem_monitor(&mon);
        uint32_t used_size = mon.total_size - mon.free_size;;
        uint32_t used_kb = used_size / 1024;
        uint32_t used_kb_tenth = (used_size - (used_kb * 1024)) / 102;
        lv_label_set_text_fmt(mem_label,
                              "%"LV_PRIu32 ".%"LV_PRIu32 " kB used (%d %%)\n"
                              "%d%% frag.",
                              used_kb, used_kb_tenth, mon.used_pct,
                              mon.frag_pct);
    }
#endif

打包资源时,出现 Unable to load image file 错误

  • 原因:图片资源数据异常,转换工具无法正常加载图片资源文件。
  • 解决方法:尝试将图片资源文件转换为其他格式,如 png、jpg 等。如果是bmp,可以在 https://online-converting.com/image/convert2bmp/# 网站上,将图片资源文件重新转换为 bmp 格式尝试下。

仿真出现闪退现象,例如新添菜单后点击菜单时仿真闪退

  • 解决方法:先打包同步资源,再仿真

控件使用 bmp 图片资源,图片不显示

  • 原因:在使用 bmp 图片资源时,如果当前的 色彩深度 为 16 位,那么 bmp 图片资源的 色彩深度 必须为 16 位。同理,如果当前的 色彩深度 为 32 位,那么 bmp 图片资源的 色彩深度 必须为 32 / 24 位。
  • 解决方法:将 bmp 图片资源的 色彩深度 设置为与当前 色彩深度 一致。
  • 注意:如果不是使用 原图 的方式,在打包时会自动压缩图片资源,所以在设备上可以忽略这个问题,但只是会在仿真时显示不出来。

控件使用 16 位深的 bmp 图片资源,图片显示异常

  • 原因:在使用 16 位深的 bmp 图片资源时,如果图片不是 RGB565 格式,那么在显示时会出现异常。
  • 解决方法:将 bmp 图片资源的 色彩格式 设置为 RGB565 格式。

顶层页面 Gesture 事件无法触发

  • 原因:顶层页面是在 lv_layer_top() 作为父控件创建的,而页面的 LV_OBJ_FLAG_GESTURE_BUBBLE 标识默认为true,所以 Gesture 事件会发送给 lv_layer_top()。
  • 解决方法:在创建顶层页面时,页面启用 清理标识 ,将 LV_OBJ_FLAG_GESTURE_BUBBLE 标识清除掉,这样 Gesture 事件就会发送给顶层页面了。

使用字库中新添加的字体时,仿真出现字体不一致、乱码

  • 原因:新添加的字体的字体大小与控件文本设置的字体大小不一致
  • 解决方法:更改字体大小
上一页
7.3.LVGL问题
下一页
7.5.UI工具问题