Qt Quickのアニメーションとトランジション

アニメーションとトランジションの種類

  • Transition - 状態遷移のアニメーション
  • SequentialAnimation - アニメーションを順次実行する
  • ParallelAnimation - アニメーションを並列に実行する
  • Behavior - プロパティ変更のデフォルトアニメーションを指定する
  • PropertyAction - アニメーション中のプロパティの即時変更を設定する
  • PauseAnimation - アニメーションに一時停止を導入する
  • SmoothedAnimation - プロパティが値をスムーズに追跡できるようにする
  • SpringAnimation - プロパティがバネのような動きで値を追跡できるようにする
  • ScriptAction - アニメーション中にスクリプトを実行する

データ型に基づいてプロパティをアニメーション化するタイプ

AnchorAnimation

アンカー値の変化をアニメーション化する

ColorAnimation

色値の変化をアニメーション化する

NumberAnimation

qreal型の値の変化をアニメーション化する

ParentAnimation

親の値の変化をアニメーション化する

PathAnimation

パスに沿って項目をアニメーション化する

PropertyAnimation

プロパティ値の変化をアニメーション化する

RotationAnimation

回転値の変化をアニメーション化する

Vector3dAnimation

QVector3d の値の変化をアニメーション化する

アニメーションは、プロパティ値にアニメーションタイプを適用することで作成されます。アニメーション・タイプは、スムーズな遷移を作成するためにプロパティ値を補間する。また、状態遷移では、状態変化にアニメーションを割り当てることができる。

アニメーションを作成するには、アニメーション化するプロパティのタイプに適したアニメーション・タイプを使用し、必要な動作のタイプに応じてアニメーションを適用します。

アニメーションのトリガー

オブジェクトにアニメーションを設定するには、いくつかの方法があります。

プロパティの直接アニメーション

アニメーションは、プロパティの値にアニメーションオブジェクトを適用することによって作成されます。これらのプロパティ・アニメーションは、プロパティ値の変化の間に値を補間することで、滑らかな動きを適用します。プロパティ・アニメーションは、タイミング・コントロールを提供し、イージング・カーブによってさまざまな補間を可能にします。

Rectangle {
    id: flashingblob
    width: 75; height: 75
    color: "blue"
    opacity: 1.0

    MouseArea {
        anchors.fill: parent
        onClicked: {
            animateColor.start()
            animateOpacity.start()
        }
    }

    PropertyAnimation {id: animateColor; target: flashingblob; properties: "color"; to: "green"; duration: 100}

    NumberAnimation {
        id: animateOpacity
        target: flashingblob
        properties: "opacity"
        from: 0.99
        to: 1.0
        loops: Animation.Infinite
        easing {type: Easing.OutBack; overshoot: 500}
   }
}

特殊なプロパティ・アニメーション・タイプは、PropertyAnimation タイプよりも効率的な実装を持っています。これらはintcolor 、rotationのような異なるQMLタイプにアニメーションを設定するためのものです。同様に、ParentAnimation は親の変更をアニメーション化することができます。

様々なアニメーション・プロパティについてのより詳しい情報は、アニメーションの制御を参照してください。

定義済みのターゲットとプロパティを使う

前の例では、PropertyAnimationNumberAnimation オブジェクトは、アニメートされるべきオブジェクトとプロパティを指定するために、特定のtargetproperties 値を指定する必要がありました。これは、<Animation> on <Property>構文を使用することで回避することができます。

以下は、この構文を使って指定された2つのPropertyAnimation オブジェクトです:

import QtQuick 2.0

Rectangle {
    id: rect
    width: 100; height: 100
    color: "red"

    PropertyAnimation on x { to: 100 }
    PropertyAnimation on y { to: 100 }
}

アニメーションは、矩形がロードされるとすぐに開始され、xy の値に自動的に適用されます。<Animation> on <Property>構文が使われているので、PropertyAnimation オブジェクトのtarget の値をrect に設定する必要はなく、property の値をxy に設定する必要もありません。

これは、グループ化されたアニメーションでも使用でき、グループ内のすべてのアニメーションが同じプロパティに適用されるようにすることができます。たとえば、前述の例では、SequentialAnimation を使用して、矩形のcolor をまず黄色に、次に青色にアニメーションさせることができます:

import QtQuick 2.0

Rectangle {
    width: 100; height: 100
    color: "red"

    SequentialAnimation on color {
        ColorAnimation { to: "yellow"; duration: 1000 }
        ColorAnimation { to: "blue"; duration: 1000 }
    }
}

SequentialAnimation オブジェクトは、<Animation> on <Property>構文を使用してcolor プロパティに指定されているので、その子ColorAnimation オブジェクトも自動的にこのプロパティに適用され、target またはproperty アニメーション値を指定する必要はありません。

状態遷移時のトランジション

Qt Quick States は、異なる状態を反映するためにプロパティが異なる値を持つ可能性があるプロパティ構成です。状態変化は、突然のプロパティ変更をもたらします。アニメーションは、視覚的に魅力的な状態変化を作り出すために、遷移を滑らかにします。

Transition タイプには、状態変化によるプロパティの変化を補間するアニメーション・タイプを含めることができます。遷移をオブジェクトに割り当てるには、transitions プロパティにバインドします。

ボタンには、ユーザーがボタンをクリックしたときの状態(pressed )と、ユーザーがボタンを離したときの状態(released )の2つの状態があります。それぞれの状態に対して、異なるプロパティ設定を割り当てることができます。トランジションは、pressed 状態からreleased 状態への変化をアニメーション化します。同様に、released 状態からpressed 状態への変化中にもアニメーションが発生します。

Rectangle {
    width: 75; height: 75
    id: button
    state: "RELEASED"

    MouseArea {
        anchors.fill: parent
        onPressed: button.state = "PRESSED"
        onReleased: button.state = "RELEASED"
    }

    states: [
        State {
            name: "PRESSED"
            PropertyChanges { target: button; color: "lightblue"}
        },
        State {
            name: "RELEASED"
            PropertyChanges { target: button; color: "lightsteelblue"}
        }
    ]

    transitions: [
        Transition {
            from: "PRESSED"
            to: "RELEASED"
            ColorAnimation { target: button; duration: 100}
        },
        Transition {
            from: "RELEASED"
            to: "PRESSED"
            ColorAnimation { target: button; duration: 100}
        }
    ]
}

tofrom プロパティをステートの名前にバインドすると、その特定のトランジションがステートの変化に割り当てられます。単純なトランジションや対称的なトランジションの場合、to プロパティにワイルドカードシンボル "*" を設定すると、トランジションがどの状態変化にも適用されることを示します。

    transitions:
        Transition {
            to: "*"
            ColorAnimation { target: button; duration: 100}
        }

ビヘイビアとしてのデフォルトアニメーション

デフォルト・プロパティのアニメーションは、ビヘイビア・アニメーションを使って設定します。Behavior タイプで宣言されたアニメーションはプロパティに適用され、プロパティの値が変更されるとアニメーションします。しかし、ビヘイビアタイプには、ビヘイビアアニメーションを意図的に有効または無効にするためのenabled プロパティがあります。

ボール・コンポーネントには、xycolor プロパティにビヘイビア・アニメーションが割り当てられている場合があります。このビヘイビア・アニメーションは、弾性効果をシミュレートするように設定できます。実際、このビヘイビア・アニメーションは、ボールが動くたびにプロパティに弾性効果を適用します。

Rectangle {
    width: 75; height: 75; radius: width
    id: ball
    color: "salmon"

    component BounceAnimation : NumberAnimation {
       easing {
          type: Easing.OutElastic
          amplitude: 1.0
          period: 0.5
       }
    }

    Behavior on x {
        BounceAnimation {}
    }
    Behavior on y {
        BounceAnimation {}
    }
    Behavior on color {
        ColorAnimation { target: ball; duration: 100 }
    }
}

ビヘイビア・アニメーションをプロパティに割り当てるには、いくつかの方法がある。Behavior on <property> 宣言は、ビヘイビア・アニメーションをプロパティに割り当てる便利な方法です。

ビヘイビア・アニメーションのデモはQt Quick Examples - Animationを参照してください。

アニメーションの並列再生と連続再生

アニメーションは並列またはシーケンスで実行することができます。並列アニメーションは複数のアニメーションを同時に再生し、連続アニメーションは複数のアニメーションを順番に再生します。SequentialAnimationParallelAnimation でアニメーションをグループ化すると、アニメーショ ンは順番に、または並行して再生されます。

バナー・コンポーネントには、複数のアイコンやスローガンを表示することができます。opacity プロパティは、不透明オブジェクトを示す1.0 に変換できます。SequentialAnimation タイプを使用すると、不透明アニメーションは先行するアニメーションが終了した後に再生されます。ParallelAnimation タイプでは、アニメーションは同時に再生されます。

Rectangle {
    id: banner
    width: 150; height: 100; border.color: "black"

    Column {
        anchors.centerIn: parent
        Text {
            id: code
            text: "Code less."
            opacity: 0.01
        }
        Text {
            id: create
            text: "Create more."
            opacity: 0.01
        }
        Text {
            id: deploy
            text: "Deploy everywhere."
            opacity: 0.01
        }
    }

    MouseArea {
        anchors.fill: parent
        onPressed: playbanner.start()
    }

    SequentialAnimation {
        id: playbanner
        running: false
        NumberAnimation { target: code; property: "opacity"; to: 1.0; duration: 200}
        NumberAnimation { target: create; property: "opacity"; to: 1.0; duration: 200}
        NumberAnimation { target: deploy; property: "opacity"; to: 1.0; duration: 200}
    }
}

いったん個々のアニメーションがSequentialAnimation またはParallelAnimation に配置されると、もはや独立して開始したり停止したりすることはできません。シーケンシャルまたはパラレル・アニメーションは、グループとして開始・停止する必要があります。

アニメーションはトランジション内で並列に再生されるため、SequentialAnimationトランジションアニメーションを再生するのにも便利です。

アニメーションの制御

アニメーションを制御するには、さまざまな方法があります。

アニメーションの再生

すべてのアニメーション・タイプはAnimation タイプを継承しています。Animation オブジェクトを作成することはできません。代わりに、このタイプはアニメーション・タイプに不可欠なプロパティとメソッドを提供します。アニメーション・タイプには、start()stop()resume()pause()restart()complete() があります。これらのメソッドはすべて、アニメーションの実行を制御します。

イージング

イージング・カーブは、アニメーションが開始値と終了値の間をどのように補間するかを定義します。異なるイージングカーブは、定義された補間範囲を超えるかもしれません。イージングカーブは、バウンスエフェクト、加速、減速、周期的アニメーションなどのアニメーションエフェクトの作成を簡素化します。

QMLオブジェクトは、それぞれのプロパティのアニメーションに対して、異なるイージングカーブを持つことができます。また、イージングカーブを制御するための様々なパラメータがあり、中には特定のカーブ専用のパラメータもあります。イージングカーブの詳細については、easing

イージングの例では、それぞれのイージングタイプを視覚的に示しています。

その他のアニメーションタイプ

さらに、QMLにはアニメーションに有用な型がいくつか用意されています:

  • PauseAnimationアニメーション中の一時停止を可能にする
  • ScriptActionアニメーション中にJavaScriptを実行することができます。StateChangeScript と併用することで、既存のスクリプトを再利用することができます。
  • PropertyActionアニメーション中にプロパティを即座に変更する。

これらは、異なるプロパティタイプをアニメーション化する特殊なアニメーションタイプです。

アニメーションインスタンスの共有

トランジションやビヘイビア間でアニメーションインスタンスを共有することはサポートされていません。以下の例では、Rectangleの位置の変更は正しくアニメーションされない可能性が高いです。

Rectangle {
    // NOT SUPPORTED: this will not work correctly as both Behaviors
    // try to control a single animation instance
    NumberAnimation { id: anim; duration: 300; easing.type: Easing.InBack }
    Behavior on x { animation: anim }
    Behavior on y { animation: anim }
}

最も簡単な修正方法は、両方のビヘイビアでNumberAnimation を繰り返すことです。繰り返されるアニメーションがかなり複雑な場合は、カスタムアニメーションコンポーネントを作成して、それぞれのBehaviorにインスタンスを割り当てるなどの方法も考えられます:

Rectangle {
    component MyNumberAnimation : NumberAnimation {
        duration: 300; easing.type: Easing.InBack
    }
    Behavior on x { MyNumberAnimation {} }
    Behavior on y { MyNumberAnimation {} }
}

Qt Quick Examples - Animation」も参照して ください。

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