QML 文字波动与视觉干扰:波浪、倒影、故障
目录Demo 1 波浪跳动演示代码关键逻辑解析Demo 2 倒影镜像演示代码关键逻辑解析Demo 3 故障风效果演示代码关键逻辑解析运行验证扩展复用方向静态文字可以通过规律运动或故意破坏来制造更强的视觉印象。这篇介绍三种效果波浪跳动用正弦函数让字符依次起伏倒影镜像把文字垂直翻转并叠加渐变遮罩故障风则用 RGB 通道分离和随机位移模拟信号干扰。它们分别适合活泼标题、精致展示和赛博朋克风格界面。涉及的核心知识点正弦函数Math.sin()驱动波浪动画Scale变换的yScale: -1实现垂直镜像多层Text叠加模拟 RGB 通道分离Timer实现高频随机位移Demo 1 波浪跳动这个效果把一句话拆成单个字符每个字符根据当前时间和自身索引做正弦运动形成从左到右传播的波浪。以下演示代码来自qml_text/Demo_TextWave.qml为便于阅读只展示了关键代码。演示代码import QtQuick import QtQuick.Layouts DemoPage { id: root title: 波浪跳动 description: 每个字符独立做正弦运动形成波浪状的文字律动效果。 property string fullText: Wave Text Animation property int tickCount: 0 property real amplitude: 10.0 Row { Layout.alignment: Qt.AlignHCenter spacing: 0 Repeater { model: root.fullText.split() Text { text: modelData font.pointSize: 24 font.bold: true color: #1296FF transform: Translate { y: root.amplitude * Math.sin(root.tickCount * 0.12 index * 0.6) } } } } Timer { interval: 30 running: root.visible root.opacity 1 repeat: true onTriggered: root.tickCount } }关键逻辑解析波浪效果的核心公式是y amplitude * sin(tickCount * 0.12 index * 0.6)。其中amplitude是波峰高度tickCount是整数计时器每 30ms 加 1乘以 0.12 后作为时间相位index * 0.6是每个字符的相位差索引越大相位越滞后从而形成左右相继起伏的波浪感。这里用int tickCount代替早期的real t 0.12写法避免浮点数长时间累加产生的精度漂移问题——整数计数不存在累积误差动画跑再久也不会出现波形抖动。字符之间的spacing: 0让文字更紧凑波浪的连续性更好。如果想让波浪更平缓可以减小0.6想让波浪更快可以增大Timer的增量或减小interval。把波浪效果与音乐频谱结合还能让文字起伏随音频节奏变化。Demo 2 倒影镜像这个 demo 将文字垂直翻转并叠加渐变遮罩实现类似水面/镜面的倒影效果。主文字保持清晰倒影从底部向上逐渐透明显得自然。以下演示代码来自qml_text/Demo_TextReflection.qml为便于阅读只展示了关键代码。演示代码import QtQuick import QtQuick.Layouts DemoPage { id: root title: 倒影镜像 description: 将文字垂直翻转并叠加渐变遮罩实现类似水面/镜面的倒影效果。 Item { Layout.fillWidth: true Layout.preferredHeight: 160 Text { id: sourceText text: 倒影镜像 font.pointSize: 32 font.bold: true color: #333 anchors.horizontalCenter: parent.horizontalCenter y: 20 } Text { id: reflectText text: sourceText.text font: sourceText.font color: sourceText.color anchors.horizontalCenter: parent.horizontalCenter y: sourceText.y sourceText.height 4 opacity: 0.35 transform: Scale { origin.x: reflectText.width / 2 origin.y: reflectText.height / 2 yScale: -1 } } Rectangle { anchors.horizontalCenter: parent.horizontalCenter y: reflectText.y width: reflectText.width height: reflectText.height color: transparent gradient: Gradient { GradientStop { position: 0.0; color: #FFFFFF } GradientStop { position: 1.0; color: #00FFFFFF } } } } }关键逻辑解析倒影的实现分三步用sourceText显示正常文字。用reflectText复用主文字的text和font并通过Scale { yScale: -1 }垂直翻转。在倒影上方叠一个从上到下的渐变矩形顶部不透明、底部完全透明让倒影底部自然淡出。Scale的origin设在文字中心保证翻转时位置正确。如果想让倒影更像水面可以给倒影加轻微的透明度呼吸动画或者让倒影在 y 方向上有轻微波动。Demo 3 故障风效果这个 demo 用三层文字叠加中间是白色主文字红色层向右下偏移青色层向左上偏移。每隔 100ms 随机更新偏移量并偶尔让主文字闪烁消失模拟信号不稳定的效果。以下演示代码来自qml_text/Demo_TextGlitch.qml为便于阅读只展示了关键代码。演示代码import QtQuick import QtQuick.Layouts DemoPage { id: root title: 故障风效果 description: 随机位移与 RGB 通道分离模拟视频剪辑中常见的信号干扰 glitch 特效。 Rectangle { Layout.fillWidth: true Layout.preferredHeight: 140 color: #111 radius: 8 Text { id: mainText text: GLITCH 故障风 font.pointSize: 28 font.bold: true font.family: Microsoft YaHei color: white anchors.centerIn: parent } Text { text: mainText.text font: mainText.font color: #FF0000 opacity: 0.75 anchors.centerIn: parent transform: Translate { id: redOffset } } Text { text: mainText.text font: mainText.font color: #00FFFF opacity: 0.75 anchors.centerIn: parent transform: Translate { id: cyanOffset } } Timer { interval: 100 running: root.visible root.opacity 1 repeat: true onTriggered: { redOffset.x Math.random() * 14 - 7 redOffset.y Math.random() * 6 - 3 cyanOffset.x Math.random() * 14 - 7 cyanOffset.y Math.random() * 6 - 3 mainText.opacity Math.random() 0.08 ? 1.0 : 0.0 } } } }关键逻辑解析故障风的核心是随机。每 100ms 触发一次Timer给红色层和青色层分别生成 -7~7 像素之间的随机偏移。由于两层颜色是互补色红/青错位时会在主文字边缘产生色差条纹看起来就像视频信号受到干扰。mainText.opacity Math.random() 0.08 ? 1.0 : 0.0让主文字有 8% 的概率短暂消失模拟老显示器接触不良时的闪烁。如果想让干扰更强烈可以增加随机裁剪条clip 一小块区域做水平位移或者把interval缩短到 50ms。运行验证用 Qt Creator 打开qml_text/CMakeLists.txt按CtrlR运行项目在主界面找到波浪跳动“倒影镜像”故障风三个卡片观察循环效果。扩展复用方向把Demo_TextWave的amplitude、tickCount增量和相位差提取成属性封装成可配置的波浪文字组件。把Demo_TextReflection封装成ReflectText支持调整倒影透明度、渐变高度和翻转方向。把Demo_TextGlitch封装成GlitchText组件暴露text、glitchIntensity、interval等属性。给故障效果增加随机裁剪条让干扰感更强烈。已验证环境Qt 版本Qt 6.8.2、Qt 6.11.1操作系统Windows 11