Qml:动态地向SequentialAnimation添加内容

时间:2014-12-18 13:38:35

标签: qt animation qml

我有一个SequentialAnimation的Qml组件,其中包含PropertyAction组件的静态序列:

SequentialAnimation {
  id: anim
  running: true

  PropertyAction { target: icon; property: "iconid"; value: propStore.anim1 }
  PropertyAction { target: icon; property: "iconid"; value: propStore.anim2 }
  PropertyAction { target: icon; property: "iconid"; value: propStore.anim3 }
}

这可以实现特定图标的动画效果。但是现在我想通过动态构建序列来使它有点动态。原因是propStore不在我的控制之下,用户在动画序列中添加新图像需要我对Qml进行更改:(

我该怎么做呢?

我的第一个想法是动态地将组件添加到anim.animations,但这不起作用(它似乎是SequentialAnimation的只读属性。)

我的下一个想法是向外部组件添加ListModel,并在其Component.onCompleted插槽中添加形状{ image: "animN" }的对象(我使用内省得到“animN”字符串在propStore。)然后我使用ListModel填充Repeater。但是,SequentialAnimation似乎不接受Repeater对象。

1 个答案:

答案 0 :(得分:2)

您无法直接附加到动画动画,但您可以将其重新设置为新值。从anim.animation构建一个JS数组,向其附加一个动态创建的动画,然后将其重新影响到anim.animations。

这是一个简单的例子。

Component
{
    id: component
    SequentialAnimation
    {
        id: seq
        property string color
        PropertyAction {target: rect; property: "color"; value: seq.color}
        PauseAnimation { duration: 500 }
    }
}

function addAnim(color)
{
    var listAnim = []
    for(var i=0; i<anim.animations.length; i++)
        listAnim.push(anim.animations[i])
    var temp = component.createObject(root, {"color":color})
    listAnim.push(temp)
    anim.animations = listAnim
}

    Rectangle
{
    id: rect
    anchors.left: parent.left
    anchors.right: parent.right
    anchors.top: parent.top
    anchors.bottom: row.top
    anchors.margins: 40
    border.width: 1

    SequentialAnimation
    {
        id: anim
    }
}

Row
{
    id: row
    anchors.bottom: parent.bottom
    anchors.bottomMargin: 50
    anchors.horizontalCenter: parent.horizontalCenter
    spacing: 10

    Button {
        text: qsTr("Play")
        onClicked: anim.start()
    }
    Repeater
    {
        model: ["red", "green", "blue", "cyan", "magenta", "yellow"]

        Button {
            text: qsTr("Add %1").arg(modelData[0])
            onClicked: addAnim(modelData)
        }
    }
}