当前位置: 首页 > article >正文

QML 之过渡

文章目录

    • 过渡
      • 示例 1:透明度渐变
        • 功能介绍:
      • 示例 2:颜色渐变
        • 功能介绍:
      • 示例 3:大小变化
        • 功能介绍:
      • 示例 4:位置移动
        • 功能介绍:
      • 总结


过渡

过渡是指界面中元素从一个状态变换到另一个状态时的平滑过程。它让界面显得更加自然和流畅。例如,一个按钮从灰色变为绿色,一个图形从一个位置移动到另一个位置,或者透明度逐渐变化。这些视觉效果让用户体验更舒适。

QML 中,过渡是由 Transition 元素定义的。通过为组件的 transitions 属性添加 Transition,我们可以指定在状态切换时使用的动画效果。Transition 通常会定义开始状态(from)和结束状态(to),并包含一系列动画(animations),例如 NumberAnimationColorAnimation 等。

以下是几个简单的例子,逐步展示如何使用过渡效果。


示例 1:透明度渐变

在这个例子中,我们让一个矩形在可见和隐藏状态之间切换时,透明度逐渐变化,而不是瞬间跳变。

import QtQuick
import QtQuick.Controls

Rectangle {
    width: 200
    height: 200
    color: "lightgray"

    Rectangle {
        id: rectangle
        width: 100
        height: 100
        anchors.centerIn: parent
        color: "blue"
        state: "visibleState"

        states: [
            State { name: "visibleState"; PropertyChanges { target: rectangle; opacity: 1 } },
            State { name: "hiddenState"; PropertyChanges { target: rectangle; opacity: 0 } }
        ]

        transitions: Transition {
            from: "*"
            to: "*"
            NumberAnimation { properties: "opacity"; duration: 1000 }
        }
    }

    MouseArea {
        anchors.fill: parent
        onClicked: {
            rectangle.state = rectangle.state === "visibleState" ? "hiddenState" : "visibleState";
        }
    }
}
功能介绍:
  1. 定义了两个状态:
    • visibleState:矩形完全可见(opacity: 1)。
    • hiddenState:矩形完全隐藏(opacity: 0)。
  2. 添加了一个 Transition,通过 NumberAnimation 实现透明度的平滑变化,持续时间为 1000 毫秒。

示例 2:颜色渐变

为一个矩形添加过渡效果,当点击切换时,矩形的颜色会平滑地变化。

import QtQuick
import QtQuick.Controls

Rectangle {
    width: 300
    height: 200
    color: "white"

    Rectangle {
        id: rectangle
        width: 100
        height: 100
        anchors.centerIn: parent
        color: "blue"
        state: "normal"

        states: [
            State { name: "normal"; PropertyChanges { target: rectangle; color: "blue" } },
            State { name: "highlighted"; PropertyChanges { target: rectangle; color: "red" } }
        ]

        transitions: Transition {
            from: "*"
            to: "*"
            ColorAnimation { properties: "color"; duration: 800 }
        }
    }

    MouseArea {
        anchors.fill: parent
        onClicked: {
            rectangle.state = rectangle.state === "normal" ? "highlighted" : "normal";
        }
    }
}
功能介绍:
  1. 定义了两种状态:
    • normal:矩形为蓝色。
    • highlighted:矩形为红色。
  2. 添加了 ColorAnimation,实现颜色的平滑过渡,持续时间为 800 毫秒。

示例 3:大小变化

在这个例子中,我们实现了矩形在不同状态下大小的平滑变化。

import QtQuick
import QtQuick.Controls

Rectangle {
    width: 300
    height: 200
    color: "white"

    Rectangle {
        id: rectangle
        width: 100
        height: 100
        anchors.centerIn: parent
        color: "blue"
        state: "small"

        states: [
            State { name: "small"; PropertyChanges { target: rectangle; scale: 1 } },
            State { name: "large"; PropertyChanges { target: rectangle; scale: 2 } }
        ]

        transitions: Transition {
            from: "*"
            to: "*"
            ScaleAnimation { duration: 500 }
        }
    }

    MouseArea {
        anchors.fill: parent
        onClicked: {
            rectangle.state = rectangle.state === "small" ? "large" : "small";
        }
    }
}
功能介绍:
  1. 定义了两个状态:
    • small:矩形为正常大小。
    • large:矩形放大 2 倍。
  2. 使用 ScaleAnimation 实现大小变化的平滑过渡,持续时间为 500 毫秒。

示例 4:位置移动

为一个矩形添加位置的平滑移动效果。

import QtQuick
import QtQuick.Controls

Rectangle {
    width: 400
    height: 200
    color: "white"

    Rectangle {
        id: rectangle
        width: 50
        height: 50
        color: "blue"
        state: "left"
        x: 50
        y: 75

        states: [
            State { name: "left"; PropertyChanges { target: rectangle; x: 50 } },
            State { name: "right"; PropertyChanges { target: rectangle; x: 300 } }
        ]

        transitions: Transition {
            from: "*"
            to: "*"
            NumberAnimation { properties: "x"; duration: 700 }
        }
    }

    MouseArea {
        anchors.fill: parent
        onClicked: {
            rectangle.state = rectangle.state === "left" ? "right" : "left";
        }
    }
}
功能介绍:
  1. 定义了两个状态:
    • left:矩形在左侧(x: 50)。
    • right:矩形移动到右侧(x: 300)。
  2. 使用 NumberAnimation 让矩形在左右两侧之间平滑移动,持续时间为 700 毫秒。

总结

过渡是 QML 中实现平滑视觉效果的重要工具。通过 Transition 和多种动画(如 NumberAnimationColorAnimationScaleAnimation),我们可以轻松地为元素的状态切换增加动态效果。这些效果不仅让界面更加生动,还能提升用户的操作体验。无论是透明度渐变颜色变化,还是更复杂的位置移动大小调整,都可以通过简单的 QML 代码实现。


http://www.kler.cn/a/456705.html

相关文章:

  • 正弦函数解析(sin.rs)
  • C++ 设计模式:观察者模式(Observer Pattern)
  • LLMs之o3:《Deliberative Alignment: Reasoning Enables Safer Language Models》翻译与解读
  • 模电面试——设计题及综合分析题0x01(含答案)
  • AR 模型的功率谱
  • 【Agent】Chatbot、Copilot与Agent如何帮助我们的提升效率?
  • MySQL Workbench菜单汉化为中文
  • WPF使用资源定义和样式资源,解耦视图与逻辑(较多样式重复的时候使用)
  • 有没有免费提取音频的软件?音频编辑软件介绍!
  • 【深度学习基础之多尺度特征提取】特征金字塔(Feature Pyramid)是如何在深度学习网络中提取多尺度特征的?附代码
  • curl -fsSL https://get.docker.com|sh 解释命令
  • Pytorch | 利用GRA针对CIFAR10上的ResNet分类器进行对抗攻击
  • doris集群存储目录切换
  • Function.prototype和Object.prototype 的区别
  • 【自动驾驶】3 激光雷达③
  • webflux版定时任务实现方案
  • LeetCode 242. 有效的字母异位词 (C++实现)
  • 超短波自组网如何守护森防安全?
  • Jmeter自学【8】- 使用JMeter模拟设备通过MQTT发送数据
  • AI开发 - 算法基础 递归 的概念和入门(一) 递归算法的常见应用 PYTHON
  • STM32第十一课:STM32-基于标准库的42步进电机的简单IO控制(附电机教程,看到即赚到)
  • Gavin Wood 的 Polkadot 2024 年度回顾:技术突破与未来的无限可能
  • 汽车的hmi设计还能有哪些创新?要从哪些方面下手
  • 接口测试面试题
  • 【网络】什么是VLAN(Virtual Local Area Network虚拟局域网)?物理网络划分多个子网络的技术
  • 最新的序列数据预测模型SOFTS详解