LVGL JSON UI Backend Notes
本文档记录 brookesia_gui_lvgl 对 JSON UI resolved model 的实现细节。JSON UI 协议字段本身仍以
gui/brookesia_gui_interface/docs/json_ui 为准;这里仅说明 LVGL backend 如何落地这些字段。
Backend Pump
gui::Runtime::process_backend() 会转发到 LVGL backend 的 timer 处理。独立 examples 或没有系统主循环的场景,可以周期调用该接口驱动 LVGL 动画、事件和内部 timer。
Image .bin
LVGL backend 支持 LVGL v9 image .bin:
RuntimeImageResource.primary_src或imageSet.images[].src可指向.bin。Runtime::register_image(...)在宽高缺失时会通过 backend metadata hook 请求 LVGL backend 读取.binheader 并补全width/height。.bin会在 document load 阶段通过 backend preload hook 读取到内存 descriptor。backend 按 image path 缓存
.bin内容并维护引用计数;同一路径被多个 document 或 global image 引用时只读一次。binding 更新、
set_view_src(...)和 props apply 只复用已预加载 descriptor,不在动态路径补读文件。
构建期 PNG 转 .bin 请看 LVGL Image 打包。
Layout
layout.type 映射:
JSON 值 |
LVGL 行为 |
|---|---|
|
|
|
|
|
|
layout.gridTemplateColumns / layout.gridTemplateRows 中:
Dimension |
LVGL descriptor |
|---|---|
fixed px |
固定 track |
|
|
percent |
|
|
|
当前 backend 没有单独暴露 LVGL track cross place 参数,crossAlign 会同时用于 cross place 和 track cross place。
Placement
placement 映射:
字段 / 模式 |
LVGL 行为 |
|---|---|
|
|
|
|
|
|
|
|
|
在尺寸应用后按 fit 短边语义二次修正外框 |
|
|
|
|
grid child fields |
|
out* placement align 需要 relativeTo,因为 LVGL 父对象对齐本身没有 outside anchor。
Image sizing:
Placement 尺寸 |
LVGL backend 行为 |
|---|---|
未固定 |
使用 image asset 宽高设置对象尺寸,并使用原始图片比例 |
同时固定 |
使用固定外框;图片内容由 |
使用 percent / |
保留显式外框尺寸;不会被 image asset 宽高覆盖 |
Props
commonProps
scrollable = true:添加LV_OBJ_FLAG_SCROLLABLE,scrollbar mode 设为AUTO。scrollable = false:移除LV_OBJ_FLAG_SCROLLABLE,scrollbar mode 设为OFF。pressLock = true:添加LV_OBJ_FLAG_PRESS_LOCK,按住后滑出节点范围时继续锁定当前 pressed target。pressLock = false:移除LV_OBJ_FLAG_PRESS_LOCK,按住滑出范围时允许 LVGL 重新命中目标并触发pressLost。pivotX/pivotY百分比值在应用 transform 前会刷新一次对象 layout,避免早期尺寸未更新时按(0, 0)计算 pivot。
imageProps.innerAlign
JSON 值 |
LVGL align |
|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
imageProps.recolor
recolor = "#RRGGBB":调用lv_obj_set_style_image_recolor()。recolorOpacity = 0..255:调用lv_obj_set_style_image_recolor_opa()。recolor = "":移除 image 节点本地 image recolor 属性,回退到 style/theme 层效果。
style.imageRecolor
imageRecolor = "#RRGGBB":调用lv_style_set_image_recolor()。imageRecolorOpacity = 0..255:调用lv_style_set_image_recolor_opa()。imageRecolor = ""或未设置:移除 style 层 image recolor 属性。
keyboardProps.mode
JSON 值 |
LVGL mode |
|---|---|
|
|
|
|
|
|
|
|
JSON UI parser/validator 会拒绝未知 mode;backend 收到异常 mode 时会保持当前可用布局。
keyboardProps.targetTextInput / layouts
targetTextInput 会在同一 document 内解析为目标 textInput。Backend 不把目标交给 LVGL 默认 keyboard
handler,而是缓存目标对象并在 LV_EVENT_VALUE_CHANGED 中按 JSON key role 手动写入,避免控制键显示文本或
图片资源 id 被当作普通字符插入。
keyboardProps.layouts 会被转换为 LVGL keyboard map:
text、upper、number、special四种 layout 分别绑定到对应 LVGL keyboard mode。字符串 key 直接作为按键文本。
role=mode的 key 使用mode字段切换 layout;目标 mode 不在allowedModes时会按 disabled 样式绘制并忽略点击。带
role且没有text的 key 会映射到 LVGL symbol 或控制键,例如backspace、left、right、space、ok、cancel。带
role且设置了text的 key 使用text作为 fallback 显示,role仍决定行为。带
image的 key 会在LV_EVENT_DRAW_TASK_ADDED中隐藏 label 并居中绘制已注册 image resource;keyboardProps.iconSize控制目标图标尺寸,不创建 per-key 子对象。width映射到lv_keyboard_set_ctrl_map()的相对宽度,范围由 JSON UI parser/validator 保证。keyStyles通过 draw-task hook 修改LV_PART_ITEMS的 fill/label 颜色,支持普通、控制、模式、确认/取消和 disabled 类。
canvasProps.commands
当前 LVGL backend 支持:
|
行为 |
|---|---|
|
用 |
|
在 |
width / height 字段会被 parser 接收,但当前 LVGL canvas command 执行未使用。
Style
LVGL backend 在 style apply 时维护每个节点的 lv_style_t,并按 dirty mask 更新相关字段。典型映射:
JSON style 字段 |
LVGL 操作 |
|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
字体解析优先级:
ResolvedFontSpec.native_fonts中最接近请求字号的 native LVGL font。JSON/backend 字体资源的
primary_src,并按 fallback 链创建 FreeType 字体。内置字体;FreeType 不可用或文件不可用时回退。
Animations
动画通过 LVGL anim 执行。主要 property 映射:
Property |
LVGL 操作 |
|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
Easing 映射:
JSON 值 |
LVGL path |
|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|