在 QML 中控制动画时间(擦洗)

Posted

技术标签:

【中文标题】在 QML 中控制动画时间(擦洗)【英文标题】:Control animation time (scrubbing) in QML 【发布时间】:2016-03-30 23:03:17 【问题描述】:

我有一个 Qt 5.6 NumberAnimation(实际上很多)。我想明确控制它们的评估时间。例如,假设这是一个动画程序,用户创建了动画曲线,现在正沿着时间线来回“擦洗”播放头。每当我获得新的播放头时间时,我都想评估所有动画以生成适合该时间的值。

从 Qt 文档来看,这看起来是不可能的。从Animation 继承的成员允许我对动画进行start()pause()resume(),从开头到restart() 或从complete() 到结尾。但是我没有看到允许我控制时间的方法或属性。但是,我(通过示例)发现了许多可能的 QML 功能,但没有明显记录。 NumberAnimation 可以做到这一点吗?

如果NumberAnimation 无法做到这一点,还有其他方法吗?以某种方式来表示动画的任意 2D 路径,然后评估沿该路径在给定 X 坐标处的 Y 交点?

【问题讨论】:

Numberanimation 继承了 PropertyAnimation 的“duration”,你试过了吗? @FrankOsterfeld 谢谢你的建议,但不,我没有尝试过。 duration property 控制动画的总长度(从开始运行到结束需要多长时间)。它不允许我通过动画将时间跳到 95%,然后是 94%,然后是 90%,然后是 25%,然后是 75%,等等。 【参考方案1】:

正如通过posting on the Qt Forums 发现的那样,解决方案是使用AnimationController 来引用和控制动画,设置progress 属性(在[0,1] 范围内标准化)来控制动画时间。

要从单个 AnimationController 一次控制多个动画,请将动画包装在 ParallelAnimation 中:

AnimationController 
  id: controller
  animation: ParallelAnimation 
    id: anim
    NumberAnimation  ... 
    NumberAnimation  ... 
    SequentialAnimation 
      NumberAnimation  ... 
      NumberAnimation  ... 
    
  

【讨论】:

以上是关于在 QML 中控制动画时间(擦洗)的主要内容,如果未能解决你的问题,请参考以下文章

iOS 中有没有办法在 UIView 中录制动画绘图?

QML实现Gstreamer投屏 投屏画面遮挡

使用 Scenekit 场景时间在 iOS 中擦洗动画

如何模仿 iPod 剩余时间和播放时间擦洗标签

使用 AirPlay 时在 AVPlayerDemo 中限制 UISlider 擦洗

Qt (QML) 虚线圆