====== Making things move ======
===== States =====
* The State element defines configurations of objects and properties.
* It is a non-visual element (typically) has visual impact.
* Changing from one state to another creates dynamics.
{{youtube>hO18NDpekp0?small}}
==== How to create States ====
* Bind ''states'' to a list of States.
* The list is specified using JSON array syntax.
Item {
id: myItem
width: 400
height: 400
Image {
id: spaceship
source: "images/spaceship.png"
x: 10
y: 50
}
states: [
State {
name: "leftXMove"
PropertyChanges {
target: spaceship
x: 200
}
}
]
}
* States have names (in quotes), not ids.
* You can create as many states as you need for an object.
* All properties not expressed will be the same as the base state.
...
states: [
State {
name: "leftXMove"
PropertyChanges {
target: "spaceship"
x: 200
}
},
State {
name: "downYMove"
PropertyChanges {
target: "spaceship"
y: 90
}
}
]
...
* Executing a function to set a different state:
Image {
id: myButton
source: "images/button.png"
y: 50; x: 10
MouseArea {
anchors.fill: parent
onClicked: myItem.state = 'leftXMove'
}
}
* Using “when” method. It will change the property but inside the state element:
Image {
id: myButton
source: "images/button.png"
y: 50; x: 10
MouseArea {
id:myButtonMouseArea
anchors.fill: parent
}
}
states: [
State {
name: "leftXMove"
when: myButtonMouseArea.clicked
PropertyChanges {
target: myItem
x: 200
}
}
]
* Complete example:
import QtQuick 1.0
Item {
id: myItem
width: 400
height: 400
Image {
source: "images/background.png"
}
Image {
id: spaceship
x: 10
y: 50
source: "images/spaceship.png"
}
Image {
id: myButton
source: "images/button.png"
anchors.horizontalCenter: myItem.horizontalCenter
anchors.bottom: myItem.bottom
anchors.bottomMargin: 20
Text {
id: myButtonLabel
text: "PRESS"
color: "white"
anchors.horizontalCenter: parent.horizontalCenter
anchors.top: parent.top
anchors.topMargin: 6
}
MouseArea {
anchors.fill: parent
onClicked:{
myItem.state = "rightBottom"
}
}
}
states: [
State {
name: "rightBottom"
PropertyChanges {
target: spaceship
x: 250
y: 200
}
}
]
}
===== Transitions =====
* State changes add dynamics, but Transitions make them pretty.
{{youtube>Q2E3mjlcvEk?small}}
==== Animating from one State to another ====
* You just need to add a transition element to animate between states.
* The first state is an empty string by default.
import QtQuick 1.0
Item {
id: myItem
width: 400
height: 400
Image {
source: "images/background.png"
}
Image {
id: spaceship
x: 10
y: 50
source: "images/spaceship.png"
}
Image {
id: myButton
source: "images/button.png"
anchors.horizontalCenter: myItem.horizontalCenter
anchors.bottom: myItem.bottom
anchors.bottomMargin: 20
Text {
id: myButtonLabel
text: "PRESS"
color: "white"
anchors.horizontalCenter: parent.horizontalCenter
anchors.top: parent.top
anchors.topMargin: 6
}
MouseArea {
anchors.fill: parent
onClicked:{
myItem.state = "rightBottom"
}
}
}
states: [
State {
name: "rightBottom"
PropertyChanges {
target: spaceship
x: 250
y: 200
}
}
]
transitions: [
Transition {
from: ""
to: "rightBottom"
NumberAnimation {
properties: "x,y"
duration: 500
easing.type: Easing.OutExpo
}
}
]
}
=== Main transition and animation elements ===
* ''from'' and ''to''
* the element’s initial and final state string
* ''target''
* the animated element’s id
* ''properties''
* the property that you want to change during the animation. This can be an array of properties
* ''easing.type''
* choose an easing curve to add a specific effect to your animation
==== Animation types ====
* There are many ways to achieve your needs.
=== NumberAnimation ===
* **NumberAnimation** allows you to animate changes in a real number type property.
* This is the basic animation element. Most animations are about changing numbers.
NumberAnimation {
properties: "x, y";
duration: 500;
easing.type: Easing.OutExpo;
}
=== Sequential and Parallel Animations ===
* You can create collections of animations that happen in a specific order.
* **SequentialAnimation**:
{{youtube>sFVifXy8mAM?small}}
SequentialAnimation {
NumberAnimation {
target : myRect
properties: "x";
duration: 500;
easing.type: Easing.OutExpo;
}
NumberAnimation {
target : myRect
properties: "y";
duration: 500;
easing.type: Easing.OutExpo;
}
}
* **ParallelAnimation**
{{youtube>A-TOPzJpRYg?small}}
ParallelAnimation {
NumberAnimation {
target : myRect
properties: "x";
duration: 500;
easing.type: Easing.OutExpo;
}
NumberAnimation {
target : myRect
properties: "y";
duration: 500;
easing.type: Easing.OutExpo;
}
}
=== RotationAnimation ===
* The **RotationAnimation** allows you to add rotation properties to your animation. FIXME I think the code below is wrong: state and transition are not JSON arrays
states: {
State {
name: "180";
PropertyChanges { target: myItem; rotation: 180 }
}
State {
name: "-90";
PropertyChanges { target: myItem; rotation: -90 }
}
}
transition: Transition {
RotationAnimation {
direction: RotationAnimation.Shortest
}
}
=== PauseAnimation ===
* The **PauseAnimation** allows you to add delays in your animation.
PauseAnimation {
target : myRect
duration: 100
}
=== Animating with behavior ===
Rectangle {
width: 20; height: 20; color: "#00ff00"
y: 200
Behavior on y {
NumberAnimation {
easing.type: Easing.OutBounce
duration: 200
}
}
--------------------------------------------------------------
====== Resources ======
* {{:qt-quick-for-designers-1:images.zip|}}
* All source code is subject to this [[copyright header|copyright]].