BlinkState 适合 App 中需要闪烁图标时使用。
App 通过轮询类的 isVisible() 状态,来判断图标当前是否显示。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34
| #include "blink/BlinkState.h"
class CursorApp final : public IApplication { public: CursorApp(PixelUI& ui, void*) : ui_(ui), cursorBlink_(ui, 500U) {}
void onEnter(ExitCallback cb) override { IApplication::onEnter(cb); cursorBlink_.start(); }
void draw() override { if (cursorBlink_.isVisible()) { ui_.getU8G2().drawBox(10, 20, 6, 2); } }
bool handleInput(InputEvent event) override { if (event == InputEvent::BACK) { requestExit(); return true; } return false; }
void onExit() override { cursorBlink_.stop(); }
private: PixelUI& ui_; BlinkState cursorBlink_; };
|
API
start():从可见相位开始闪烁;重复调用不会重启计时。
stop():立即停止并切到不可见状态。
stopWhenVisible():若当前不可见,则在下一次回到可见相位时停止;若已经可见,则立即停止并保持可见。
setInterval(ms):修改切换间隔。运行中调用时,从当前时间重新计时。
isVisible() / isRunning():只读查询当前状态。
interval():返回归一化后的实际间隔。
间隔会限制在 1..INT32_MAX 毫秒。
调度与生命周期
BlinkState 在构造时自动注册到 UiDeadlineScheduler。PixelUI 只在到期且可见性真正翻转时标记 dirty,因此不需要手动 update() 或 continuous draw,tickless 模式也能直接睡到下一次切换。
如果需要连续改变坐标或其他数值,请使用动画系统。BlinkState 只负责离散的显示/隐藏状态。