qml实现一个完整的水波纹
时间: 2024-02-05 13:14:16 浏览: 111
在 QML 中,可以通过使用 ShaderEffectItem 来实现水波纹效果。ShaderEffectItem 是一个可以嵌入 OpenGL 着色器程序的 QML 组件,可以用来实现各种各样的视觉效果。
下面是一个实现水波纹效果的例子:
```qml
import QtQuick 2.0
Rectangle {
width: 400
height: 400
Image {
id: image
source: "image.jpg"
anchors.fill: parent
}
ShaderEffectItem {
id: shaderEffect
anchors.fill: parent
property real amplitude: 0.04
property real frequency: 30.0
property real speed: 0.1
property real time: 0.0
fragmentShader: "
uniform highp sampler2D source;
uniform highp float amplitude;
uniform highp float frequency;
uniform highp float speed;
uniform highp float time;
varying highp vec2 qt_TexCoord0;
void main() {
highp vec2 coord = qt_TexCoord0;
highp float offset = amplitude * sin(time + coord.y * frequency + coord.x * frequency * 2.0 + speed * time);
highp vec4 color = texture2D(source, vec2(coord.x, coord.y + offset));
gl_FragColor = color;
}"
Rectangle {
anchors.fill: parent
color: "transparent"
Keys.onPressed: {
shaderEffect.time += 0.1
}
}
}
}
```
该例子中,我们使用了一个图像作为背景,并在其上叠加了一个 ShaderEffectItem。ShaderEffectItem 的 fragmentShader 属性中定义了一个着色器程序,用来计算每个像素的颜色。
着色器程序中,我们使用了一个 sine 函数来模拟水波纹效果。其中 amplitude、frequency 和 speed 属性控制波纹的振幅、频率和速度。time 属性用来控制动画时间。在 Keys.onPressed 事件中,我们每按下一次键盘,就将 time 属性增加 0.1,从而控制水波纹的动画效果。
你可以将该例子中的 image.source 替换成你自己的图片路径,以实现不同的水波纹效果。
阅读全文