调用原生 LVGL 函数
我们在 UI 构建概述 中提到,dxUi 是 LVGL C 库的一层 JavaScript 封装。虽然 dxUi 简化了许多常用功能,但在开发复杂界面时,您可能需要调用一些未被二次封装的 LVGL 原生函数。
本文将通过一个实例,说明 dxUi 对 LVGL 函数的封装规则,以及如何通过 dxUi 对象调用 LVGL 原生函数。
示例:图像变换
让我们通过一个图像旋转和缩放的例子,来学习如何调用 LVGL 原生函数。
完整代码
import dxui from "../dxmodules/dxUi.js";
import std from "../dxmodules/dxStd.js";
import logger from "../dxmodules/dxLogger.js";
dxui.init({ orientation: 1 });
const screenMain = dxui.View.build("pwdView", dxui.Utils.LAYER.MAIN);
const image1 = dxui.Image.build("image1", screenMain);
image1.source("/app/code/src/logo.png");
image1.setPos(10, 10);
const image2 = dxui.Image.build("image2", screenMain);
image2.source("/app/code/src/logo.png");
image2.setPos(300, 10);
image2.obj.lvImgSetAngle(900); // 900 = 90 degrees
const image3 = dxui.Image.build("image3", screenMain);
image3.source("/app/code/src/logo.png");
image3.setPos(100, 400);
image3.obj.lvImgSetZoom(512); // 256=100%, 512=200%
dxui.loadMain(screenMain);
std.setInterval(() => {
dxui.handler();
}, 10);
运行效果

代码分析
上面的代码在屏幕上创建了三个图像控件:
- image1: 原图,位于左上角。
- image2: 旋转 90 度的图像。
- image3:放大 2 倍的图像。
我们注意到,image2 和 image3 的变换操作是通过 .obj 属性调用的:
image2.obj.lvImgSetAngle(900);
image3.obj.lvImgSetZoom(512);
这正是调用 LVGL 原生函数的方式。接下来我们将详细解释其背后的原理。
dxUi 封装层级
为了兼顾易用性和灵活性,dxUi 提供了两个层级的函数封装。
1. 便捷封装 (High-level Wrappers)
对于最常用的功能(如设置位置、尺寸),dxUi 提供了非常简洁的封装,使其更符合 JavaScript 的开发习惯。
例如,setPos(x, y) 就是一个便捷封装,它最终对应到 LVGL 的 lv_obj_set_pos(obj, x, y) 函数。