使用例 - QMLにおけるアニメーション

Qt Quickにはプロパティをアニメーションさせる機能があります。プロパティをアニメーションさせることで、プロパティの値をすぐに目標値に変更するのではなく、中間値を移動させることができます。アイテムの位置をアニメーションさせるには、アイテムの位置を制御するプロパティ、例えばxとyをアニメーションさせ、アイテムの位置がターゲット位置へ向かう途中でフレームごとに変化するようにします。

流動的なUI

QMLは、流体UIの作成を容易にするように設計されています。これは、UIコンポーネントが突然現れたり、消えたり、ジャンプしたりするのではなく、アニメーションするユーザーインターフェースのことです。Qt Quick では、UI コンポーネントを新しい位置に即座に出現させるのではなく、アニメーションで移動させるための2つの簡単な方法を提供しています。

状態と遷移

Qt Quick では、State オブジェクトでさまざまな UI ステートを宣言できます。これらの状態は、基本状態からのプロパティの変化で構成され、UIロジックを整理するのに便利な方法です。トランジションは、アイテムに関連付けることができるオブジェクトで、ステートの変更によってプロパティが変化したときに、どのようにアニメーションするかを定義します。

アイテムのステートとトランジションは、Item::statesItem::transitions プロパティで宣言できます。状態は、アイテムの状態リストプロパティ(通常はコンポーネントのルートアイテム)の中で宣言されます。同じアイテムに定義されたトランジションは、ステートの変化をアニメートするために使用されます。以下に例を示します。

Item {
    id: container
    width: 320
    height: 120

    Rectangle {
        id: rect
        color: "red"
        width: 120
        height: 120

        TapHandler {
            onTapped: container.state === '' ? container.state = 'other' : container.state = ''
        }
    }
    states: [
        // This adds a second state to the container where the rectangle is farther to the right

        State { name: "other"

            PropertyChanges {
                target: rect
                x: 200
            }
        }
    ]
    transitions: [
        // This adds a transition that defaults to applying to all state changes

        Transition {

            // This applies a default NumberAnimation to any changes a state change makes to x or y properties
            NumberAnimation { properties: "x,y" }
        }
    ]
}

プロパティの変化のアニメーション

ビヘイビアを使用して、プロパティの変更時に使用するアニメーションを指定できます。これは、ソースに関係なく、すべての変更に適用されます。次の例では、ビヘイビアを使用して、ボタンがスクリーン上を動き回る様子をアニメーション化しています。

Item {
    width: 320
    height: 120

    Rectangle {
        color: "green"
        width: 120
        height: 120

        // This is the behavior, and it applies a NumberAnimation to any attempt to set the x property
        Behavior on x {

            NumberAnimation {
                //This specifies how long the animation takes
                duration: 600
                //This selects an easing curve to interpolate with, the default is Easing.Linear
                easing.type: Easing.OutBounce
            }
        }

        TapHandler {
            onTapped: parent.x == 0 ? parent.x = 200 : parent.x = 0
        }
    }
}

その他のアニメーション

すべてのアニメーションが、特定のプロパティまたはステートに結びつけられなくてはならないわけではありません。より一般的なアニメーションを作成し、アニメーションの内部でターゲットとなるアイテムやプロパティを指定することもできます。以下に、さまざまなアニメーションの例を示します:

Item {
    width: 320
    height: 120

    Rectangle {
        color: "blue"
        width: 120
        height: 120

        // By setting this SequentialAnimation on x, it and animations within it will automatically animate
        // the x property of this element
        SequentialAnimation on x {
            id: xAnim
            // Animations on properties start running by default
            running: false
            loops: Animation.Infinite // The animation is set to loop indefinitely
            NumberAnimation { from: 0; to: 200; duration: 500; easing.type: Easing.InOutQuad }
            NumberAnimation { from: 200; to: 0; duration: 500; easing.type: Easing.InOutQuad }
            PauseAnimation { duration: 250 } // This puts a bit of time between the loop
        }

        TapHandler {
            // The animation starts running when you click within the rectangle
            onTapped: xAnim.running = true
        }
    }
}
Item {
    width: 320
    height: 120

    Rectangle {
        id: rectangle
        color: "yellow"
        width: 120
        height: 120

        TapHandler {
            // The animation starts running when you click within the rectangle
            onTapped: anim.running = true;
        }
    }

    // This animation specifically targets the Rectangle's properties to animate
    SequentialAnimation {
        id: anim
        // Animations on their own are not running by default
        // The default number of loops is one, restart the animation to see it again

        NumberAnimation { target: rectangle; property: "x"; from: 0; to: 200; duration: 500 }

        NumberAnimation { target: rectangle; property: "x"; from: 200; to: 0; duration: 500 }
    }
}

アニメーションの詳細については、「Qt Quick の重要な概念 - 状態、遷移、アニメーション」のページを参照してください。

本ドキュメントに含まれる文書の著作権は、それぞれの所有者に帰属します。 本書で提供されるドキュメントは、Free Software Foundation が発行したGNU Free Documentation License version 1.3に基づいてライセンスされています。 Qtおよびそれぞれのロゴは、フィンランドおよびその他の国におけるThe Qt Company Ltd.の 商標です。その他すべての商標は、それぞれの所有者に帰属します。