BlinkState / 离散闪烁状态

BlinkState 表达“可见 / 不可见”两个离散状态。应用在绘制时只查询 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 毫秒。这样既排除零间隔,也让基于 32 位无符号时间戳的 deadline 比较在回绕前后保持明确。

调度与生命周期

BlinkState 在构造时自动注册到 UiDeadlineScheduler。PixelUI 只在到期且可见性真正翻转时标记 dirty,因此不需要手动 update() 或 continuous draw,tickless 模式也能直接睡到下一次切换。

对象析构时会自动从调度器注销,不需要手工 unregister。因为它内部引用所属的 PixelUIBlinkState 不能比该 PixelUI 活得更久;把它作为 App 或 Widget 的成员通常最自然。

如果需要连续改变坐标或其他数值,请使用动画系统。BlinkState 只负责离散的显示/隐藏状态。

最新文章
网站信息
文章数目 :
1
本站访客数 :
本站总浏览量 :
最后更新时间 :