STTImage 封装 LVGL Image,支持文件图片、偏移、旋转、缩放、状态图片、变量驱动和缓存失效。
#include "widgets/STTImage.h"
using namespace stt;
STTImage* image = new STTImage(getRuntime(), parent, "imgStatus");
image->setMainArg(20, 20, 128, 128, "res/pump_off.png");
setMainArg 会设置位置、尺寸、可点击标志、图片源,并把背景设为透明。头文件提示不同显示尺寸不要复用同一个图片文件,应按资源生成规则为不同尺寸准备文件。
image->setSrc("res/pump_on.png");
const void* src = image->getSrc();
setSrc 优化了相同文件路径重复刷新:当前源已是相同文件时直接返回,避免重复磁盘读取和图片解码。空字符串会清除当前图片。
image->setOffsetX(12)->setOffsetY(8);
int x = image->getOffsetX();
int y = image->getOffsetY();
偏移使用 LVGL 图片环绕规则,超出边界的部分从另一端继续绘制,适合滚动纹理。
image->setPivot(64, 64);
image->setAngle(45.0f);
image->rotate(15.0f); // 当前 45 度基础上再转 15 度
float angle = image->getAngle();
LvPoint pivot = image->getPivot();
内部以 0.1 度单位存储,setAngle 将浮点乘 10 后转为整数。接口自身不把角度限制在 0..360,连续 rotate 的最终归一化由 LVGL 处理。
image->setZoom(1.5f);
float zoom = image->getZoom();
setZoom 使用 factor = zoom × 256。头文件给出范围 1/256..256,但当前实现没有校验。
已知误差:getZoom 使用底层值除以 250.0,而不是 256.0。因此 setZoom(1.0) 后可能读到约 1.024。不要用 getZoom 做精确等值判断;需要精确业务值时由调用方自行保存。
image->addStateImg("0", "res/pump_off.png");
image->addStateImg("1", "res/pump_on.png");
image->setState("1");
addStateImg 只登记映射,并把 curState 改为该 state,不会立即显示图片。调用 setState 或 refresh 后才会解析并显示。
状态键还支持含问号的表达式模板。实现会把键中的 ? 替换为当前 state,再交给 Util::simpleCalc:
image->addStateImg("? > 80", "res/high.png");
image->addStateImg("? <= 80", "res/normal.png");
image->setState("95");
匹配按 std::map 的键排序顺序遍历,不是 addStateImg 的插入顺序。多个条件同时成立时使用第一个排序命中的键。未匹配任何状态时清空图片。
状态文本来自外部变量时会进入简单表达式字符串,必须只使用受信的数字/表达式格式。
Ivariable state = getRuntime()->getIVarMgr()->get("PumpState");
if (state != nullptr) {
image->bindData(state);
}
onDataChanged 用变量 toStr() 调用 setState。refresh 会先按绑定变量或 curState 刷新图片,再刷新动画、显隐、闪烁、权限和使能 helper。
STTImage::cacheInvalidateSrc((void*)"res/pump_on.png");
STTImage::cacheInvalidateSrc(nullptr); // 清空全部 LVGL 图片缓存
仅当同一路径的文件内容已经被替换、确实需要重新解码时调用。传 nullptr 清空全部缓存可能导致下一次页面显示集中发生磁盘 I/O,不要在普通 refresh 中调用。
| 类别 | 方法 |
|---|---|
| 初始化 | setMainArg |
| 图片源 | setSrc、getSrc、cacheInvalidateSrc |
| 状态 | addStateImg、setState |
| 偏移 | setOffsetX/Y、getOffsetX/Y |
| 变换 | setAngle、rotate、getAngle、setPivot、getPivot、setZoom、getZoom |
| 刷新 | refresh、onDataChanged |