You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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,
      ),
    );
  }
}

关键说明

  1. 分层设计:
    • 底层BackdropFilter仅作用于描边文字,让描边下方的背景应用滤镜效果。
    • 上层实心文字完全覆盖描边内部区域,确保文字主体不受滤镜影响。
  2. Marquee适配:
    • 原代码使用Marquee的text参数只能传入字符串,改用child参数可传入自定义Stack组件,实现动画效果的同时保留分层滤镜。
  3. 可扩展性:
    • 新增了filter和textColor参数,方便你自定义滤镜类型(如模糊、颜色矩阵等)和文字主体颜色。

内容的提问来源于stack exchange,提问作者user23331216

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 07:06:09