本页面由葡萄牙语机器翻译,可能存在错误。葡萄牙语版本为准。
如何创建持续脉冲(循环)
目的。 让某个元素无限地脉动/闪烁(“加载中”指示器、发光、按钮的呼吸效果)。LoopAnimation 反复地将一个值从 0 → 1 循环,可带或不带缓动,没有 onComplete(它是无限的——你用 stop() 停止它)。
使用的 API
new LoopAnimation(float duration [, float fps, boolean easeInOut])—— 每个循环持续duration秒并自动重新开始。fps默认 60;easeInOut默认false(线性)。当easeInOut=true时,每个循环应用三次 ease-in-out 缓动。LoopAnimation.onUpdate(Runnable)—— 每帧的回调;读取getValue()(0–1,当前循环的进度)。LoopAnimation.getValue()—— 当前循环的进度。LoopAnimation.start()/stop()—— 启动 / 中断循环。没有onComplete也没有cancel()—— 它本质上是无限的。Component.alpha(float)—— 应用不透明度(用于“呼吸”效果)。Component.repaint()—— 静态方法;在onUpdate中必须调用。
完整示例(复制、粘贴并运行)
package com.exemplo;
import dev.crossfly.ui.*;
import dev.crossfly.ui.layout.*;
import dev.crossfly.ui.animation.*;
/** 可执行的主界面:循环脉动一个「●」;关闭界面时停止循环。 */
public class MainWindow extends Window
{
private LoopAnimation pulse;
@Override
public void onShow() throws Exception
{
super.onShow();
setLayout(new VerticalLayout());
Label dot = new Label("●");
add(dot);
// 1 秒周期,60 fps,带缓动(柔和脉动)
pulse = new LoopAnimation(1f, 60f, true);
pulse.onUpdate(() ->
{
// 值从 0 → 1 并重启;映射到不透明度 0.3 → 1.0
float v = 0.3f + 0.7f * pulse.getValue();
dot.alpha(v);
Component.repaint();
})
.start();
// 结束脉动的按钮(例如加载完成时)
add(new Button("Parar").onAction(e -> pulse.stop()));
}
@Override
public void onRemove()
{
// 离开界面时停止,以免留下孤立循环在屏幕外动画。
if (pulse != null) pulse.stop();
super.onRemove();
}
}
下面的代码片段仅展示核心部分。要运行它,请将其放入上面的
MainWindow骨架中。
最小片段
// 已在源码核实:LoopAnimation(duration, fps, easeInOut);无 onComplete;用 stop() 停止
Label dot = new Label("●");
add(dot);
// 1 秒周期,60 fps,带缓动(柔和脉动)
LoopAnimation pulse = new LoopAnimation(1f, 60f, true);
pulse.onUpdate(() ->
{
// 值从 0 → 1 并重启;映射到不透明度 0.3 → 1.0
float v = 0.3f + 0.7f * pulse.getValue();
dot.alpha(v);
Component.repaint();
})
.start();
// 稍后,用于结束脉动(例如加载完成时):
pulse.stop();
重要注意事项:
- 保留引用(
pulse)以便能够调用stop()。没有stop()的LoopAnimation会永远运行并持续消耗 CPU/GPU(每帧都调用repaint())。 - 离开屏幕时停止它:当
Window关闭时(onRemove/hide)调用pulse.stop(),以免留下一个在屏幕外持续播放动画的孤儿循环。 - 每个循环开始时
getValue()会回到 0。要实现“来回”脉冲(0→1→0),请对getValue()应用三角函数或正弦函数进行映射。
深入了解
这个页面有帮助吗?感谢你的反馈!