赞
踩
目录
QML提供了一个强大的动画框架,其中包含很多动画元素,我们可以使用这些动画元素让界面拥有酷炫的动态效果。
QML提供了各种动画元素用来实现不同的动画效果,笔者这里列举一些常用的元素:
所有动画元素的基类都是Animation,我们来看下它内置的一些属性、信号和方法。
属性
信号
方法
我们现在拿PropertyAnimation举个例子,请看以下示例代码。
- import QtQuick 2.0
- import QtQuick.Controls 2.0
-
- Rectangle {
- id: root
- width: 300
- height: 200
- color: "black"
-
- PropertyAnimation {
- id: anim
- target: root // 1
- property: "color" // 2
- to: "white" // 3
- duration: 1000 // 4
- }
-
- Button {
- id: btn
- text: "运行"
- anchors.centerIn: root
- onClicked: {
- anim.running = true // 5
- }
- }
- }
运行结果:
代码解释:
1. target属性填写要应用动画的目标元素。
2. property属性填写要修改的目标元素属性。
3. to属性填写动画运行时的目标值。
4. duration属性填写动画执行所需时间,单位是毫秒。
5. 将PropertyAnimation元素的running属性修改为true,运行动画。我们也可以将这行代码替换成anim.start(),这样点击按钮后,动画也会执行。
有时候会看到这种Animation on <property>的写法,用这种写法的话我们可以把动画元素直接写进目标元素花括号内,不需要再编写target属性。我们把上面的代码修改下。
- import QtQuick 2.0
- import QtQuick.Controls 2.0
-
- Rectangle {
- id: root
- width: 300
- height: 200
- color: "black"
-
- PropertyAnimation on color{
- id: anim
- to: "white"
- duration: 1000
- running: false // 1
- }
-
- Button {
- id: btn
- text: "运行"
- anchors.centerIn: root
- onClicked: {
- anim.running = true
- }
- }
- }
代码解释:
1. 使用Animation on <property>这种写法时,running属性默认是true,也就是说程序运行后动画会立即执行,所以我们这里先将running设置为false。
到目前为止,示例代码只是修改了一个元素的一种属性,如果我们要想修改多个元素的多种属性,只用将target和property属性写成英文复数形式:targets和properties。如下方代码所示。
- import QtQuick 2.0
-
- Rectangle {
- id: root
- width: 300
- height: 200
- color: "white"
-
- Rectangle {
- id: rect1
- x: 20
- y: 20
- width: 50
- height: 50
- color: "green"
- }
-
- Rectangle {
- id: rect2
- x: 150
- y: 20
- width: 50
- height: 50
- color: "blue"
- }
-
- PropertyAnimation {
- id: anim
- targets: [rect1, rect2] // 1
- properties: "width,height" // 2
- to: 80
- duration: 1000
- running: true
- }
- }
运行结果:
代码解释:
1. targets属性设置为rect1和rect2,表示要将动画应用到这两个元素上。
2. properties属性设置为"width,height",表示要修改width和height这两个属性,多个属性之间用逗号隔开。
注:这种写法虽然能够改变多个属性的值,不过被修改的属性的最终值只能是一样的,因为to只能设置成一个值。
不同的缓动曲线可以让同一种动画在运行时产生不同的效果,我们可以通过修改动画元素的easing.type(缓动种类)属性来改变动画的缓动值。动画的默认缓动值是Easing.Linear,其他可选值请访问该链接。我们现在通过一个示例来了解下缓动曲线,请看下方示例代码。
- import QtQuick 2.0
-
- Rectangle {
- id: root
- width: 300
- height: 200
- color: "white"
-
- Rectangle {
- id: rect
- x: 0
- y: 75
- width: 50
- height: 50
- color: "red"
- }
-
- NumberAnimation { // 1
- id: anim
- target: rect
- property: "x"
- to: 250
- duration: 1000
- }
-
- MouseArea {
- anchors.fill: root
- onClicked: {
- anim.start()
- }
- }
- }
运行结果:
代码解释:
1. 用NumberAnimation动画元素修改rect1矩形元素的位置。此时NumberAnimation的easing.type属性的值是Easing.Linear,所以矩形元素会从左到右匀速运动。如果我们往NumberAnimation代码块中添加如下代码,那矩形就会先快后慢再快地向右移动了。
easing.type: Easing.OutInQuad
除了easing.type,很多动画还有easing.amplitude(缓冲幅度)、easing.overshoot(缓冲溢出)、easing.period(缓冲周期)这些属性,我们可以通过这些属性来对缓冲曲线进行微调。
不过这些微调属性都有使用的缓动曲线,easing.amplitude适用于弹跳或弹性曲线:
easing.overshoot适用于:
easing.period适用于:
下方示例代码使用了Easing.InBounce这种缓动曲线,其中一个NumberAnimation使用了easing.amplitude属性对缓动进行微调。通过对比两个矩形元素的动画效果我们就可以看出这些微调属性的作用了。
- import QtQuick 2.0
-
- Rectangle {
- id: root
- width: 300
- height: 200
- color: "white"
-
- Rectangle {
- id: rect1
- x: 0
- y: 0
- width: 50
- height: 50
- color: "red"
- }
-
- Rectangle {
- id: rect2
- x: 0
- y: 150
- width: 50
- height: 50
- color: "blue"
- }
-
- NumberAnimation {
- id: anim1
- target: rect1
- property: "x"
- to: 250
- duration: 3000
- easing.type: Easing.InElastic
- }
-
- NumberAnimation {
- id: anim2
- target: rect2
- property: "x"
- to: 250
- duration: 3000
- easing.type: Easing.InBounce
- easing.amplitude: 2.0
- }
-
- MouseArea {
- anchors.fill: root
- onClicked: {
- anim1.start()
- anim2.start()
- }
- }
- }
运行结果:
动画分组有两个:SequentialAnimation串行动画分组和ParallelAnimation并行动画分组。它们同样是Animation的派生元素,前者会按照动画添加顺序依次执行各个动画,而后者会同时执行所有动画。请看下方示例代码。
- import QtQuick 2.0
-
- Rectangle {
- id: root
- width: 300
- height: 200
- color: "white"
-
- Rectangle {
- id: rect
- x: 0
- y: 75
- width: 50
- height: 50
- color: "red"
- }
-
- SequentialAnimation { // 1
- id: sequentialAnim
- NumberAnimation {
- target: rect
- property: "x"
- to: 250
- duration: 2000
- }
-
- ColorAnimation {
- target: rect
- property: "color"
- to: "blue"
- duration: 2000
- }
-
- RotationAnimation {
- target: rect
- property: "rotation"
- to: 360
- duration: 2000
- }
-
- NumberAnimation {
- target: rect
- property: "radius"
- to: 25
- duration: 2000
- }
- }
-
- MouseArea {
- anchors.fill: root
- onClicked: {
- sequentialAnim.start() // 2
- }
- }
- }
运行结果:
代码解释:
1. SequentialAnimation串行动画分组元素中包含四个动画元素,分别是:修改x属性的NumberAnimation、修改color属性的ColorAnimation、修改rotation属性的RotationAnimation以及修改radius属性的NumberAnimation。矩形元素会先运动到窗口右边,再从红色编程蓝色,再旋转360度,再从矩形变成圆形。
2. 当点击窗口后,四个动画就会按照顺序依次执行。
现在我们使用ParallelAnimation并行动画分组元素让四个动画同时执行,请看下方代码。
- import QtQuick 2.0
-
- Rectangle {
- id: root
- width: 300
- height: 200
- color: "white"
-
- Rectangle {
- id: rect
- x: 0
- y: 75
- width: 50
- height: 50
- color: "red"
- }
-
- ParallelAnimation {
- id: parallelAnim
- NumberAnimation {
- target: rect
- property: "x"
- to: 250
- duration: 2000
- }
-
- ColorAnimation {
- target: rect
- property: "color"
- to: "blue"
- duration: 2000
- }
-
- RotationAnimation {
- target: rect
- property: "rotation"
- to: 360
- duration: 2000
- }
-
- NumberAnimation {
- target: rect
- property: "radius"
- to: 25
- duration: 2000
- }
- }
-
- MouseArea {
- anchors.fill: root
- onClicked: {
- parallelAnim.start()
- }
- }
- }
运行结果:
代码解释:
将SequentialAnimation改成ParallelAnimation,然后再修改下id名称就可以了。此时矩形元素会在向窗口右侧移动的同时改变颜色、旋转以及变成圆形。
1. 动画元素的种类有很多,不过它们的用法是相似的,很多属性也一样。
2. 缓动曲线可以让同种动画表现出不同效果,可以通过easing.type属性修改缓动类型。
3. 如果想让一些动画按照顺序或者同时执行,可以将它们添加到SequentialAnimation或者ParallelAnimation动画分组中。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。