Flutter Liquid Glass 🪟魔法指南:让你的界面闪耀光彩

2025 年 9 月 15 日苹果重磅推出 iOS26,在界面引入全新的 Liquid Glass(液态玻璃)设计语言,让系统控件具有玻璃质感、透明折射和动态效果。

作者也是迫不及待地下载体验了一番,用起来还是十分丝滑酷炫的🎉🎉🎉,是苹果继 iOS 7 和 14 之后的一重大革新。

对 Flutter 开发者来说😁😁😁,也是一种全新的设计风格了。

那么作为 Flutter 界的新兵蛋子,我必然要尝尝咸淡,自己写👋👋👋那是不可能的。

因此,尝试了网上很多开源的液态玻璃库,还是有不少收获的,在此分享给大家。


1️⃣ 着色器(Shader)实现

指南针\]([GitHub - xhzq233/liquid_glass_example: Example of liquid glass effect in Flutter](https://link.juejin.cn?target=https%3A%2F%2Fgithub.com%2Fxhzq233%2Fliquid_glass_example "https://github.com/xhzq233/liquid_glass_example")) ![在这里插入图片描述](https://oss.xyyzone.com/jishuzhan/article/1971151063492902914/f09baf19cfe6276df6c468847f732a8a.webp) ### 🔹 一、Shader 原理 液态玻璃的实现靠 GPU Shader 来做图像处理: 1. **形状定义**:用 SDF(Signed Distance Field)定义玻璃的区域(矩形 + 圆角)。 2. **背景折射**:在玻璃区域内,用一个偏移的 UV 坐标采样背景,让背景产生扭曲效果,看起来像"玻璃折射"。 3. **光照和阴影**:在边缘和中心添加光照/阴影,让玻璃有厚度和质感。 4. **最终混合**:玻璃区域 → 使用折射后的背景;非玻璃区域 → 保持原始背景。 ### 🔹 二、Flutter 使用方法 #### 1. 添加 shader 文件 在 `assets/shaders/liquidglass.frag` 写入你的代码,并在 `pubspec.yaml` 声明: ```yaml flutter: assets: - assets/shaders/liquidglass.frag ``` #### 2. 在 Dart 中加载 shader ```dart import 'dart:ui' as ui; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; late ui.FragmentShader shader; Future main() async { WidgetsFlutterBinding.ensureInitialized(); // 1. 加载 shader 程序 final program = await ui.FragmentProgram.fromAsset('shaders/liquidglass.frag'); // 2. 创建 shader 实例 shader = program.fragmentShader(); runApp(const MyApp()); } ``` #### 3. 在 Widget 中使用 ```dart class LiquidGlassCard extends StatelessWidget { final Widget child; const LiquidGlassCard({super.key, required this.child}); @override Widget build(BuildContext context) { return CustomPaint( painter: _GlassPainter(), child: child, ); } } class _GlassPainter extends CustomPainter { @override void paint(Canvas canvas, Size size) { // 给 shader 传入 uniform 参数 shader.setFloat(0, size.width); // u_resolution.x shader.setFloat(1, size.height); // u_resolution.y shader.setFloat(2, size.width/2); // u_mouse.x (例子:居中) shader.setFloat(3, size.height/2);// u_mouse.y // 用 Paint 绘制 final paint = Paint()..shader = shader; canvas.drawRect(Offset.zero & size, paint); } @override bool shouldRepaint(CustomPainter oldDelegate) => true; } ``` *** ** * ** *** ## **2️⃣ oc_liquid_glass** \[指南针\]([oc_liquid_glass example \| Flutter package](https://link.juejin.cn?target=https%3A%2F%2Fpub.dev%2Fpackages%2Foc_liquid_glass%2Fexample "https://pub.dev/packages/oc_liquid_glass/example")) ![在这里插入图片描述](https://oss.xyyzone.com/jishuzhan/article/1971151063492902914/ba4bde1734a8c28636db41e0f8d672e8.webp) 这个官方收录的实现库,是作者体验下来最好用的一个了,接下就着重介绍一下 oc_liquid_glass。 下面展示两个核心场景:**固定玻璃效果** 与 **可拖拽按钮**。 ### 一、基本液态玻璃效果 ```dart OCLiquidGlassGroup( // 全局液态玻璃效果配置 settings: OCLiquidGlassSettings( refractStrength: refractStrength, // 折射强度 blurRadiusPx: blurRadiusPx, // 模糊半径 specStrength: specStrength, // 高光亮度 blendPx: blendPx, // 边缘过渡范围 distortFalloffPx: distortFalloffPx, // 扭曲衰减范围 specAngle: specAngle, // 高光角度 specWidth: specWidth, // 高光宽度 specPower: specPower, // 高光锐利度 lightbandColor: Colors.black, // 光带颜色 ), // 子组件:单个玻璃容器 child: OCLiquidGlass( borderRadius: 100, // 圆角 color: primaryColor.withValues(alpha: colorAlpha), // 玻璃色 + 透明度 child: child, // 放入需要展示的内容 ), ) ``` > 📌 要点: > > 1. `settings` 配置整个组的基本属性,`borderRadius` 和 `color + alpha` 控制单个玻璃容器的整体透明度与色调。 > 2. `OCLiquidGlassGroup` 可以包含多个 `OCLiquidGlass`,同一组内的玻璃会自然融合。 ### 二、可拖拽液态玻璃按钮 ```dart LayoutBuilder( builder: (context, constraints) { // 初始化按钮位置:底部居中 _position1 ??= Offset( (constraints.maxWidth - 100) / 2, // 水平居中 (constraints.maxHeight - 100) - 70, // 距底部 70 ); return Stack( children: [ // 页面内容 SingleChildScrollView( child: Column( children: [ UserInfoCard(), SportTaskPage(items: controller.tasks), const SizedBox(height: 50), ], ), ), // 可拖拽的液态玻璃按钮 Positioned( left: _position1!.dx, top: _position1!.dy, child: GestureDetector( onPanUpdate: (details) { setState(() { // 更新位置并限制在屏幕范围内 _position1 = Offset( (_position1!.dx + details.delta.dx) .clamp(0.0, constraints.maxWidth - 100), (_position1!.dy + details.delta.dy) .clamp(0.0, constraints.maxHeight - 100), ); }); }, child: Center( child: LiquidGlass( colorAlpha: 0.5, // 半透明玻璃 child: StartTrainingPage(items: controller.tasks), // 按钮内容 ), ), ), ), ], ); }, ); ``` > 📌 要点: > > 1. `Positioned + GestureDetector` 实现拖拽效果。 > 2. `LayoutBuilder` 保证按钮在不同屏幕尺寸下能正确计算初始位置。 > 3. `LiquidGlass` 渲染出玻璃质感,内部放置自定义按钮。 ### 三、效果演示 可拖动的液态玻璃按钮 \& 液态玻璃底部导航栏: ![Screen recording](https://oss.xyyzone.com/jishuzhan/article/1971151063492902914/935dbcfeac48972592d7830b2e18b801.webp) *** ** * ** *** ## **3️⃣ 其他平台扩展** ### 一、React 实现(3D 模型液态玻璃) \[指南针\]([React Bits - Fluid Glass](https://link.juejin.cn?target=https%3A%2F%2Freactbits.dev%2Fcomponents%2Ffluid-glass "https://reactbits.dev/components/fluid-glass")) ![React 液态玻璃示意](https://oss.xyyzone.com/jishuzhan/article/1971151063492902914/ad446940714a1f967ea2eddf7a46e8d0.webp) **核心原理:** 1. **3D 模型渲染** * 组件 `FluidGlass` 接收 `mode` 参数,可选择 `"lens"`、`"bar"` 或 `"cube"`。 * 对应模型需放在 `public/assets/3d` 目录下,例如 `lens.glb`。 * 使用 `three.js` 或 `react-three-fiber` 加载 `.glb` 文件,实现 3D 渲染。 2. **液态玻璃光学参数** * `scale`:模型缩放比例。 * `ior`(折射率):控制光线通过玻璃时的弯曲程度。 * `thickness`:玻璃厚度,影响光学扭曲。 * `chromaticAberration`:色差,模拟光在不同波长下的折射差异。 * `anisotropy`:各向异性,影响表面不同方向折射强度。 3. **可扩展性** * `lensProps`、`barProps`、`cubeProps` 可分别定制不同模型参数。 * 支持多模型组合,实现多样化液态玻璃效果。 *** ** * ** *** ### 二、Vue 实现(前端液态玻璃) \[指南针\]([Vue Bits - Glass Surface](https://link.juejin.cn?target=https%3A%2F%2Fvue-bits.dev%2Fcomponents%2Fglass-surface "https://vue-bits.dev/components/glass-surface")) ![Vue 液态玻璃示意](https://oss.xyyzone.com/jishuzhan/article/1971151063492902914/ec05fa0ed4d9ba6fd74554e5999a07a6.webp) **核心理论可概括为三点:** 1. **背景模糊(Blur)** * 通过 `backdrop-filter: blur()` 或高斯模糊让玻璃背后的内容柔和,形成半透明玻璃视觉效果。 2. **折射扭曲(Displacement / Refraction)** * 利用位移映射(SVG `feDisplacementMap` 或 Shader)按 RGB 通道偏移背景,实现光线穿过玻璃时的折射和液态效果。 3. **光泽高光(Specular Highlights)** * 通过光带、颜色混合、透明叠加等方式在玻璃表面生成高光,使玻璃看起来有反光和立体感。 *** ** * ** *** ## **4️⃣ 总结** `液态玻璃` 不仅是一种视觉效果,更是现代 UI 设计对真实光学现象的模拟与探索。 无论是在移动端的 iOS 界面,还是在 **Flutter** 、**React** 、**Vue** 等前端开发中,它都为界面增添了质感与交互趣味。 **👏👏👏让我们用液态玻璃,让界面更酷、更灵动!**

相关推荐
Miss Stone2 小时前
css练习
前端·javascript·css
Nicholas682 小时前
flutter视频播放器video_player_avfoundation之FVPVideoPlayer(二)
前端
文心快码BaiduComate2 小时前
一人即团队,SubAgent引爆开发者新范式
前端·后端·程序员
掘金一周2 小时前
2025年还有前端不会Nodejs ?| 掘金一周 9.25
android·前端·后端
Sailing2 小时前
前端拖拽,看似简单,其实处处是坑
前端·javascript·面试
RoyLin3 小时前
前端·后端·node.js
RoyLin3 小时前
C++ 基础与核心概念
前端·后端·node.js
记得坚持3 小时前
vue2插槽
前端·vue.js
臣臣臣臣臣什么臣3 小时前
uni-app 多文件上传:直接循环调用 uni.uploadFile 实现(并行 / 串行双模式)
android·前端