QML Book 学习基础3(动画)

news2025/1/22 12:11:01

 

目录

主要动画元素

例子:

 非线性动画

分组动画


Qt 动画是一种在 Qt 框架下创建交互式和引人入胜的图形用户界面的方法,我们可以认为是对某个基础元素的多个设置                        

主要动画元素

  • PropertyAnimation-属性值变化时的动画

  • NumberAnimation-qreal类型值变化时的动画

  • ColorAnimation-颜色值变化时的动画

  • RotationAnimation-旋转值变化时的动画

特殊点的

  • PauseAnimation-为动画提供暂停

  • SequentialAnimation-允许按顺序运行动画

  • ParallelAnimation-允许并行运行动画

  • AnchorAnimation-锚定值变化时的动画

  • ParentAnimation-为父元素对象中,值发生变化时的动画

  • SmoothDaniation-允许属性平滑跟踪值

  • SpringAnimation-允许特性跟踪类似弹簧的运动中的值

  • PathAnimation-一个项沿路径变化的动画

  • Vector3dAnimation -为QVector3d值发生变化时的动画

Qt Quick提供了动作元素类型,可以在任何可以使用其他动画元素的地方

  • PropertyAction动画期间,立即更改指定的属性

  • ScriptAction-定义要在动画期间运行的脚本

例子:

PropertyAnimation属性动画提供了一种对属性值的更改进行动画处理的方法。
Image
{
    id:root
    width: 400;height: 400
    //背景
    source: "illustration_2.png"
    //运行状态
    property bool runing: false

    Image{
        id:logo
        source: "logo.png"
        x:(root.width-logo.width)/2
        y:(root.height-logo.height)/2
        //沿X轴移动
        PropertyAnimation on x{
            //沿X轴移动到root.width-logo.width
            to:root.width-logo.width
            //时间2s
            duration:2000
            running: root.runing
        }
        
        // 旋转
        PropertyAnimation on rotation{
            to:360 //旋转角度
            duration:2000
            running: root.runing
        }

        //透明度
        PropertyAnimation on opacity{
            to:0.1
            duration:2000
            running: root.runing
        }

        //响应消息改变运行状态
        MouseArea
        {
            anchors.fill: parent
            onClicked:  root.runing = true
        }
    }
}

 

 非线性动画

我们现在定义的所有动画都使用线性插值,因为动画的初始缓和类型是Easing.Linear。最好通过一个小的绘图进行可视化下,其中y轴是要设置动画的属性,x轴是时间(持续时间)。线性插值将从动画开始时的“from”值到动画结束时的“to”值绘制一条直线。因此,缓和类型定义了曲线的变化

 关于这段你们可以看示例关键字Easing Curves Example官方示例,或者下面代码

//EasingType.qml
import QtQuick 2.0

Item {
    id:root
    width: 200;height: 200
    property alias image: label.text
    property alias source: image.source
    property var easingTyep;
    signal clicked
    Image
    {
        id:image
        anchors.fill: parent
        source: image

        Text {
            id: label
            text: qsTr("text")
            anchors.horizontalCenter: parent.horizontalCenter
            anchors.bottom: parent.botton
        }
    }


    MouseArea
    {
        anchors.fill: parent
        onClicked: root.clicked()
    }
}
//主函数
import QtQuick 2.12
import QtQuick.Window 2.12
import QtQuick.Layouts 1.2

Rectangle
{
    id:root
    width: childrenRect.width
    height: childrenRect.height
    color: "green"
    gradient: Gradient
    {
        GradientStop{position: 0;color:"#8bafce" }
        GradientStop{position: 1;color:"#8edf80"}
    }

    ColumnLayout
    {
        spacing: 20
        Grid
        {
            spacing: 10
            columns: 5
            EasingType{
                image:'InExpo.png'
                easingTyep: Easing.Linear
                onClicked:
                {
                    animation.easing.type=easingTyep
                    box.toggle = !box.toggle
                }
            }
            EasingType{
                image:'InOutBack.png'
                easingTyep: Easing.OutExpo
                onClicked:
                {
                    animation.easing.type=easingTyep
                    box.toggle = !box.toggle
                }
            }
            EasingType{
                image:'InOutBounce.png'
                easingTyep: Easing.InOutBounce
                onClicked:
                {
                    animation.easing.type=easingTyep
                    box.toggle = !box.toggle
                }
            }
            EasingType{
                image:'InOutCirc.png'
                easingTyep: Easing.InOutCirc
                onClicked:
                {
                    animation.easing.type=easingTyep
                    box.toggle = !box.toggle
                }
            }
            EasingType{
                image:'InOutCubic.png'
                easingTyep: Easing.InOutCubic
                onClicked:
                {
                    animation.easing.type=easingTyep
                    box.toggle = !box.toggle
                }
            }
            EasingType{
                image:'InOutElastic.png'
                easingTyep: Easing.InOutElastic
                onClicked:
                {
                    animation.easing.type=easingTyep
                    box.toggle = !box.toggle
                }
            }
            EasingType{
                image:'InOutExpo.png'
                easingTyep: Easing.InOutExpo
                onClicked:
                {
                    animation.easing.type=easingTyep
                    box.toggle = !box.toggle
                }
            }
            EasingType{
                image:'Linear.png'
                easingTyep: Easing.Linear
                onClicked:
                {
                    animation.easing.type=easingTyep
                    box.toggle = !box.toggle
                }
            }
            EasingType{
                image:'OutExpo.png'
                easingTyep: Easing.OutExpo
                onClicked:
                {
                    animation.easing.type=easingTyep
                    box.toggle = !box.toggle
                }
            }
            EasingType{
                image:'SineCurve.png'
                easingTyep: Easing.SineCurve
                onClicked:
                {
                    animation.easing.type=easingTyep
                    box.toggle = !box.toggle
                }
            }
        }

        Rectangle
        {
            id:box
            property bool toggle
            width: 100
            height:100
            x:toggle?20:root.width - width - 20
            gradient:Gradient
            {
                GradientStop{position: 0;color: "#eaea81"}
                GradientStop{position: 1;color: "#f4cccc"}
            }
            Behavior on x
            {
                NumberAnimation
                {
                    id:animation
                    duration: 1000
                }
            }
        }
    }
}

 用别的图展示一下吧

 

分组动画

顾名思义,可以对动画进行分组。分组可以通过两种方式完成:并行或顺序。可以使用 or 元素,该元素充当其他动画元素的动画容器。这些分组动画本身就是动画,可以完全按照动画使用。SequentialAnimation与ParallelAnimation

 

import QtQuick 2.0

Rectangle {

    id:root
    Image
    {
        id:didi
        x:30;y:300
        source:"InOutCirc.png"
        focus:false
        signal clicked
        MouseArea
        {
            anchors.fill: parent
            onClicked:
            {
                anim.restart()
            }
        }
    }

    //ParallelAnimation
    SequentialAnimation
    {
        id:anim
        NumberAnimation {
            target: didi
            property: "y"
            to: 200
            duration: root.duration
        }
        NumberAnimation {
            target: didi
            property: "x"
            to: 150
            duration: root.duration
        }
    }

}

动画嵌套

分组动画也可以嵌套。例如,一个连续动画可以有两个并行动画作为子动画,依此类推。我们可以通过足球的例子来形象化这一点。这个想法是从左到右扔一个球并为其行为添加动画效果

 

 主函数主要是将图层分成二块

import QtQuick 2.12
import QtQuick.Window 2.12

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

    Rectangle {
        id: sky
        width: root.width
        height: 300
        gradient: Gradient {
            GradientStop { position: 0.0; color: "#0080FF" }
            GradientStop { position: 1.0; color: "#66CCFF" }
        }
    }
    Rectangle {
        id: ground
        anchors.top: sky.bottom
        anchors.bottom: root.bottom
        width: parent.width;height: root.height
        gradient: Gradient {
            GradientStop { position: 0.0; color: "#00FF00" }
            GradientStop { position: 1.0; color: "#00803F" }
        }
    }

    BrightSquare{}
}

为了理解动画,我们需要将其剖析为对象的积分变换。我们需要记住,动画会为属性更改设置动画。以下是不同的转换:

  • 从左到右的 x 平移 (X1)

  • 从下到上 () 的 y 平移,然后是从上到下()的平移,有一些弹跳Y1Y2

  • 在整个动画持续时间内旋转 360 度 (ROT1)

 

import QtQuick 2.0

Rectangle {

    id:root
    Image
    {
        id:didi
        x:10;y:450
        source:"InOutCirc.png"
        focus:false
        signal clicked
        MouseArea
        {
            anchors.fill: parent
            onClicked:
            {
                didi.y = 480 - didi.height
                didi.rotation = 0
                anim.restart()
            }
        }
    }

    //ParallelAnimation
    //SequentialAnimation
    ParallelAnimation
    {
        id:anim
        SequentialAnimation
        {
            NumberAnimation {
                target: didi
                property: "y"
                to: 100
                duration: root.duration
                easing.type:Easing.OutCirc
            }
            NumberAnimation {
                target: didi
                property: "y"
                to: 400
                duration: root.duration
                easing.type:Easing.OutCirc
            }
        }

        NumberAnimation {
            target: didi
            property: "x"
            to: 300
            duration: root.duration
        }

        RotationAnimation
        {
            target: didi
            property: "rotation"
            to:360
            duration: root.duration
        }
    }

}

 

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

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

相关文章

Sip分控管理主机 sip协议可视对讲话筒

Sip分控管理主机 sip协议可视对讲话筒 (型号:SV-3280) 产品特点 标准桌面主机,采用8寸高清IPS屏幕,屏幕分辨率1280*800,触摸控制设计,强化铝合金材质; 国产4核嵌入式CPU芯片1G内存,保证系统的整体稳定性&…

IPD集成产品开发进阶:新产品立项CDP流程

目录 前言 立项流程 专栏目录 CSDN学院 作者简介 前言 CDP 流程原本是 IPD 产品开发的前端流程。 之所以拿到《产品经理进阶专栏》中来讲解: 一是因为这个流程承接了市场管理(也就是 MM 流程)和产品开发这两个关键业务流。 这其实就…

《人生苦短,我学Python》——变量 常量 输入输出

今天,我们来学习变量,常量,以及字符串的输入输出。 文章目录 一、变量:二、常量:三、赋值:四、字符串的定义:五、格式化输出:六、转义字符:七、刷题练习:1. 小…

20 - 分页

分页相关方法 # paginate(当前页, 每页显示几条):分页;返回一个对象 pagination 模型类.query.order_by(-模型类.对象).paginate(page2, per_page3) print(pagination.items) # [<Article 2>, <Article 3>] :每页的数据对象 print(pagination.page) # 当前的页…

大势:从米哈游的估值远远超过B站说起

互联网怪盗团的新书《大势&#xff1a;站在十字路口的互联网行业》终于出版了。 本书的诞生堪称一波三折&#xff1a;差不多一年前&#xff0c;当我刚刚提笔时&#xff0c;想要撰写的是一本关于Web3及其对传统互联网平台影响的书。写到第三章时&#xff0c;ChatGPT横空出世&am…

常见前端面试之VUE面试题汇总十一

31. Vuex 有哪几种属性&#xff1f; 有五种&#xff0c;分别是 State、 Getter、Mutation 、Action、 Module state > 基本数据(数据源存放地) getters > 从基本数据派生出来的数据 mutations > 提交更改数据的方法&#xff0c;同步 actions > 像一个装饰器&a…

MyBatis 一个简单配置搞定加密、解密,不能太方便了~!TypeHandler

目录 一、背景 二、解决方案 三、需求 四、实现思路 五、实现代码 一、背景 在我们数据库中有些时候会保存一些用户的敏感信息&#xff0c;比如&#xff1a;手机号、银行卡等信息&#xff0c;如果这些信息以明文的方式保存&#xff0c;那么是不安全的。假如&#xff1a;黑客黑…

敦煌网(DHgate)高成功率的下单流程(养号优势)

1打开敦煌官网 http://www.dhgate.com/ 2点击右上角的注册账号&#xff0c;输入账号信息 3注册完成后打开需要购买的商品页面 点击buy it now 4输入收货地址 5输入银行卡信息 6点击confirm to pay 确认购买 7购买成功&#xff0c;可以在订单页面确认到信息 敦煌网、卖全球、买…

【内推码:NTAMW6c】 MAXIEYE智驾科技2024校招启动啦

MAXIEYE智驾科技2024校招启动啦【内推码&#xff1a;NTAMW6c】 【招聘岗位超多&#xff01;&#xff01;公司食堂好吃&#xff01;&#xff01;】 算法类&#xff1a;感知算法工程师、SLAM算法工程师、规划控制算法工程师、目标及控制算法工程师、后处理算法工程师 软件类&a…

[VUE] Web Serial API的简单示例

<template><div class"home"><div><input type"text" v-model"inputData" placeholder"输入要发送的数据" /><button click"sendData">发送</button></div><div><texta…

【MySql】mysql之基础语句

一、常用的数据类型 类型解释举例int整型用于定义整数类型的数据&#xff08;1、2、3、4、5…&#xff09;float单精度浮点&#xff08;4字节32位&#xff09;准确表示小数点后六位double双精度浮点&#xff08;8字节64位&#xff09;小数位更多&#xff0c;更精确char固定长度…

2.4 opensbi: riscv: opensbi源码解析

4.6 sbi_hart_init()函数 sbi_hart_init(scratch, TRUE) 1.支持hypervisor扩展模式的话,设置trap的基地址为__sbi_expected_trap_hext 2.分配在扩展区域分配struct hart_features结构体 3.记录feature到struct hart_features结构体中 4.1.是否支持浮点数扩展 4.2.是否支持…

常用的GPT插件

0.简介 随着chatgpt爆火&#xff0c;这玩意并不对国内用户开放&#xff0c;如果想要使用的话还要需要进行翻墙以及国外手机号才能进行注册。 对于国内来说有很多国内免费的方法&#xff0c;这里就整理一下&#xff0c;方便大家开发 1. 网站类型 下面的网站无需注册即可免费…

ADRV9009子卡 设计原理图:FMCJ450-基于ADRV9009的双收双发射频FMC子卡 便携测试设备

FMCJ450-基于ADRV9009的双收双发射频FMC子卡 一、板卡概述 ADRV9009是一款高集成度射频(RF)、捷变收发器&#xff0c;提供双通道发射器和接收器、集成式频率合成器以及数字信号处理功能。北京太速科技&#xff0c;这款IC具备多样化的高性能和低功耗组合&#xff0c;FMC子…

数据通信——DHCP

DHCP还没写相关的笔记&#xff0c;但是我觉得大家应该都知道其用途——用来动态的分配IP地址的技术。 一&#xff0c;技术背景 在之前的背景下&#xff0c;公司越来越nb了&#xff0c;居然有几十个员工了&#xff0c;还分配了部门&#xff01;领导说大家部门不一样&#xff0c…

Royal TSX 6 Mac多协议远程软件

Royal TSX是一款功能强大的远程桌面管理软件&#xff0c;适用于Mac操作系统。它允许用户通过一个集成的界面来管理和访问多个远程计算机和服务器。 Royal TSX支持多种远程协议&#xff0c;包括RDP、VNC、SSH、Telnet和FTP等&#xff0c;可以方便地连接到Windows、Linux、Mac和其…

永久免费的SSL证书哪里申请?

在如今互联网发展的时代&#xff0c;保障网站的安全性已经成为了一个必不可少的事项。其中&#xff0c;SSL&#xff08;Secure Socket Layer&#xff09;证书是确保数据传输安全的关键工具之一。然而&#xff0c;许多网站管理者面临一个问题&#xff0c;那就是如何申请一个永久…

快速入门:掌握Koa基础使用技巧

前言 本文主要是学习koa的使用。 基础学习 前置准备 初始化 pnpm init 安装相关包 pnpm install koa koa-router mysql2 新建数据库 USE notes_app;DROP TABLE IF EXISTS notes_categories;CREATE TABLE IF NOT EXISTS notes_categories (id INT AUTO_INCREMENT PRIM…

财务数据分析?奥威BI数据可视化工具很擅长

BI数据可视化工具通常是可以用户各行各业&#xff0c;用于不同主题的数据可视化分析&#xff0c;但面对财务数据分析这块难啃的骨头&#xff0c;能够好好地完成的&#xff0c;还真不多。接下来要介绍的这款BI数据可视化工具不仅拥有内存行列计算模型这样的智能财务指标计算功能…

25 | 不破不立:掌握代码级测试的基本理念与方法

代码级测试的测试方法一定是一套测试方法的集合&#xff0c;而不是一个测试方法。 代码错误&#xff0c;可以划分为“有特征”的错误和“无特征”的错误两大类。其中&#xff0c;“有特征”的错误&#xff0c;又可以进一步细分为语法特征错误、边界行为特征错误和经验特征错误&…