QML元素 - ZoomBlur

QML 的 ZoomBlur 用于创建镜头缩放模糊效果,模拟元素从中心向外扩散的径向动态模糊,适用于焦点缩放、转场动画、视觉冲击增强等场景。以下是详细使用技巧和优化指南:


1. 基本用法

import QtQuick 2.15
import QtQuick.Effects 1.15  // 确保模块正确引入

Image {
    id: sourceImage
    source: "image.png"
    anchors.fill: parent

    // 应用镜头缩放模糊
    layer.enabled: true
    layer.effect: ZoomBlur {
        anchors.fill: sourceImage
        center: Qt.point(width/2, height/2) // 模糊中心点
        length: 32       // 模糊强度(像素距离)
        samples: 24      // 采样数(影响平滑度)
        transparentBorder: true  // 处理边缘透明区域
    }
}
关键属性
  • center:模糊中心点(默认元素中心),决定模糊扩散的起点。
  • length:模糊强度,值越大拖影越长(0 到 64)。
  • samples:采样数,建议设为 length * 0.75 以上(如 length: 32, samples: 24)。
  • transparentBorder:设为 true 避免边缘黑边。

2. 效果控制

(1) 动态模糊中心
ZoomBlur {
    center: Qt.point(mouseArea.mouseX, mouseArea.mouseY) // 跟随鼠标位置
    length: 40
    samples: 30
}

MouseArea {
    id: mouseArea
    anchors.fill: parent
    hoverEnabled: true
}
(2) 模糊方向与强度
  • 缩放模糊length > 0 时,模拟从中心向外扩散的模糊(类似镜头快速缩放)。
  • 反向模糊:通过负值 length 模拟向内收缩的模糊(需自定义着色器,默认不支持)。

3. 动态效果实现

(1) 转场动画模糊
// 页面切换时添加缩放模糊过渡
ZoomBlur {
    length: pageTransition.progress * 64  // 根据转场进度调整模糊强度
    samples: 32
}

PageTransition {
    id: pageTransition
    // ... 页面切换逻辑
}
(2) 按钮点击缩放反馈
Rectangle {
    id: button
    width: 120
    height: 40
    color: "lightblue"

    layer.effect: ZoomBlur {
        length: button.pressed ? 24 : 0  // 点击时模糊
        center: Qt.point(width/2, height/2)
        samples: 16
        Behavior on length { NumberAnimation { duration: 200 } }
    }

    MouseArea {
        anchors.fill: parent
        onPressed: button.pressed = true
        onReleased: button.pressed = false
    }
}

4. 性能优化

  • 控制 samples 值:在低端设备上建议 ≤ 24
  • 启用缓存:静态模糊设置 cached: true
  • 降采样处理
    layer.textureSize: Qt.size(width/2, height/2)  // 纹理尺寸降为50%
    

5. 常见问题

(1) 模糊效果边缘异常
  • 启用 transparentBorder: true
  • 扩展源图像边界(如 sourceSize: Qt.size(width*1.1, height*1.1))。
(2) 模糊中心偏移
  • 确保 center 坐标正确(相对于元素局部坐标系)。
  • 动态绑定中心点位置:
    center: Qt.point(width*0.2, height*0.8)  // 中心点位于元素左下方
    
(3) 性能卡顿
  • 减少 samples 和 length 值。
  • 避免高频更新模糊属性(如每帧动画)。

6. 进阶技巧

(1) 局部模糊(遮罩裁剪)
Rectangle {
    width: 300
    height: 300
    layer.enabled: true
    layer.effect: OpacityMask {
        maskSource: Rectangle {  // 圆形遮罩
            width: 300
            height: 300
            radius: 150
        }
        ZoomBlur {
            length: 40
            samples: 32
        }
    }
}
(2) 结合颜色叠加
ZoomBlur {
    length: 30
    samples: 24
}

Rectangle {
    anchors.fill: parent
    color: "#6000FF00"  // 叠加半透明绿色层
}
(3) 多效果组合
layer.effect: MultiEffect {
    zoomBlurEnabled: true
    zoomBlurLength: 20
    zoomBlurCenter: Qt.point(0.5, 0.5)  // 中心点比例(Qt6特性)
    // 其他效果(如阴影、颜色调整)
}

7. 与其他模糊效果对比

特性ZoomBlurRadialBlurDirectionalBlur
模糊类型中心向外扩散的缩放模糊围绕中心点旋转/缩放模糊单一方向运动模糊
性能消耗中高(依赖 length中高
适用场景镜头缩放特效、焦点爆炸旋转转场、动态焦点滑动拖影、动态列表

总结

  • 核心作用:模拟镜头快速缩放时的动态模糊,增强视觉冲击力。
  • 关键参数center(焦点)、length(强度)、samples(平滑度)。
  • 适用场景:图片缩放特效、转场动画、按钮交互反馈、游戏技能特效。
  • 优化建议:在桌面端优先使用高 length 和 samples,移动端需谨慎控制性能消耗。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

“不靠谱”的深度体验派

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值