【写在前面】

毛玻璃效果(Acrylic Effect)是一种常见的 UI 设计风格,它通过模糊背景并添加透明度和噪声效果,使界面元素看起来像是半透明的磨砂玻璃。

本文将介绍如何使用 Qml 实现这种效果,并提供一个完整的示例代码。


【正文开始】

1. 效果图

2. 毛玻璃效果的实现原理

毛玻璃效果的核心是通过模糊背景图像,并叠加透明度和噪声效果来实现。

具体来说,实现毛玻璃效果的步骤如下:

  1. 捕获背景图像:首先需要捕获背景图像,作为模糊效果的输入。
  2. 模糊处理:对捕获的背景图像进行模糊处理,生成模糊效果。
  3. 添加亮度和色调:通过叠加一个半透明的矩形,调整模糊区域的亮度和色调。
  4. 添加噪声效果:在模糊区域上叠加噪声图像,增加磨砂玻璃的质感。

3. 实现毛玻璃效果

DelAcrylic.qml 文件定义了一个自定义的 Qml 组件,用于实现毛玻璃效果。以下是该文件的主要部分:

  • ShaderEffectSource: 用于捕获源项(sourceItem)的内容,并将其作为模糊效果的输入。sourceRect 属性定义了捕获的区域。
ShaderEffectSource {
id: __source
anchors.fill: parent
visible: false
sourceRect: Qt.rect(control.x, control.y, control.width, control.height)
}
  • FastBlur: 对 ShaderEffectSource 的内容进行模糊处理。radius 属性控制模糊的强度。
FastBlur {
id: __fastBlur
anchors.fill: parent
source: __source
radius: 32
}
  • Rectangle: 有两个矩形,第一个矩形用于设置背景的亮度(luminosity),第二个矩形用于设置颜色的色调(colorTint)和透明度(opacityTint)。
Rectangle {
anchors.fill: parent
color: Qt.rgba(1, 1, 1, luminosity)
radius: control.radiusBg
} Rectangle {
anchors.fill: parent
color: Qt.rgba(colorTint.r, colorTint.g, colorTint.b, opacityTint)
radius: control.radiusBg
}
  • Image: 用于添加噪声效果,噪声图像通过 base64 编码嵌入到 Qml 文件中。opacity 属性控制噪声的透明度。
Image {
id: __noiseImage
anchors.fill: parent
source: "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAAEnQAABJ0Ad5mH3gAAAGHaVRYdFhNTDpjb20uYWRvYmUueG1wAAAAAAA8P3hwYWNrZXQgYmVnaW49J++7vycgaWQ9J1c1TTBNcENlaGlIenJlU3pOVGN6a2M5ZCc/Pg0KPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyI+PHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj48cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0idXVpZDpmYWY1YmRkNS1iYTNkLTExZGEtYWQzMS1kMzNkNzUxODJmMWIiIHhtbG5zOnRpZmY9Imh0dHA6Ly9ucy5hZG9iZS5jb20vdGlmZi8xLjAvIj48dGlmZjpPcmllbnRhdGlvbj4xPC90aWZmOk9yaWVudGF0aW9uPjwvcmRmOkRlc2NyaXB0aW9uPjwvcmRmOlJERj48L3g6eG1wbWV0YT4NCjw/eHBhY2tldCBlbmQ9J3cnPz4slJgLAAAMNElEQVRYR02XW1NTd9vGf0nYZEFMVha7JBAIYYihEQVSUQQVtOrUtipVsTPtTOs38KDtUQ+Y6ZfoTI88aT3o2Jk6bUfa4QFEKZWIsgm7ECKQHZu1FpiQQAx5DnyfzHv6n//Jvbl+13Vrvv/++5zRaOSPP/7giy++wGQyMTw8TCgUoquri2QySSgUorm5mcbGRh4/fozT6cTtdvPgwQMMBgPnzp0DYHR0FEmSiEag=="
fillMode: Image.Tile
opacity: 0.02
}

4. 如何使用

main.qml 是示例文件,使用 DelAcrylic 组件并提供了交互式的滑块来控制模糊效果的参数。

以下是该文件的主要部分:

  • Window: 定义了一个窗口,宽度为 750,高度为 500,标题为 "Acrylic Test"。
Window {
width: 750
height: 500
visible: true
title: qsTr("Acrylic Test")
}
  • Image: 作为背景图像,填充整个窗口。
Image {
id: bg
anchors.fill: parent
source: "qrc:/img.jpg"
}
  • DelAcrylic: 使用 DelAcrylic 组件,将其放置在窗口的中心位置,并绑定背景图像作为模糊效果的源项。opacityNoiseopacityTintradiusBlur 属性分别绑定到三个滑块的值。
DelAcrylic {
id: acrylic
x: (bg.width - width) * 0.5
y: (bg.height - height) * 0.5
width: 300
height: 300
sourceItem: bg
opacityNoise: slider1.value
opacityTint: slider2.value
radiusBlur: slider3.value MouseArea {
anchors.fill: parent
drag.target: parent
}
}
  • Column: 包含三个滑块,分别用于控制 opacityNoiseopacityTintradiusBlur 属性。
Column {
Slider {
id: slider1
anchors.horizontalCenter: parent.horizontalCenter
from: 0
to: 1
stepSize: 0.01
value: 0.02
ToolTip.visible: hovered
ToolTip.text: value.toFixed(2) Text {
anchors.left: parent.right
anchors.leftMargin: 10
anchors.verticalCenter: parent.verticalCenter
text: qsTr("opacityNoise")
}
} Slider {
id: slider2
anchors.horizontalCenter: parent.horizontalCenter
from: 0
to: 1
stepSize: 0.01
value: 0
ToolTip.visible: hovered
ToolTip.text: value.toFixed(2) Text {
anchors.left: parent.right
anchors.leftMargin: 10
anchors.verticalCenter: parent.verticalCenter
text: qsTr("opacityTint")
}
} Slider {
id: slider3
from: 0
to: 100
value: 48
ToolTip.visible: hovered
ToolTip.text: value.toFixed(0) Text {
anchors.left: parent.right
anchors.leftMargin: 10
anchors.verticalCenter: parent.verticalCenter
text: qsTr("radiusBlur")
}
}
}

【结语】

通过 DelAcrylic.qmlmain.qml 文件,我们实现了一个具有毛玻璃效果的 Qml 应用程序。DelAcrylic 组件通过模糊背景图像、添加亮度和色调、以及叠加噪声效果,实现了毛玻璃效果。

这种毛玻璃效果可以广泛应用于现代 UI 设计中,特别是在需要模糊背景或实现类似 Acrylic 效果的场景中。通过调整模糊强度、透明度和噪声效果,我们可以创建出丰富多样的视觉效果,提升用户体验。

改进建议:

  • 性能优化:模糊效果可能会对性能产生影响,特别是在高分辨率或复杂场景下。可以考虑优化模糊算法或降低模糊的强度以提高性能。

  • 更多参数控制:可以添加更多的参数控制,例如噪声的类型、模糊的方向等,以提供更丰富的视觉效果。

最后:项目链接(多多star呀.._):

Github: https://github.com/mengps/QmlControls

Gitee: https://gitee.com/MenPenS/QmlControls

Qml 中实现毛玻璃效果的更多相关文章

  1. CSS 奇思妙想 | 全兼容的毛玻璃效果

    通过本文,你能了解到 最基本的使用 CSS backdrop-filter 实现磨砂玻璃(毛玻璃)的效果 在至今不兼容 backdrop-filter 的 firefox 浏览器,如何利用一些技巧性的 ...

  2. qt qml fuzzyPanel 毛玻璃效果

    毛玻璃效果,用qml来写代码真是简短,大爱qml:) [下载地址]http://download.csdn.net/detail/surfsky/8426641 [核心代码] Rectangle{ c ...

  3. CSS3中毛玻璃效果的使用方法

    今天在使用icloud的时候看到苹果icloud官网的毛玻璃效果非常赞,仔细研究了一下它的实现方式,是使用js配合background-image: -webkit-canvas的形式绘制出的毛玻璃背 ...

  4. 使用CSS3制作导航条和毛玻璃效果

    导航条对于每一个Web前端攻城狮来说并不陌生,但是毛玻璃可能会相对陌生一些.简单的说,毛玻璃其实就是让图片或者背景使用相应的方法进行模糊处理.这种效果对用户来说是十分具有视觉冲击力的. 本次分享的主题 ...

  5. Swift 之模糊效果(毛玻璃效果,虚化效果)的实现

    前言: 之前项目中有用到过Objective-C的的模糊效果,感觉很是不错,而且iOS8之后官方SDK也直接提供了可以实现毛玻璃效果的三个类:UIBlurEffect.UIVibrancyEffect ...

  6. iOS模糊效果(毛玻璃效果)的实现

    前一段时间项目中用到毛玻璃效果,那时对UIBlurEffect类和 UIVisualEffectView这两个类做了一部分了解.但当时并没有去特别的深入研究,直到项目做完后,才静下心来好好研究了一番. ...

  7. 【CSS】梯形、平行四边形导航条与毛玻璃效果【转】

    转载出处:http://www.cnblogs.com/Uncle-Keith/p/5943158.html 代码部分有小改动. 导航条对于每一个Web前端攻城狮来说并不陌生,但是毛玻璃可能会相对陌生 ...

  8. android 开发 - 对图片进行虚化(毛玻璃效果,模糊)

    概述 IPAD,IPHONE上首页背景的模糊效果是不是很好看,那么在 Android中如何实现呢.我通过一种方式实现了这样的效果. 开源库名称:anroid-image-blur 一个android ...

  9. 小tip: 使用CSS将图片转换成模糊(毛玻璃)效果

    去年盛夏之时,曾写过“小tip: 使用CSS将图片转换成黑白”一文,本文的模式以及内容其实走得是类似路线.CSS3 → SVG → IE filter → canvas. 前段时间,iOS7不是瓜未熟 ...

  10. 如何取消FLEX里模态窗口的毛玻璃效果

    在Flex里面,比如使用PopUpManager.createPopUp(this,TipWindow,false)第三个参数设成true 会出现毛玻璃效果让CPU飙升,可不可以改变模态窗口的效果,不 ...

随机推荐

  1. 网络应用模型的经典分类:C/S 与 P2P

    网络应用无处不在,从我们日常使用的社交媒体到远程文件传输,网络应用模型是支撑这些通信和服务的基础架构.通常,这些网络应用根据其结构原理可以被大致划分为两大类:C/S(Client/Server)模型和 ...

  2. 反射+特性实现 类和XML文档的序列化反序列化

    1.作用:将实体类的属性(字符串.日期.数值.布而.类)生成为xml文档中的结点,将xml文档的结点值或者属性值填充到实体类的属性值中2.思路:特性.反射.泛型:特性记录xml结点与实体属性的对应关系 ...

  3. python项目实战(二手房屋出租系统)

    文章目录 1.系统概述 2.技术栈 3.系统功能 4.核心代码分析 5. 代码实现 6.实现细节 6.未来改进方向 在当今数字化时代,自动化和数字化管理工具对于提高效率至关重要.在这篇博客中,我们将一 ...

  4. PHP调用Python无返回或提示No Module

    问题:自己通过命令行执行python正常,但通过php调用就没有反应.解决方法:1.首先检查一下php有没有执行权限,简单粗暴的:sudo chmod 777 xxx.php2.Python如果有中文 ...

  5. 在Windows环境下使用AMD显卡运行Stable Diffusion

    现在用的电脑是 21 年配的,当时并没有 AI 相关的需求,各种各样的原因吧,抉择后选择了 AMD 的显卡,但在 2024 年的今天,使用 AI 进行一些工作已不再是什么罕见的需求,所以我也想尝试一下 ...

  6. 基于Hadoop实现的对历年四级单词的词频分析(入门级Hadoop项目)

    前情提要:飞物作者屡次四级考试未能通过,进而恼羞成怒,制作了基于Hadoop实现的对历年四级单词的词频分析项目,希望督促自己尽快通过四级(然而并没有什么卵用) 项目需求:Pycharm.IDEA.Li ...

  7. 【笔记】 STL容器

    [笔记] STL容器 vector vector<int> v; v.push_back(x); v.emplace(x); v.size(); v.erase(v.begin(),v.b ...

  8. 617. 合并二叉树 Golang实现

    题目描述: 给你两棵二叉树: root1 和 root2 . 想象一下,当你将其中一棵覆盖到另一棵之上时,两棵树上的一些节点将会重叠(而另一些不会).你需要将这两棵树合并成一棵新二叉树.合并的规则是: ...

  9. common-dbutils的使用

    1.      介绍 commons-dbutils是Apache组织提供的一个开源 JDBC工具类库,能让我们更简单的使用JDBC.它是一个非常小的类包,花几分钟的时间就能掌握它的使用. 2.    ...

  10. JDK中的动态代理

    江苏 无锡 缪小东 写到代理模式这章,不得不提到JDK中的动态代理,它是java语言自身对动态代理的支持,类似于JDK中在java.util包中提供Observable类和Observer接口提供对观 ...