STTSpinner 是持续旋转的圆弧加载/转速指示控件,可固定速度旋转,也可按绑定变量映射转速和方向。
#include "widgets/STTSpinner.h"
using namespace stt;
STTSpinner* spinner = new STTSpinner(getRuntime(), parent, "spinnerMotor");
spinner->setMainArg(
20, 20, 100, 100,
2000, // 每圈毫秒
60, // 指示弧角度
true // 顺时针
);
spinner->setMainStyle(16, 0xdddddd, nullptr);
spinner->setIndicStyle(16, 0x1687d9, nullptr);
setMainStyle 配置背景圆环,背景本身会设为透明;setIndicStyle 配置旋转圆弧并强制圆头。img 是 LVGL 图片源指针,必须保持有效。
void setAnim(
int angle = 60,
int time = 2000,
bool clockwise = true,
int repeat = -1,
int startangle = 0
);
spinner->setAnim(90, 1200, true, -1, 0);
参数:
| 参数 | 说明 |
|---|---|
| angle | 指示弧长度,建议 1..360 |
| time | 转一圈耗时,毫秒 |
| clockwise | true 顺时针,false 逆时针 |
| repeat | -1 无限,0 不重复,大于 0 为重复次数 |
| startangle | 起始角,用于停止后继续 |
setAnim 会先删除该 object 上匹配的动画,再分别启动终点角和起点角两个动画。time、angle 没有范围校验,不要传 0、负数或极端值。
停止和恢复:
int angle = spinner->getCurrentAngle();
spinner->stopAnim();
// 使用停止角继续,减少跳回 0 的视觉突变
spinner->setAnim(60, 2000, true, -1, angle);
GetAnim 返回内部 lv_anim_t 指针,仅用于即时检查,不应缓存或释放;setAnim/stopAnim 后原指针可能失效。
void setValue(int time);
与多数控件不同,STTSpinner 的 value 是“每圈耗时毫秒”,不是速度或业务数值:
spinner->setValue(1000); // 约 1 秒一圈
setValue 会按当前弧长和方向重建无限动画。
void setRanges(int minv, int maxv, int mins, int maxs);
minv/maxv 是变量范围,mins/maxs 是对应速度,单位为圈/10 秒。
spinner->setRanges(-100, 100, -20, 20);
Ivariable speed = getRuntime()->getIVarMgr()->get("MotorSpeed");
if (speed != nullptr) {
spinner->bindData(speed);
}
映射公式:
curS = (value - minV) / (maxV - minV) × (maxS - minS) + minS
每圈耗时(ms) = 10000 / curS
负 curS 表示逆时针,正值顺时针,0 会用 2147483647 ms 模拟近似停止。
实现细节:
| 方法 | 作用 |
|---|---|
| setMainArg | 位置、尺寸并启动动画 |
| setMainStyle | 背景圆环样式 |
| setIndicStyle | 指示圆弧样式 |
| setAnim | 设置弧长、圈时、方向和重复 |
| stopAnim | 停止并记录当前角 |
| GetAnim | 获取临时内部动画指针 |
| getCurrentAngle | 运行时读 current_value,停止后读缓存角 |
| setValue | 把输入当每圈毫秒重启动画 |
| setRanges | 设置变量值到转速的映射 |
| onDataChanged | 应用绑定变量 |