Анимация и переходы в Qt Quick
Типы анимации и переходов
- Transition - Анимирует переходы во время изменения состояний
- SequentialAnimation - Выполняет анимации последовательно
- ParallelAnimation - Выполняет анимации параллельно
- Behavior - Устанавливает стандартную анимацию для изменений свойств
- PropertyAction - Устанавливает мгновенные изменения свойств во время анимации
- PauseAnimation - Вводит паузу в анимацию
- SmoothedAnimation - Позволяет свойству плавно отслеживать значение
- SpringAnimation - Позволяет свойству отслеживать значение с помощью пружинного движения
- ScriptAction - Выполняет скрипты во время анимации
Типы, анимирующие свойства на основе типов данных
Анимирует изменения значений якорей |
|
Анимирует изменения значений цвета |
|
Анимирует изменения значений типа qreal |
|
Анимирует изменения значений родительских элементов |
|
Анимирует элемент вдоль пути |
|
Анимирует изменения значений свойств |
|
Анимирует изменения значений вращения |
|
Анимирует изменения значений 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. Они предназначены для установки анимаций для различных типов QML, таких как int, color, и вращения. Аналогично, ParentAnimation может анимировать изменения родительских элементов.
Дополнительную информацию о различных свойствах анимации см. в разделе Управление анимацией.
Использование предопределенных целей и свойств
В предыдущем примере для объектов PropertyAnimation и NumberAnimation необходимо было указать конкретные значения цели и свойств для указания объектов и свойств, которые должны быть анимированы. Этого можно избежать, используя синтаксис <Animation> на <Свойство>, который указывает, что анимация должна применяться в качестве источника значения свойства.
Ниже приведены два объекта PropertyAnimation, указанные с использованием этого синтаксиса:
import QtQuick 2.0
Rectangle {
id: rect
width: 100; height: 100
color: "red"
PropertyAnimation on x { to: 100 }
PropertyAnimation on y { to: 100 }
} Анимация запускается сразу же после загрузки прямоугольника и автоматически применяется к его x и y значениям. Поскольку был использован синтаксис <Animation> на <Свойство>, нет необходимости устанавливать значение цели объектов PropertyAnimation на rect, а также не нужно устанавливать значения свойств на x и y.
Это также может использоваться при группировании анимаций, чтобы убедиться, что все анимации в группе применяются к одному и тому же свойству. Например, предыдущий пример может использовать SequentialAnimation для анимации изменения цвета прямоугольника сначала на желтый, затем на синий:
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 указан для свойства color с использованием синтаксиса <Animation> на <Свойство>, его дочерние объекты ColorAnimation также автоматически применяются к этому свойству и не нужно указывать цель или свойство анимации.
Переходы во время изменения состояний
Состояния Qt Quick — это конфигурации свойств, где свойство может иметь разные значения для отражения разных состояний. Изменение состояния вызывает внезапные изменения свойств; анимация сглаживает переходы для создания визуально привлекательных изменений состояний.
Тип Transition может содержать типы анимации для интерполяции изменений свойств, вызванных изменениями состояния. Чтобы назначить переход объекту, привяжите его к свойству transitions.
Кнопка может иметь два состояния: состояние pressed при нажатии пользователем на кнопку и состояние released при отпускании пользователем кнопки. Мы можем задать разные конфигурации свойств для каждого состояния. Переход будет анимировать изменение от состояния 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}
}
]
} Связывание свойств to и from с именем состояния назначит этот конкретный переход для изменения состояния. Для простых или симметричных переходов установка свойства to в символ подстановки «*» означает, что переход применяется к любому изменению состояния.
transitions:
Transition {
to: "*"
ColorAnimation { target: button; duration: 100}
} Стандартная анимация в виде поведений
Стандартные анимации свойств устанавливаются с помощью анимаций поведения. Анимации, объявленные в типах Behavior, применяются к свойству и анимируют любые изменения значения свойства. Однако типы Behavior имеют свойство enabled, чтобы намеренно включить или отключить анимации поведения.
Компонент шара может иметь анимацию поведения, назначенную для его x, y, и color свойств. Анимация поведения может быть настроена для имитации эффекта упругости. В результате эта анимация поведения будет применять эффект упругости к свойствам всякий раз, когда мяч перемещается.
Rectangle {
width: 75; height: 75; radius: width
id: ball
color: "salmon"
Behavior on x {
NumberAnimation {
id: bouncebehavior
easing {
type: Easing.OutElastic
amplitude: 1.0
period: 0.5
}
}
}
Behavior on y {
animation: bouncebehavior
}
Behavior {
ColorAnimation { target: ball; duration: 100 }
}
} Существует несколько способов назначения анимаций поведения свойствам. Объявление Behavior on <property> — удобный способ назначения анимации поведения свойству.
См. примеры Qt Quick — Анимация https://doc.qt.io/qt-5.15/qtquick-animation-example.html для демонстрации анимаций поведения.
Выполнение анимаций параллельно или последовательно
Анимации могут выполняться параллельно или последовательно. Параллельные анимации будут воспроизводить группу анимаций одновременно, а последовательные анимации будут воспроизводить группу анимаций в порядке: одна за другой. Группирование анимаций в SequentialAnimation и ParallelAnimation позволит воспроизводить анимации последовательно или параллельно.
Компонент баннера может иметь несколько значков или слоганов для отображения один за другим. Свойство 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 может иметь разные кривые сглаживания для каждой анимации свойства. Также существуют разные параметры для управления кривой, некоторые из которых уникальны для определённой кривой. Для получения дополнительной информации о кривых сглаживания, посетите документацию по сглаживанию.
Пример сглаживания визуально демонстрирует каждый тип сглаживания.
Другие типы анимации
Кроме того, QML предоставляет несколько других типов, полезных для анимации:
- PauseAnimation: позволяет делать паузы во время анимации
- ScriptAction: позволяет выполнять JavaScript во время анимации и может использоваться вместе с StateChangeScript для повторного использования существующих скриптов
- PropertyAction: изменяет свойство немедленно во время анимации, не анимируя изменение свойства
Это специализированные типы анимации, которые анимируют разные типы свойств
- SmoothedAnimation: специализированная NumberAnimation, которая обеспечивает плавные изменения в анимации при изменении целевого значения
- SpringAnimation: предоставляет анимацию пружины со специализированными атрибутами, такими как масса, демпфирование и эпсилон
- ParentAnimation: используется для анимации изменения родительского элемента (см. ParentChange)
- AnchorAnimation: используется для анимации изменения якоря (см. AnchorChanges)
Использование экземпляров анимации
Использование экземпляров анимации между Переходами или Поведениями не поддерживается и может привести к неопределённому поведению. В следующем примере изменения положения 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 для обоих Поведений. Если повторная анимация довольно сложна, вы также можете создать пользовательский компонент анимации и назначить экземпляр каждому Поведению, например:
// MyNumberAnimation.qml
NumberAnimation { id: anim; duration: 300; easing.type: Easing.InBack } // main.qml
Rectangle {
Behavior on x { MyNumberAnimation {} }
Behavior on y { MyNumberAnimation {} }
} См. также Примеры Qt Quick - Анимация.
© The Qt Company Ltd
Licensed under the GNU Free Documentation License, Version 1.3.
https://doc.qt.io/qt-5.15/qtquick-statesanimations-animations.html