百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 热门文章 > 正文

Qt编程进阶(52):QML动画元素之PropertyAnimation

bigegpt 2024-09-16 12:12 6 浏览

QML动画元素

在QML中,可以在对象的属性值上,应用动画对象随时间逐渐改变它们来创建动画。动画对象是用一组QML内建的动画元素创建的,可以根据属性的类型及是否需要一个或多个动画而有选择地使用这些动画元素来为多种类型的属性值产生动画。

所有的动画元素都继承自Animation元素,尽管它本身无法直接创建对象,但却为其他各种动画元素提供了通用的属性和方法。例如,用running属性和start()、stop()方法控制动画的开始和停止,用loops属性设定动画循环次数等。

PropertyAnimation元素

PropertyAnimation (属性动画元素)是用来为属性提供动画的最基本的动画元素,它直接继承自Animation元素,可以用来为real、int、color、rect、point、size和vector3d等属性设置动画。动画元素可以通过不同的方式来使用,取决于所需要的应用场景。一般的使用方式有如下几种:

  • 作为属性值的来源。可以立即为一个指定的属性使用动画。
  • 在信号处理器中创建。当接收到一个信号(如鼠标单击事件)时触发动画。
  • 作为独立动画元素。像一个普通QML对象一样地被创建,不需要绑定到任何特定的对象和属性。
  • 在属性值改变的行为中创建。当一个属性值改变时触发动画,这种动画又叫“行为动画”。

下面实例编程演示动画元素多种不同的使用方式,运行效果如下图所示。其中,“属性值源”矩形:始终在循环往复地移动;“信号处理”矩形:每单击一次会往返运动3次;“独立元素”矩形:每单击一次移动一次;任意时刻在窗口内的其他位置单击鼠标,“改变行为”矩形都会跟随鼠标移动。

实现步骤如下。

(1) 新建项目

新建QML应用程序,项目名称为“PropertyAnimation”。

(2) 自定义组件

定义4个矩形组件,代码分别如下:

/*“属性值源”矩形,源文件Rect1.qml */
import QtQuick 2.0
Rectangle {
  width: 80
  height: 80
  color: "orange"
  radius: 10
  Text {
    anchors.centerIn: parent
    font.pointSize: 12
    text: "属性值源"
  }
  PropertyAnimation on x { // (a)
    from: 50 //起点
    to: 500 //终点
    duration: 30000 //运动时间为30秒
    loops: Animation.Infinite //无限循环
    easing.type: Easing.OutBounce //(b)
  }
}

/*“信号处理”矩形,源文件Rect2.qml */
import QtQuick 2.0
Rectangle {
  id: rect2
  width: 80
  height: 80
  color: "lightgreen"
  radius: 10
  Text {
    anchors.centerIn: parent
    font.pointSize: 12
    text: "信号处理"
  }
  MouseArea {
    anchors.fill: parent
    onClicked: PropertyAnimation {//(c)
    target: rect2 //动画应用于标识rect2的矩形(目标对象)
    property: "y" //y轴方向的动画
    from: 30 //起点
    to: 300 //终点
    duration: 3000 //运动时间为3秒
    loops: 3 //运动3个周期
    easing.type: Easing.Linear //匀速线性运动
  }
  }
}

/* “独立元素”矩形,源文件Rect3.qml */
import QtQuick 2.0
Rectangle {
  id: rect3
  width: 80
  height: 80
  color: "aqua"
  radius: 10
  Text {
    anchors.centerIn: parent
    font.pointSize: 12
    text: "独立元素"
  }
  PropertyAnimation { //(d)
    id: animation //独立动画标识符
    target: rect3
    properties: "x,y" //同时在x、y轴两个方向上运动
    duration: 1000 //运动时间为1秒
    easing.type: Easing.InOutBack //运动到半程增加过冲,然后减少
  }
  MouseArea {
    anchors.fill: parent
    onClicked: {
      animation.from = 20 //起点
      animation.to = 200 //终点
      animation.running = true //开启动画
 		}
  }
}

/* “改变行为”矩形,源文件Rect4.qml */
import QtQuick 2.0
Rectangle {
  width: 80
  height: 80
  color: "lightblue"
  radius: 10
  Text {
    anchors.centerIn: parent
    font.pointSize: 12
    text:"改变行为"
  }
  Behavior on x { //(e)
    PropertyAnimation {
      duration: 1000 //运动时间为1秒
      easing.type: Easing.InQuart //加速运动
    }
  }
  Behavior on y { //应用到y轴方向的运动行为
    PropertyAnimation {
      duration: 1000
      easing.type: Easing.InQuart
    }
  }
}

其中,

  • (a) PropertyAnimation on x{…}: 一个动画被应用为属性值源,要使用“动画元素on属性”语法,本例Rect1的运动就使用了这个方法。这里在Rect1的x属性上应用了PropertyAnimation 来使它从起始值(50)在30000毫秒中使用动画变化到500。Rect1一旦加载完成就会开启该动画,PropertyAnimation的loops属性指定为Animation.Infinite,表明该动画是无限循环的。指定一个动画作为属性值源,在一个对象加载完成后立即就对一个属性使用动画变化到一个指定的值的情况是非常有用的。
  • (b) easing.type: Easing.OutBounce:对于任何基于PropertyAnimation的动画都可以通过设置easing属性来控制在属性值动画中使用的缓和曲线。它们可以影响这些属性值的动画效果,提供反弹、加速和减速等视觉效果。这里通过使用Easing.OutBounce创建了一个动画到达目标值时的反弹效果。在本例代码中,还演示了其他几种(匀速、加速、半程加速过冲后减速)效果。更多类型的特效,请参考QML官方文档,这里就不展开了。
  • (c) onClicked: PropertyAnimation{...}:可以在一个信号处理器中创建一个动画,并在接收到信号时触发。这里当MouseArea被单击时则触发PropertyAnimation,在3000毫秒内使用动画将y坐标由30改变为300,并往返重复运动3次。因为动画没有绑定到一个特定的对象或者属性,所以必须指定target和property(或properties)属性的值。
  • (d) PropertyAnimation{…}:这是一个独立的动画元素,它像普通QML元素一样被创建,并不绑定到任何对象或属性上。一个独立的动画元素默认是没有运行的,必须使用running属性或start()和stop()方法来明确地运行它。因为动画没有绑定到一个特定的对象或属性上,所以也必须定义target和property(或properties)属性。独立动画在不是对某个单一对象属性应用动画而且需要明确控制动画的开始和停止时刻的情况下是非常有用的。
  • (e) Behavior on x { PropertyAnimation{…}}:定义x属性上的行为动画。经常在一个特定的属性值改变时要应用一个动画,在这种情况下,可以使用一个Behavior为一个属性改变指定一个默认的动画。这里,Rectangle拥有一个Behavior对象应用到了它的x和y属性上。每当这些属性改变(这里是在窗口中单击,将当前鼠标位置赋值给矩形x、y坐标)时,Behavior中的PropertyAnimation对象就会应用到这些属性上,从而使Rectangle使用动画效果移动到鼠标单击的位置上。行为动画是在每次响应一个属性值的变化时触发的,对这些属性的任何改变都会触发它们的动画,如果x或y还绑定到了其他属性上,那么这些属性改变时也都会触发动画。

注意:这里PropertyAnimation的from和to属性是不需要指定的,因为已经提供了这些值,分别是Rectangle的当前值和onClicked处理器中设置的新值(接下来会给出代码)。

(3) 编写主程序

打开“main.qml”文件,编写代码如下:

import QtQuick 2.12
import QtQuick.Window 2.12
Window {
  width: 640
  height: 480
  visible: true
  title: qsTr("PropertyAnimation")
  Rectangle {
    width: 360
    height: 360
    anchors.fill: parent
    MouseArea {
      id: mouseArea
      anchors.fill: parent
      onClicked: {
        /*将鼠标单击位置的x、y坐标值设为矩形Rect4的新坐标*/
        rect4.x = mouseArea.mouseX;
        rect4.y = mouseArea.mouseY;
      }
    }
    Column { //初始时以列布局排列各矩形
      x: 50; y: 30
      spacing: 5
      Rect1 { } // “属性值源”矩形
      Rect2 { } // “信号处理”矩形
      Rect3 { } // “独立元素”矩形
      Rect4 {id: rect4 } // “改变行为”矩形
    }
  }
}

————————————————

觉得有用的话请关注点赞,谢谢您的支持!

对于本系列文章相关示例完整代码有需要的朋友,可关注并在评论区留言!

相关推荐

最全的MySQL总结,助你向阿里“开炮”(面试题+笔记+思维图)

前言作为一名编程人员,对MySQL一定不会陌生,尤其是互联网行业,对MySQL的使用是比较多的。对于求职者来说,MySQL又是面试中一定会问到的重点,很多人拥有大厂梦,却因为MySQL败下阵来。实际上...

Redis数据库从入门到精通(redis数据库设计)

目录一、常见的非关系型数据库NOSQL分类二、了解Redis三、Redis的单节点安装教程四、Redis的常用命令1、Help帮助命令2、SET命令3、过期命令4、查找键命令5、操作键命令6、GET命...

netcore 急速接入第三方登录,不看后悔

新年新气象,趁着新年的喜庆,肝了十来天,终于发了第一版,希望大家喜欢。如果有不喜欢看文字的童鞋,可以直接看下面的地址体验一下:https://oauthlogin.net/前言此次带来得这个小项目是...

精选 30 个 C++ 面试题(含解析)(c++面试题和答案汇总)

大家好,我是柠檬哥,专注编程知识分享。欢迎关注@程序员柠檬橙,编程路上不迷路,私信发送以下关键字获取编程资源:发送1024打包下载10个G编程资源学习资料发送001获取阿里大神LeetCode...

Oracle 12c系列(一)|多租户容器数据库

作者杨禹航出品沃趣技术Oracle12.1发布至今已有多年,但国内Oracle12C的用户并不多,随着12.2在去年的发布,选择安装Oracle12c的客户量明显增加,在接下来的几年中,Or...

flutter系列之:UI layout简介(flutter-ui-nice)

简介对于一个前端框架来说,除了各个组件之外,最重要的就是将这些组件进行连接的布局了。布局的英文名叫做layout,就是用来描述如何将组件进行摆放的一个约束。在flutter中,基本上所有的对象都是wi...

Flutter 分页功能表格控件(flutter 列表)

老孟导读:前2天有读者问到是否有带分页功能的表格控件,今天分页功能的表格控件详细解析来来。PaginatedDataTablePaginatedDataTable是一个带分页功能的DataTable,...

Flutter | 使用BottomNavigationBar快速构建底部导航

平时我们在使用app时经常会看到底部导航栏,而在flutter中它的实现也较为简单.需要用到的组件:BottomNavigationBar导航栏的主体BottomNavigationBarI...

Android中的数据库和本地存储在Flutter中是怎样实现的

如何使用SharedPreferences?在Android中,你可以使用SharedPreferencesAPI来存储少量的键值对。在Flutter中,使用Shared_Pref...

Flet,一个Flutter应用的实用Python库!

▼Flet:用Python轻松构建跨平台应用!在纷繁复杂的Python框架中,Flet宛如一缕清风,为开发者带来极致的跨平台应用开发体验。它用最简单的Python代码,帮你实现移动端、桌面端...

flutter系列之:做一个图像滤镜(flutter photo)

简介很多时候,我们需要一些特效功能,比如给图片做个滤镜什么的,如果是h5页面,那么我们可以很容易的通过css滤镜来实现这个功能。那么如果在flutter中,如果要实现这样的滤镜功能应该怎么处理呢?一起...

flutter软件开发笔记20-flutter web开发

flutterweb开发优势比较多,采用统一的语言,就能开发不同类型的软件,在web开发中,特别是后台式软件中,相比传统的html5开发,更高效,有点像c++编程的方式,把web设计出来了。一...

Flutter实战-请求封装(五)之设置抓包Proxy

用了两年的flutter,有了一些心得,不虚头巴脑,只求实战有用,以供学习或使用flutter的小伙伴参考,学习尚浅,如有不正确的地方还望各路大神指正,以免误人子弟,在此拜谢~(原创不易,转发请标注来...

为什么不在 Flutter 中使用全局变量来管理状态

我相信没有人用全局变量来管理Flutter应用程序的状态。毫无疑问,我们的Flutter应用程序需要状态管理包或Flutter的基本小部件(例如InheritedWidget或St...

Flutter 攻略(Dart基本数据类型,变量 整理 2)

代码运行从main方法开始voidmain(){print("hellodart");}变量与常量var声明变量未初始化变量为nullvarc;//未初始化print(c)...