如何让millis()实现的定时弹窗消息在屏幕停留更久?
解决消息停留时间过短的问题
我来帮你搞定这个问题!你的代码现在的核心问题是:仅在定时器触发的那一帧绘制文本,也就是每4秒只在一瞬间显示消息,之后因为timer被重置,后续所有帧都不会再绘制内容,导致消息一闪而过,用户完全来不及阅读。
问题根源拆解
你当前的逻辑是:只有当millis() - timer >= 4000时才执行绘制操作,绘制完成后立刻重置timer,这意味着消息只会在每4秒的那个时间点出现一帧,之后就消失了——对于人眼来说,这和“闪一下”没区别。
修复方案
我们需要把内容存储、显示状态控制和绘制逻辑拆分开,让消息能持续显示一段足够用户阅读的时间,具体步骤如下:
新增状态变量:用来记录当前要显示的内容、显示状态和计时
// 存储当前要显示的评论和评分 String currentReview = ""; String currentRating = ""; // 标记是否正在显示消息 boolean isDisplaying = false; // 记录消息开始显示的时间(控制显示时长) long displayTimer = 0; // 消息持续显示的时长(比如设为3000毫秒=3秒,可按需调整) final long DISPLAY_DURATION = 3000; // 原有的消息切换间隔(4秒) long timer = 0; final long SWITCH_INTERVAL = 4000;修改定时器逻辑:只负责更新要显示的内容,以及启动显示计时
// 检查是否到了切换消息的时间 if (millis() - timer >= SWITCH_INTERVAL) { // 匹配对应的评论和评分(用循环替代多个else if,更简洁易扩展) for (int i = 0; i < rev_film1.length; i++) { if (user11.equals(rev_film1[i])) { currentReview = user11; currentRating = rat_film1[i] + " / 10"; break; } } // 启动显示状态,记录开始时间 isDisplaying = true; displayTimer = millis(); // 重置切换定时器 timer = millis(); } // 检查消息是否显示超时,超时则关闭显示 if (isDisplaying && millis() - displayTimer >= DISPLAY_DURATION) { isDisplaying = false; currentReview = ""; currentRating = ""; }独立绘制逻辑:在每帧都会执行的绘制代码里(比如
draw()方法),只要isDisplaying为true就绘制消息// 这部分要放在每帧都会运行的绘制流程里 if (isDisplaying) { app.text(currentReview, 15, 490); app.text(currentRating, 100, 550); }
优化点说明
- 用循环替代了原来的多个
else if,以后新增评论条目时,不用再手动加判断分支,代码扩展性更好。 DISPLAY_DURATION是消息持续显示的时间,你可以根据内容长度调整(比如内容较长就设为5000毫秒=5秒)。- 现在的逻辑是:每4秒触发一次消息更新,然后消息持续显示3秒,之后消失,等待下一个4秒周期再次显示——完美解决了“看不到”的问题。
内容的提问来源于stack exchange,提问作者user3157072
相关产品推荐
相关产品推荐

