用例 - QML 中的动画
Qt Quick提供了动画属性的功能。动画属性允许属性值在中间值之间移动,而不是立即变为目标值。要使项目的位置动画化,你可以使控制项目位置的属性(例如 x 和 y)动画化,这样项目的位置在到达目标位置的过程中每一帧都会发生变化。
流畅的用户界面
设计 QML 是为了方便创建流体用户界面。Qt Quick 提供了两种简单的方法,让用户界面组件以动画方式移动,而不是立即出现在新位置。
状态和转换
Qt Quick 允许您在 对象中声明各种用户界面状态。这些状态由基本状态的属性变化组成,是组织用户界面逻辑的有用方法。过渡是可以与项目关联的对象,用于定义项目属性因状态变化而改变时的动画效果。State
可以使用Item::states 和Item::transitions 属性声明项目的状态和转换。状态是在项目(通常是组件的根项目)的状态列表属性中声明的。在同一项目上定义的过渡用于将状态的变化动画化。下面是一个示例。
Item { id: container width: 320 height: 120 Rectangle { id: rect color: "red" width: 120 height: 120 TapHandler { onTapped: container.state === '' ? container.state = 'other' : container.state = '' } } states: [ // This adds a second state to the container where the rectangle is farther to the right State { name: "other" PropertyChanges { target: rect x: 200 } } ] transitions: [ // This adds a transition that defaults to applying to all state changes Transition { // This applies a default NumberAnimation to any changes a state change makes to x or y properties NumberAnimation { properties: "x,y" } } ] }
为属性变化制作动画
行为可用于指定属性变化时的动画效果。然后,它会应用于所有变化,无论其来源如何。下面的示例使用行为动画演示了一个按钮在屏幕上移动的过程。
Item { width: 320 height: 120 Rectangle { color: "green" width: 120 height: 120 // This is the behavior, and it applies a NumberAnimation to any attempt to set the x property Behavior on x { NumberAnimation { //This specifies how long the animation takes duration: 600 //This selects an easing curve to interpolate with, the default is Easing.Linear easing.type: Easing.OutBounce } } TapHandler { onTapped: parent.x == 0 ? parent.x = 200 : parent.x = 0 } } }
其他动画
并非所有动画都必须与特定属性或状态绑定。您还可以创建更广泛的动画,并在动画中指定目标项目和属性。下面是一些不同方法的示例:
Item { width: 320 height: 120 Rectangle { color: "blue" width: 120 height: 120 // By setting this SequentialAnimation on x, it and animations within it will automatically animate // the x property of this element SequentialAnimation on x { id: xAnim // Animations on properties start running by default running: false loops: Animation.Infinite // The animation is set to loop indefinitely NumberAnimation { from: 0; to: 200; duration: 500; easing.type: Easing.InOutQuad } NumberAnimation { from: 200; to: 0; duration: 500; easing.type: Easing.InOutQuad } PauseAnimation { duration: 250 } // This puts a bit of time between the loop } TapHandler { // The animation starts running when you click within the rectangle onTapped: xAnim.running = true } } } Item { width: 320 height: 120 Rectangle { id: rectangle color: "yellow" width: 120 height: 120 TapHandler { // The animation starts running when you click within the rectangle onTapped: anim.running = true; } } // This animation specifically targets the Rectangle's properties to animate SequentialAnimation { id: anim // Animations on their own are not running by default // The default number of loops is one, restart the animation to see it again NumberAnimation { target: rectangle; property: "x"; from: 0; to: 200; duration: 500 } NumberAnimation { target: rectangle; property: "x"; from: 200; to: 0; duration: 500 } } }
有关动画的更多信息,请参阅 Qt Quick 中的重要概念--状态、转换和动画页面。
© 2025 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.