QML学习笔记【03】:动画

news2024/9/24 13:16:35

动画是在指定的时间内,一系列属性的持续变化

1 动画元素(Animation Elements)

有几种类型的动画,每一种都在特定情况下都有最佳的效果,下面列出了一些常用的动画:

  • PropertyAnimation(属性动画)- 使用属性值改变播放的动画
  • NumberAnimation(数字动画)- 使用数字改变播放的动画
  • ColorAnimation(颜色动画)- 使用颜色改变播放的动画
  • RotationAnimation(旋转动画)- 使用旋转改变播放的动画

除了上面这些基本和通常使用的动画元素,QtQuick还提供了一切特殊场景下使用的动画:

  • PauseAnimation(停止动画)- 运行暂停一个动画
  • SequentialAnimation(顺序动画)- 允许动画有序播放
  • ParallelAnimation(并行动画)- 允许动画同时播放
  • AnchorAnimation(锚定动画)- 使用锚定改变播放的动画
  • ParentAnimation(父元素动画)- 使用父对象改变播放的动画
  • SmotthedAnimation(平滑动画)- 跟踪一个平滑值播放的动画
  • SpringAnimation(弹簧动画)- 跟踪一个弹簧变换的值播放的动画
  • PathAnimation(路径动画)- 跟踪一个元素对象的路径的动画
  • Vector3dAnimation(3D容器动画)- 使用QVector3d值改变播放的动画

当使用更加复杂的动画时,我们可能需要在播放一个动画时中改变一个属性或者运行一个脚本。对于这个问题,QtQuick提供了一个动作元素:

  • PropertyAction(属性动作)- 在播放动画时改变属性
  • ScriptAction(脚本动作)- 在播放动画时运行脚本

2 执行动画(Applying Animations)

Window {
    id: root
    width: 640
    height: 480
    visible: true
    title: qsTr("apply animation")

    ClickableImage{
        id: box1
        x: 40; y: root.height - height - 20
        source: "../assets/box_blue.png"
        text: "animation on property(动画会在属性加载完成后立即播放)"
        //添加动画
        NumberAnimation on y{
            to: 40;
            duration: 3000
        }
    }

    ClickableImage{
        id: box2
        x: 40 + box1.width + 20; y: root.height - height - 20
        source: "../assets/box_green.png"
        text: "behavior on property(动画会在属性值更改时自动播放)"
        //添加动画
        Behavior on y{
            NumberAnimation{duration: 3000}
        }
        //onClicked: y = 40
        onClicked: y = 40 + Math.random()*(root.height - 40)
    }

    ClickableImage{
        id: box3
        x: box2.x + box2.width + 20; y: root.height - height - 20
        source: "../assets/box_red.png"
        text: "standalone animation(显式的控制动画执行)"
        //显式的控制动画执行
        onClicked: anim.restart()
        //添加动画,自行调用
        NumberAnimation{
            id: anim
            target: box3 //动画的目标是box3
            from: root.height - box3.height - 20 //动画起始位置
            to: 40 //动画的终止位置
            property: "y"
        }
    }
}

3 缓动曲线(Easing Curves)

4 嵌套动画(Nested animations)、并行动画(Parallel animations)

 //4、并行动画,允许动画同时播放,同时播放y轴动画、x轴动画、旋转动画
    ParallelAnimation{
        id: anim
        //4.1、y轴动画
        SequentialAnimation{ //顺序动画,允许动画有序播放,先播放y轴上升动画、再播放y轴下降动画
            NumberAnimation{ //y轴上升动画
                properties: "y"
                target: ball
                to: 20
                duration: root.duration * 0.4
                easing.type: Easing.OutCirc //缓动曲线类型 InOutCirc 与 OutCirc 有区别的
            }
            NumberAnimation{ //y轴下降动画
                properties: "y"
                target: ball
                to: root.height - ball.height
                duration: root.duration * 0.6
                easing.type: Easing.OutBounce //缓动曲线类型 InOutBounce 与 OutBounce 有区别的
            }
        }
        //4.2、x轴动画
        NumberAnimation{
            properties: "x"
            target: ball
            to: 300
            duration: root.duration
            //easing.type: //缓动曲线类型
        }
        //4.3、循转动画
        RotationAnimation{
            properties: "rotation"
            target: ball
            to: 720
            duration: root.duration
        }
    }

5 动画分组(Grouped Animations)

当开始时,平行元素的所有子动画都会平行运行,它允许在同一时间使用不同的属性来播放动画

Window {
    id: root
    width: 800
    height: 480
    visible: true
    property int duration: 3000
    title: qsTr("UFO")

    Image {
        source: "../assets/background.png"
        anchors.fill: parent
    }

    ClickableImage{
        id: ufo
        x:20; y:root.height-height
        source: "../assets/ufo.png"
        text: "UFO"
        onClicked: anim.restart() //执行动画
    }

//    //1、顺序动画,依次执行y轴方向动画、x轴方向动画
//    SequentialAnimation{
//        id: anim
//        NumberAnimation{ //y轴方向动画
//            target: ufo
//            properties: "y"
//            from: root.height - ufo.height
//            to: 20
//            duration: root.duration
//        }
//        NumberAnimation{ //x轴方向动画
//            target: ufo
//            properties: "x"
//            from: 20
//            to: root.width - ufo.width - 20
//            duration: root.duration
//        }
//    }

    //2、并行动画,同时执行y轴方向动画、x轴方向动画
    ParallelAnimation{
        id: anim
        NumberAnimation{ //y轴方向动画
            target: ufo
            properties: "y"
            from: root.height - ufo.height
            to: 20
            duration: root.duration
        }
        NumberAnimation{ //x轴方向动画
            target: ufo
            properties: "x"
            from: 20
            to: root.width - ufo.width - 20
            duration: root.duration
        }
    }
}

6 状态与转换(States and Transitions)

import QtQuick 2.12
import QtQuick.Window 2.12

Item{
    id: root
    width: 150; height: 260
    property color black: 'black'
    property color red: 'red'
    property color green: 'green'

    //背景
    Rectangle{
        anchors.fill: parent
        color: "#333333"
    }

    //状态
    state: "stop"
    states: [
        State {
            name: "stop"
            PropertyChanges {target: light1; color: root.red}
            PropertyChanges {target: light2; color: root.black}
        },
        State {
            name: "go"
            PropertyChanges {target: light1; color: root.black}
            PropertyChanges {target: light2; color: root.green}
        }
    ]
    //转换
    transitions: [
        Transition {
            //from: "stop"; to: "go"
            from:"*"; to:"*" //从任意状态转到任意状态
            ColorAnimation { //转换时的颜色动画
                duration: 1000
            }
        }
    ]

    //灯1
    Rectangle{
        id: light1
        x:25; y:15
        width: 100; height: 100
        radius: width / 2
        color: root.black
        border.color: Qt.lighter(color, 1.1)
    }
    //灯2
    Rectangle{
        id: light2
        x:25; y:125
        width: 100; height: 100
        radius: width / 2
        color: root.black
        border.color: Qt.lighter(color, 1.1)
    }

    MouseArea{
        anchors.fill: parent
        onClicked: parent.state = (parent.state == "stop" ? "go":"stop")
    }
}

 

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/131859.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

人工智能学习07--pytorch01

一、pytorch简介 1、与TensorFlow区别 2、常用网络层 二、pytorch需要: 1、anaconda 2、CUDA 只能在NVIDIA上运行 ↓我发现电脑果然没有这个显卡 https://zhidao.baidu.com/question/2084255692200398828.html 3、pycharm 新项目要配置python的编译器&#xff…

Leetcode 36. 有效的数独

请你判断一个 9 x 9 的数独是否有效。只需要 根据以下规则 ,验证已经填入的数字是否有效即可。 数字 1-9 在每一行只能出现一次。数字 1-9 在每一列只能出现一次。数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次。(请参考示例图)注意…

FastDfs分布式文件存储系统

FastDfs分布式文件存储系统 FastDfs 是一个开源的高性能分布式文件系统(DFS)。 它的主要功能包括:文件存储,文件同步和文件访问,以及高容量和负载平衡。主要解决了海量数据存储问题,特别适合以中小文件&am…

基于Springboot+Mybatis+mysql+vue+html校园招聘管理系统

基于SpringbootMybatismysqlvuehtml校园招聘管理系统二、系统介绍三、功能展示1.首页2.个人中心(学生端)3.简历信息管理(学生端)4.应聘信息(学生端)5.企业信息(企业)6.招聘信息管理(企业)7.应聘信息管理&am…

谷粒学院——Day15【微信支付】

❤ 作者主页:Java技术一点通的博客 ❀ 个人介绍:大家好,我是Java技术一点通!( ̄▽ ̄)~* 🍊 记得关注、点赞、收藏、评论⭐️⭐️⭐️ 📣 认真学习,共同进步!&am…

【观察】美达电器:以数字化重塑质量管理体系,构筑车企新“护城河”

在汽车行业,越来越多的企业走上数字化转型道路,运用数字化手段,从产品研发、生产制造、供应链管理等方面优化内部协同,从而降低管理成本,提升市场竞争力。美达电器(重庆)有限公司(以下简称美达电器&#xf…

day17-缓冲流转换流序列化流打印流Properties

day17_JAVAOOP 课程目标 1. 【理解】什么是缓冲流 2. 【掌握】缓冲流的使用 3. 【理解】转换流 4. 【理解】序列化流 5. 【理解】打印流 6. 【掌握】Properties集合的使用缓冲流 ​ 前期我们学习了基本的一些流,作为IO流的入门,今天我们要见识一些更强…

babylon.js魔方建模

本文主要内容可能和babylon并无太紧密的关联, 主要是对旋转( 空间想象力 )的练习。 本来想写个魔方练练,就想着顺便练练baboly. 结果反正是最重要的交互逻辑没有实现。 标题已经说明了本文的主题是建模,也就是说&…

ArcGIS基础实验操作100例--实验29矢量数据空间校正

本实验专栏参考自汤国安教授《地理信息系统基础实验操作100例》一书 实验平台:ArcGIS 10.6 实验数据:请访问实验1(传送门) 高级编辑篇--实验29 矢量数据空间校正 目录 一、实验背景 二、实验数据 三、实验步骤 (1&…

android中service实现原理分析

前言: 一开始的目标是解决各种各样的ANR问题的,我们知道,ANR总体上分有四种类型,这四种类型有三种是和四大组件相对应的,所以,如果想了解ANR发生的根因,对安卓四大组件的实现流程是必须要了解的…

Odoo 16 企业版手册 - 库存管理之产品管理

产品管理 记录与产品相关的每个方面对于有效维护库存至关重要。Odoo 库存模块使您可以在数据库中配置新产品,这些产品将有效跟踪和监控所有操作,以加强各自产品的库存管理。库存模块中的产品配置过程与销售和购买模块的流程几乎相似。您将在库存的主菜单…

一步一步学爬虫(4)数据存储之CSV文件存储

一步一步学爬虫(4)数据存储之CSV文件存储4.3 CSV文件存储4.3.1 写入4.3.2 读取4.3.3 总结4.3 CSV文件存储 CSV,全称Comma-Separated Values,中文叫做逗号分隔值或字符分隔值,其文件以纯文本形式存储表格数据。CSV文件…

java.lang.OutOfMemoryError: GC overhead limit exceeded问题分析及解决

一、错误重现 2022-12-29 10:12:07.210 ERROR 73511 --- [nio-8001-exec-6] o.a.c.c.C.[.[.[/].[dispatcherServlet] : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Handler dispatch failed; nested exception is java.…

SQL刷题宝典-MySQL速通力扣困难题

📢作者: 小小明-代码实体 📢博客主页:https://blog.csdn.net/as604049322 📢欢迎点赞 👍 收藏 ⭐留言 📝 欢迎讨论! 本手册目录: 文章目录前言Markdown导入数据库python脚…

奇安信 工业互联网安全发展与实践 报告 学习笔记一 欢迎扶正

声明 本文是学习2021工业互联网安全发展与实践分析报告. 下载地址而整理的学习笔记,分享出来希望更多人受益,如果存在侵权请及时联系我们 主要观点 工业系统安全漏洞数量增长显著放缓,但超高危漏洞数量却大幅增加。统计显示,2021年,国内外…

Linux 软件包管理器 yum

1.什么是软件包 在Linux下安装软件,一个通常的办法是下载到程序的源代码,并进行编译,得到可执行程序。但是这样太麻烦了,于是有些人把一些常用的软件提前编译好, 做成软件包(可以理解成windows上的安装程序)放在一个服务器上&…

再见2022

大家好,我是bigsai,好久不见。看了上一篇更新时间,大概已经停更近10个月(呜呜后面还会坚持的),在2022的最后一天,这一篇也算是对这一年做个总结。期间也收到一些朋友的问候和鼓励,确实自己在读研期间的前两…

山东大学2022-2023非关系型数据库(Nosql)期末考试

写在前面的话: 今年线上开卷考试,Nosql考试软工(限选课)和大数据(必修课)是一套试题,因此大数据所学的许多内容考试并无涉及。考察点主要以学过的四类Nosql数据库的相关知识为主。 试题如下&…

引用量超1400的经典语义分割方法BiSeNet解读

今天给大家分享语义分割领域非常经典的一篇论文:BiSeNet,该论文发表在了ECCV2018上,引用量超过1400。 开源代码地址:https://github.com/ycszen/TorchSeg 1.动机 语义分割任务,即为图片的每个像素分配一个标签&#…

嵌入式 程序调试之gdb+gdbserver+vscode可视化调试

嵌入式 程序调试之gdbgdbservervscode可视化调试 一、简述 记--使用过visual studio的都知道,它的单步调试真的好用,可以直接在源码下断点,实时查看内存变量、寄存器等相关信息。嵌入式linux开发多用的是gdb, 都是命令行执行的,毕…