QML — мощный декларативный язык, входящий в состав Qt, позволяет создавать гибкий и красивый пользовательский интерфейс. Одной из ключевых возможностей является анимация. В этой статье рассмотрим три основных инструмента анимации в QML:
PropertyAnimation— для анимации отдельных свойствStates— для описания разных визуальных состоянийTransition— для управления переходами между состояниями
1. PropertyAnimation
PropertyAnimation позволяет анимировать любое свойство объекта, поддерживающее числовое значение (например, x, y, width, opacity, rotation и т.д.).
Пример:
Rectangle {
width: 200
height: 200
color: "lightgray"
Rectangle {
id: animRect
width: 50
height: 50
color: "tomato"
x: 0
y: 75
MouseArea {
anchors.fill: parent
onClicked: anim.to = (animRect.x === 0 ? 150 : 0)
anim.start()
}
PropertyAnimation {
id: anim
target: animRect
property: "x"
duration: 500
easing.type: Easing.InOutQuad
}
}
}
При нажатии на прямоугольник он плавно перемещается по оси X.
2. States (Состояния)
States в QML позволяют описывать различные конфигурации компонентов, между которыми можно переключаться. Например, положение, размер, цвет и прочие свойства.
Пример:
Rectangle {
width: 200
height: 200
color: "lightblue"
Rectangle {
id: myRect
width: 50
height: 50
color: "orange"
anchors.centerIn: parent
MouseArea {
anchors.fill: parent
onClicked: parent.state = (parent.state === "moved" ? "" : "moved")
}
}
states: [
State {
name: "moved"
PropertyChanges {
target: myRect
x: 120
y: 120
rotation: 45
}
}
]
}
При клике компонент меняет свое состояние: перемещается и вращается.
3. Transition (Переходы между состояниями)
Чтобы сделать переходы между States плавными, используется Transition. Он описывает, какие свойства нужно анимировать и как.
Пример:
Rectangle {
width: 200
height: 200
color: "lightblue"
Rectangle {
id: myRect
width: 50
height: 50
color: "orange"
anchors.centerIn: parent
MouseArea {
anchors.fill: parent
onClicked: parent.state = (parent.state === "moved" ? "" : "moved")
}
}
states: [
State {
name: "moved"
PropertyChanges {
target: myRect
x: 120
y: 120
rotation: 45
}
}
]
transitions: [
Transition {
from: "*"
to: "*"
NumberAnimation {
properties: "x, y, rotation"
duration: 600
easing.type: Easing.InOutQuad
}
}
]
}
Теперь переход из состояния в состояние происходит с плавной анимацией координат и вращения.
Практические советы
- Используйте
PropertyAnimationдля анимации одиночных свойств без переключения состояния. - Используйте
States+Transitionдля организации более сложной логики интерфейса, когда один и тот же элемент может находиться в разных конфигурациях. - Анимации не должны мешать UX: делайте их быстрыми и ненавязчивыми.
Заключение
Анимации в QML просты в использовании и позволяют легко добавлять интерактивность и живость интерфейсу. Сочетание PropertyAnimation, States и Transition дает мощный и гибкий инструментарий для создания современного UI.
