FrameAnimation QML Type

每次更新动画帧时触发一个处理程序。更多

Import Statement: import QtQuick
Since: Qt 6.4

属性

信号

方法

详细说明

FrameAnimation 可用于在每次动画进行到渲染动画帧时触发一个动作。有关线程和基本渲染循环的详细信息,请参阅场景图文档。

对于一般动画,最好使用NumberAnimation 和其他Animation 元素,因为这些元素提供了描述动画的声明方式。

另一方面,FrameAnimation 应用于自定义的命令式动画和类似的用例:

  • 需要在每一帧更新时运行某些代码时。例如,使用渐进式渲染时,每隔一帧运行一次代码。
  • 当速度/目标在动画过程中发生变化时,普通的 QML 动画可能限制太多。
  • 需要更精确的帧更新时间,例如帧频计数器。

Timer 允许设置interval 时间,而 FrameAnimation 则始终与动画更新同步运行。如果您在使用Timer 时,自定义动画的时间间隔较短,请考虑改用 FrameAnimation,以获得更流畅的动画效果。

// BAD
Timer {
    interval: 16
    repeat: true
    running: true
    onTriggered: {
        // Animate something
    }
}

// GOOD
FrameAnimation {
    running: true
    onTriggered: {
        // Animate something
    }
}

属性文档

currentFrame : int [read-only]

该属性用于保存自开始以来的帧更新次数。重新启动帧动画时,currentFrame 将从0 开始。

下面的示例展示了如何对帧更新做出反应。

FrameAnimation {
    running: true
    onTriggered: {
        // Run code on every frame update.
    }
}

该属性也可用于每隔 n 帧才渲染一次。考虑一种高级用法,即用户界面包含两个重型元素,为了达到流畅的 60fps 总帧率,您决定以 30fps 的帧率渲染这些重型元素,第一个元素每隔偶数帧渲染一次,第二个元素每隔奇数帧渲染一次:

FrameAnimation {
    running: true
    onTriggered: {
        if (currentFrame % 2 == 0)
            updateUIElement1();
        else
            updateUIElement2();
   }
}

默认情况下,frame 为 0。


elapsedTime : real [read-only]

该属性保存自上次启动以来的时间(以秒为单位)。

默认情况下,elapsedTime 为 0。


frameTime : real [read-only]

该属性保存自上一帧更新以来的时间(以秒为单位)。

下面的示例展示了如何使用 frameTime 以不同的速度为项目制作动画,并根据屏幕刷新率和可能出现的帧数下降进行调整。

Rectangle {
    id: rect
    property real speed: 90
    width: 100
    height: 100
    color: "red"
    anchors.centerIn: parent
}

FrameAnimation {
    id: frameAnimation
    running: true
    onTriggered: {
        // Rotate the item speed-degrees / second.
        rect.rotation += rect.speed * frameTime
    }
}

默认情况下,frameTime 为 0。


paused : bool

如果设置为 true,则暂停帧动画;否则恢复帧动画。

paused 默认为 false。

另请参阅 pause() 和resume()。


running : bool

如果设置为 true,则启动帧动画;否则停止帧动画。

running 默认为 false。

另请参阅 stop()、start() 和restart()。


smoothFrameTime : real [read-only]

该属性保存自上一帧更新后的平滑时间(以秒为单位)。

下面的示例展示了如何使用 smoothFrameTime 显示平均帧频。

Text {
    text: "fps: " + frameAnimation.fps.toFixed(0)
}

FrameAnimation {
    id: frameAnimation
    property real fps: smoothFrameTime > 0 ? (1.0 / smoothFrameTime) : 0
    running: true
}

默认情况下,smoothFrameTime 为 0。


信号文档

triggered()

FrameAnimation 跳转到新帧时会发出该信号。

注: 相应的处理程序是onTriggered


方法文档

pause()

暂停帧动画

如果帧动画已暂停或未running ,则调用此方法无效。调用pause() 后,paused 属性将为 true。


reset()

重置帧动画属性

调用此方法可将frameelapsedTime 重置为初始值(0)。该方法对runningpaused 属性没有影响,可以在它们为真或为假时调用。

调用reset()restart() 的区别在于,reset() 将始终初始化这些属性,而restart() 只在下一帧更新时才初始化这些属性,例如,如果restart() 之后紧接着是pause() ,则不会发生这种情况。


restart()

重新启动帧动画

如果FrameAnimation 没有运行,则会启动,否则会停止,重置为初始状态后再启动。调用restart() 后,running 属性将为 true。


resume()

恢复暂停的帧动画

如果帧动画未暂停或未running ,则调用此方法无效。调用resume() 后,paused 属性将变为 false。


start()

启动帧动画

如果帧动画已在运行,则调用此方法无效。调用start() 后,running 属性将变为 true。


stop()

停止帧动画

如果帧动画尚未运行,调用此方法不会产生任何效果。调用stop() 后,runningpaused 属性都将为 false。


© 2025 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.