当前位置:   article > 正文

qtqml中PropertyAnimation的几种用法_qpropertyanimation用法

qpropertyanimation用法

qml文章 qt qml中PropertyAnimation的几种用法

动画应用场景有下面几种:

首先假设一个Rectangle,动画是要改变它的x和y值

1,Rectangle一旦被创建,就要移动到一个特定的位置

2,动画只有在某一个特定的外部行为触发时候才会被触发,例如,鼠标单击某一个控件时候,产生动画,使目标移动到指定的位置

3,只有在某一个特定的信号后才触发

4,做为一个独立的动画,虽然没有绑定rectangle的运动,但是可以在脚本中加载,开始和停止

5,只有在状态改变时候才会触发

6,只有在某一个属性改变时候才触发,无论这个属性是通过什么样的方法来改变的

7,在一个特定的信号处理器中创建,当接收到对应的信号时候就触发,类似于3

 

下面分别用代码来看几种实现方法:

【1】首先是对第一种场景

 

  1. Rectangle{
  2. color:"red"
  3. width:360
  4. height:50
  5. PropertyAnimation on x{to: 50 ;duration:1000; loops:Animation.Infinite }
  6. PropertyAnimation on y{to: 250 ;duration:1000; loops:Animation.Infinite }
  7. }

 

Rectangle一旦被创建,就立刻从(0,0)坐标移动到(50,250),在一秒时间内

【2】第二种场景代码,行为动画,在某一个属性值发生变化时候触发

 

  1. Rectangle{
  2. color:"red"
  3. width:360
  4. height:50
  5. id:rect
  6. Behavior on x {
  7. PropertyAnimation{ duration : 1000 }
  8. }
  9. Behavior on y {
  10. PropertyAnimation{ duration : 1000 }
  11. }
  12. }
  13. MouseArea{
  14. anchors.fill: parent
  15. onClicked:{
  16. rect.x=mouse.x;
  17. rect.y=mouse.y;
  18. }
  19. }

这段代码实现了,在点击了屏幕上的一点后,rect会在一秒的时间内触发动画,到达鼠标所点击的位置,因为在onClicked里面,我们修改了rect的x和y值。

 

 

【3】在信号处理器中触发动画

 

  1. Rectangle{
  2. color:"red"
  3. width:360
  4. height:50
  5. id:rect
  6. MouseArea{
  7. anchors.fill: parent
  8. onClicked:
  9. PropertyAnimation{
  10. target:rect ; properties:"y"
  11. to:250
  12. duration:1000
  13. }
  14. }
  15. }

当点击rect的时候,就会触发动画,使rect的y从0运动到250

 

 

【4】动画作为一个独立的动画,可以像创建普通的QML对象一样创建,而不需要绑定特定的对象和属性。

 

  1. Rectangle{
  2. color:"red"
  3. width:360
  4. height:50
  5. id:rect
  6. PropertyAnimation{
  7. id:animation
  8. target:rect
  9. properties: "width"
  10. duration: 1000
  11. }
  12. MouseArea{
  13. anchors.fill: parent
  14. onClicked: {
  15. animation.to=50
  16. animation.running=true;
  17. }
  18. }
  19. }

 

一个独立的动画对象默认是没有运行的,必须使用running属性,或者start() stop()来运行它。

 

【5】切换,切换用来设置当状态发生改变时候,需要创建一个切换,Transition对象。然后把它添加到对象的transition属性下面,代码

 

 

  1. Rectangle{
  2. Rectangle{
  3. color:"gray"
  4. y:100
  5. width:360
  6. height:80
  7. id:rect1
  8. }
  9. //切换状态
  10. Rectangle{
  11. color:"steelblue"
  12. width:360
  13. height:80
  14. id:rect
  15. MouseArea{
  16. anchors.fill: parent
  17. onClicked: {
  18. console.log("dddd")
  19. rect.state="move"
  20. rect1.height=50
  21. rect1.state="move"
  22. }
  23. }
  24. states:[
  25. State{
  26. name:"move"
  27. PropertyChanges{
  28. target:rect
  29. y:250
  30. }
  31. PropertyChanges{
  32. target:rect1
  33. y:330
  34. }
  35. }
  36. ]
  37. transitions: [
  38. Transition {
  39. PropertyAnimation{
  40. properties: "y"
  41. duration:5000
  42. }
  43. }
  44. ]
  45. }
  46. }

当点击rect的时候,rect和rect1的状态切换到move状态,move状态中的两个PropertyChanges对象定义了rect和rect1的属性改变值,这时候Transition会自动被执行,Transition里面的PropertyAnimation对象会自动将rect和rect1的属性值y切换到对应的值,这里并没有设置from和to值,在状态开始和结束的时候已经设置了他们的值。另外propertyAnimation并不需要指定target属性,这样任何对象的y值在状态切换时候都会使用这个动画,不过也可以指定一个target来使用这个动画,另外在Transition里面的东辉会并行执行,如果要串行执行,可以使用SequentiaAnimation.这个代码也可以这样来写:

 

 

 

  1. Rectangle{
  2. Rectangle{
  3. color:"gray"
  4. y:100
  5. width:360
  6. height:80
  7. id:rect1
  8. }
  9. //切换状态
  10. Rectangle{
  11. color:"steelblue"
  12. width:360
  13. height:80
  14. id:rect
  15. MouseArea{
  16. anchors.fill: parent
  17. onClicked: {
  18. console.log("dddd")
  19. rect.state="move"
  20. rect1.height=50
  21. rect1.state="move"
  22. }
  23. }
  24. states:[
  25. State{
  26. name:"move"
  27. }
  28. ]
  29. transitions: [
  30. Transition {
  31. PropertyAnimation{
  32. target:rect
  33. from:0
  34. to:250
  35. properties: "y"
  36. duration:5000
  37. }
  38. PropertyAnimation{
  39. target:rect1
  40. properties: "y"
  41. from:100
  42. to:330
  43. duration:2000
  44. }
  45. }
  46. ]
  47. }
  48. }

[6]属性动画元素

 

PropertyAnimation元素是用来为属性提供动画最基本动画元素,他可以为real ,int ,color,rect,point,sized,vector3d来提供动画设置。它可以被NumberAnimation,ColorAnimation,RotationAnimation,Vector3dAnimation等继承,他们分别提供了更高效的属性动画实现方式。并且任何基于PropertyAnimation的对象都可以设置easing属性来动画中使用的缓和曲线。

例如:

 

  1. Rectangle{
  2. color:"gray"
  3. y:100
  4. width:360
  5. height:80
  6. id:rect1
  7. ColorAnimation on color { from: "white"; to: "red"; duration: 5000 }
  8. RotationAnimation on rotation{
  9. from:0
  10. to:360
  11. direction: RotationAnimation.Clockwise
  12. duration:5000
  13. }
  14. }

 

 

下面是代码整体合起来和运行效果:

 

  1. import QtQuick 2.2
  2. import QtQuick.Controls 1.1
  3. ApplicationWindow {
  4. visible: true
  5. width: 360
  6. height: 480
  7. title: qsTr("Hello World")
  8. menuBar: MenuBar {
  9. Menu {
  10. title: qsTr("File")
  11. MenuItem {
  12. text: qsTr("Exit")
  13. onTriggered: Qt.quit();
  14. }
  15. }
  16. }
  17. Rectangle{
  18. Rectangle{
  19. color:"gray"
  20. y:100
  21. width:360
  22. height:80
  23. id:rect1
  24. ColorAnimation on color { from: "white"; to: "red"; duration: 5000 }
  25. RotationAnimation on rotation{
  26. from:0
  27. to:360
  28. direction: RotationAnimation.Clockwise
  29. duration:5000
  30. }
  31. }
  32. //切换状态
  33. Rectangle{
  34. color:"steelblue"
  35. width:360
  36. height:80
  37. id:rect
  38. MouseArea{
  39. anchors.fill: parent
  40. onClicked: {
  41. console.log("dddd")
  42. rect.state="move"
  43. rect1.height=50
  44. rect1.state="move"
  45. }
  46. }
  47. states:[
  48. State{
  49. name:"move"
  50. // PropertyChanges{
  51. // target:rect
  52. // y:250
  53. // }
  54. // PropertyChanges{
  55. // target:rect1
  56. // y:330
  57. // }
  58. }
  59. ]
  60. transitions: [
  61. Transition {
  62. PropertyAnimation{
  63. target:rect
  64. from:0
  65. to:250
  66. properties: "y"
  67. duration:5000
  68. easing.type: Easing.OutBounce
  69. }
  70. PropertyAnimation{
  71. target:rect1
  72. properties: "y"
  73. from:100
  74. to:330
  75. duration:2000
  76. easing.type: Easing.OutBounce
  77. }
  78. }
  79. ]
  80. }
  81. }
  82. /*
  83. //初始化就触发的动画
  84. Rectangle{
  85. color:"red"
  86. width:360
  87. height:50
  88. PropertyAnimation on x{to: 50 ;duration:1000; loops:Animation.Infinite }
  89. PropertyAnimation on y{to: 250 ;duration:1000; loops:Animation.Infinite }
  90. }
  91. */
  92. /*
  93. Rectangle{
  94. color:"red"
  95. width:360
  96. height:50
  97. id:rect
  98. Behavior on x {
  99. PropertyAnimation{ duration : 1000 }
  100. }
  101. Behavior on y {
  102. PropertyAnimation{ duration : 1000 }
  103. }
  104. }
  105. MouseArea{
  106. anchors.fill: parent
  107. onClicked:{
  108. rect.x=mouse.x;
  109. rect.y=mouse.y;
  110. }
  111. }
  112. */
  113. /*
  114. Rectangle{
  115. color:"red"
  116. width:360
  117. height:50
  118. id:rect
  119. MouseArea{
  120. anchors.fill: parent
  121. onClicked:
  122. PropertyAnimation{
  123. target:rect ; properties:"y"
  124. to:250
  125. duration:1000
  126. }
  127. }
  128. }
  129. */
  130. /*
  131. Column{
  132. Rectangle{
  133. color:"blue"
  134. width:360
  135. height:50
  136. TextInput{
  137. anchors.fill: parent
  138. }
  139. }
  140. Rectangle{
  141. color:"red"
  142. width:360
  143. height:50
  144. id:rect
  145. PropertyAnimation{
  146. id:animation
  147. target:rect
  148. properties: "width"
  149. duration: 1000
  150. }
  151. MouseArea{
  152. anchors.fill: parent
  153. onClicked: {
  154. animation.to=50
  155. animation.running=true;
  156. }
  157. }
  158. }
  159. }
  160. */
  161. Text {
  162. text: qsTr("Hello World")
  163. anchors.centerIn: parent
  164. }
  165. }

 

 

 

红色的巨型首先经过一个360旋转和变色,然后点击蓝色的巨型,就会像弹簧一样落下来。

刚刚提到Transition中的组合动画,ParalleAnimation和SequentialAnimation分别提供并行和串行的动画表现方案。

查看更多qml文章 qt qml中PropertyAnimation的几种用法

声明:本文内容由网友自发贡献,转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号