Flutter中如何仅为文字描边添加滤镜效果?
Flutter 仅为文字描边添加 BackdropFilter 效果
解决方案
要实现仅文字描边应用滤镜的效果,你需要将描边文字和主体文字分层处理:用Stack叠加两个文字组件,底层是带BackdropFilter的描边文字,上层是实心主体文字(覆盖描边内部区域,避免滤镜影响文字主体)。同时需要调整Marquee的使用方式,改用child参数传入自定义Widget,而非直接传字符串。
完整修改代码
import 'package:flutter/material.dart'; import 'package:google_fonts/google_fonts.dart'; import 'package:marquee/marquee.dart'; class SplashText extends StatelessWidget { final int strokeOpacity; final double fontsize; final TextDirection direction; final double velocity; final bool enabled; // 新增:允许自定义滤镜效果 final ImageFilter? filter; // 新增:文字主体颜色 final Color textColor; const SplashText({ super.key, this.fontsize = 138, this.strokeOpacity = 50, this.velocity = 30.0, this.direction = TextDirection.ltr, this.enabled = true, this.filter = const ImageFilter.blur(sigmaX: 3, sigmaY: 3), this.textColor = Colors.black, }); Widget _buildStyledText() { return Stack( alignment: Alignment.center, children: [ // 底层:带滤镜的描边文字 BackdropFilter( filter: filter!, child: Text( "EXAMPLE EXAMPLE", style: GoogleFonts.roboto( letterSpacing: -2, wordSpacing: -12, fontSize: fontsize, height: 0.8, fontWeight: FontWeight.w600, foreground: Paint() ..style = PaintingStyle.stroke ..strokeWidth = 2.54 ..color = Colors.white.withAlpha(strokeOpacity), ), ), ), // 上层:实心主体文字,覆盖描边内部,避免滤镜影响 Text( "EXAMPLE EXAMPLE", style: GoogleFonts.roboto( letterSpacing: -2, wordSpacing: -12, fontSize: fontsize, height: 0.8, fontWeight: FontWeight.w600, color: textColor, ), ), ], ); } @override Widget build(BuildContext context) { if (!enabled) { return SizedBox( height: fontsize * 0.8, child: SingleChildScrollView( scrollDirection: Axis.horizontal, child: _buildStyledText(), ), ); } return SizedBox( height: fontsize, child: Marquee( // 改用child传入自定义分层文字 child: _buildStyledText(), // 动画属性保留原设置 scrollAxis: Axis.horizontal, textDirection: direction, crossAxisAlignment: CrossAxisAlignment.start, blankSpace: 20.0, velocity: velocity, pauseAfterRound: const Duration(seconds: 0), startPadding: 20.0, accelerationDuration: const Duration(seconds: 1), accelerationCurve: Curves.linear, decelerationDuration: const Duration(milliseconds: 500), decelerationCurve: Curves.easeOut, ), ); } }
关键说明
- 分层设计:
- 底层
BackdropFilter仅作用于描边文字,让描边下方的背景应用滤镜效果。 - 上层实心文字完全覆盖描边内部区域,确保文字主体不受滤镜影响。
- 底层
- Marquee适配:
- 原代码使用
Marquee的text参数只能传入字符串,改用child参数可传入自定义Stack组件,实现动画效果的同时保留分层滤镜。
- 原代码使用
- 可扩展性:
- 新增了
filter和textColor参数,方便你自定义滤镜类型(如模糊、颜色矩阵等)和文字主体颜色。
- 新增了
内容的提问来源于stack exchange,提问作者user23331216
相关产品推荐
相关产品推荐

