qml没有ElevationAnimation,qml 当鼠标进入Rectangle时,Rectangle出现外阴影,请给出代码
时间: 2024-06-10 19:10:41 浏览: 150
以下是一种实现方式:
```
Rectangle {
id: rect
width: 100
height: 100
color: "white"
// 阴影效果
property real shadowRadius: 5
property real shadowOffsetX: 0
property real shadowOffsetY: 0
property color shadowColor: "#80000000"
// 鼠标进入时触发动画
MouseArea {
anchors.fill: parent
hoverEnabled: true
onEntered: {
rect.state = "hover"
}
onExited: {
rect.state = "normal"
}
}
// 定义状态
states: [
State {
name: "normal"
PropertyChanges {
target: rect
shadowRadius: 0
shadowOffsetX: 0
shadowOffsetY: 0
}
},
State {
name: "hover"
PropertyChanges {
target: rect
shadowRadius: 5
shadowOffsetX: 0
shadowOffsetY: 5
}
}
]
// 定义过渡效果
transitions: Transition {
NumberAnimation {
properties: "shadowRadius, shadowOffsetX, shadowOffsetY"
duration: 500
easing.type: Easing.InOutQuad
}
}
// 绘制阴影
layer.enabled: true
layer.effect: ShaderEffect {
property real radius: rect.shadowRadius
property real dx: rect.shadowOffsetX
property real dy: rect.shadowOffsetY
fragmentShader: "
uniform lowp vec4 qt_TexCoord0;
uniform lowp sampler2D qt_Texture0;
uniform lowp vec4 color;
uniform lowp float radius;
uniform lowp float dx;
uniform lowp float dy;
varying highp vec2 qt_TexCoord0Coord;
void main()
{
lowp vec4 color = texture2D(qt_Texture0, qt_TexCoord0Coord);
lowp vec3 shadowCoord = vec3(qt_TexCoord0Coord - vec2(dx, dy), 0.0);
lowp float shadow = 1.0 - smoothstep(0.0, radius, length(shadowCoord.xy));
gl_FragColor = mix(color, vec4(0.0, 0.0, 0.0, shadow), shadow);
}"
}
}
```
在上面的代码中,我们使用了一个状态机来控制阴影的显示效果。当鼠标进入时,我们将状态设置为“hover”,阴影的半径、X轴偏移和Y轴偏移都会发生变化,触发动画效果。当鼠标离开时,我们将状态设置为“normal”,阴影效果将恢复到默认状态,触发动画效果。
在绘制阴影时,我们使用了一个ShaderEffect来处理。这里我们使用了一个简单的高斯模糊算法来实现阴影效果,可以根据需要进行调整。
阅读全文