如何用Flutter实现目标UI效果?用BackdropFilter不对能否用Container阴影实现

不能直接通过Container的shadow属性实现你需要的溢出毛玻璃效果,Container自带的shadow属性仅支持生成普通投影,没有背景模糊的磨砂效果,你需要组合多个组件实现:
- 首先给承载组件的父容器设置
clipBehavior: Clip.none,否则溢出的模糊部分会被默认裁剪,这是大部分人无法实现溢出效果的核心原因 - 用Stack组件叠放两层:底层是尺寸比实际UI大一圈的模糊层,上层是你的实际内容容器
- 模糊层用BackdropFilter实现对应磨砂效果,调整模糊半径、颜色透明度和偏移量,匹配你要的视觉效果
可参考以下示例代码:
import 'dart:ui'; import 'package:flutter/material.dart'; class FrostedOverflowWidget extends StatelessWidget { const FrostedOverflowWidget({super.key}); @override Widget build(BuildContext context) { return Scaffold( backgroundColor: Colors.blueGrey, body: Center( child: Stack( clipBehavior: Clip.none, // 核心:允许子组件溢出不裁剪 children: [ // 底层溢出毛玻璃层 Positioned( top: -6, left: -6, right: -6, bottom: -6, child: BackdropFilter( filter: ImageFilter.blur(sigmaX: 16, sigmaY: 16), child: Container( decoration: BoxDecoration( color: Colors.white.withOpacity(0.15), borderRadius: BorderRadius.circular(20), ), ), ), ), // 上层实际内容容器 Container( padding: const EdgeInsets.symmetric(horizontal: 24, vertical: 14), decoration: BoxDecoration( color: Colors.white.withOpacity(0.25), borderRadius: BorderRadius.circular(16), border: Border.all(color: Colors.white.withOpacity(0.3), width: 1), ), child: const Text( '示例按钮', style: TextStyle(color: Colors.white, fontSize: 16, fontWeight: FontWeight.w500), ), ), ], ), ), ); } }
如果追求更简单的实现,也可以用新版Flutter提供的BlurStyle.outer参数配置BoxShadow,仅能实现近似效果,精细度比叠层方案低:
Container( padding: const EdgeInsets.symmetric(horizontal: 24, vertical: 14), decoration: BoxDecoration( color: Colors.white.withOpacity(0.25), borderRadius: BorderRadius.circular(16), border: Border.all(color: Colors.white.withOpacity(0.3), width: 1), boxShadow: [ BoxShadow( color: Colors.white.withOpacity(0.2), blurRadius: 12, spreadRadius: 4, blurStyle: BlurStyle.outer, ) ], ), child: const Text( '示例按钮', style: TextStyle(color: Colors.white, fontSize: 16, fontWeight: FontWeight.w500), ), )
内容的提问来源于stack exchange,提问作者Vu Thanh
相关产品推荐
相关产品推荐

