QML顺序动画可避免代码重复

时间:2014-06-18 17:41:52

标签: animation qml bezier qt3d

我在QML中使用Qt3D进行了一些动画制作。 动画的一点是在Bezier曲线之后有一个球从点p0到达点p2,给定一个点p1,我以某种方式计算(与问题无关),这样我得到一个四次贝塞尔曲线。 由于没有BezierAnimation这样的东西,我做的是我有一个Vector3DAnimation形式p0到曲线的0.1点,然后从0.1到02,依此类推,直到0.9到1(这是p2)。

这给了我这个可怕的代码:

SequentialAnimation{
    loops: Animation.Infinite
    Vector3DAnimation{
        from: bezierAt(0)
        to: bezierAt(0.1)
        duration: durationFromSpeed(0,0.1,500)
    }
    Vector3DAnimation{
        from: bezierAt(0.1)
        to: bezierAt(0.2)
        duration: durationFromSpeed(0.1,0.2,500)
    }
    Vector3DAnimation{
        from: bezierAt(0.2)
        to: bezierAt(0.3)
        duration: durationFromSpeed(0.2,0.3,500)
    }
    ....
    Vector3DAnimation{
        from: bezierAt(0.9)
        to: bezierAt(1)
        duration: durationFromSpeed(0.9,1,500)
    }
}

正如您所看到的,代码非常简单,因为我将大部分代码封装在函数中,但是它太重复并且具有非常糟糕的可伸缩性(如果我想要步长为0.01,我会手动编写100个动画)。

所以,我的问题是,有没有办法让这更好?

我尝试使用ScriptAction,如下所示:

SequentialAnimation{
    id: anim
    loops: Animation.Infinite
    property real current:0.0
    function incr() {
        current+=0.1
        current = current > 1? 0.0 : current
    }
    Vector3DAnimation{
       from: bezierAt(anim.current)
       to: bezierAt(anim.current+0.1)
       duration: durationFromSpeed(anim.current,anim.current+0.1,500)
    }
    ScriptAction: {script: incr();}
}

但是,奇怪的是,只有动画的第一部分(即使我检查并正确更改了当前的更改),并且在4或5次迭代后突然停止工作。

这样做有好看的方法吗?我真的希望能够修改这个步骤......

非常感谢

1 个答案:

答案 0 :(得分:0)

我终于成功了。

只需在incr()函数的末尾添加anim.restart(),它现在就可以正常工作。