信息发布→ 登录 注册 退出

Flutter实现渐变色加描边字体效果

发布时间:2026-01-11

点击量:
目录
  • 写在前面
  • 内容
    • 实现描边
    • 实现渐变
    • 一些调整
  • 参考

    写在前面

    实现如下图的效果,这个数字的内部和外部都有渐变色。

    内容

    实现描边

    在网上搜索一轮,可以看到通过用 Stack,来让两个 Text叠加,并对上一个 Text设置外部描边,就可以得到如下的效果。

     Stack(
                alignment: Alignment.center,
                children: [
                  Text(
                    '100',
                    style: TextStyle(
                        fontSize: 40,
                        fontWeight: FontWeight.bold,
                        foreground: Paint()
                          ..style = PaintingStyle.stroke
                          ..strokeWidth = 6
                          ..color = Colors.black),
                  ),
                  Text(
                    '100',
                    style: TextStyle(
                        color: Colors.white,
                        fontSize: 40,
                        fontWeight: FontWeight.bold),
                  ),
                ],
              )
    

    实现渐变

    颜色的渐变使用 ShaderMask来进行处理,它可以帮我们计算出文字的矩形,然后我们直接设置给 LinearGradient即可。

    在使用 ShaderMask的时候,字体的颜色需要是白色。由于描边的 Text 我们使用 foreground来添加描边,故颜色的设置也应该在这里处理,不能像另一个 Text 一样,在 TextStyle 里的 color属性设置,否则会报错。

      Stack(
                alignment: Alignment.center,
                children: [
                  ShaderMask(
                    shaderCallback: (Rect bounds) {
                      return LinearGradient(
                        begin: Alignment.topCenter,
                        end: Alignment.bottomCenter,
                        colors: [Color(0xFF8F1FFF), Color(0xFFFF00FF)],
                      ).createShader(Offset.zero & bounds.size);
                    },
                    child: Text(
                      '100',
                      style: TextStyle(
                          fontSize: 40,
                          fontWeight: FontWeight.bold,
                          foreground: Paint()
                            ..style = PaintingStyle.stroke
                            ..strokeWidth = 6
                            ..color = Colors.white),
                    ),
                  ),
                  ShaderMask(
                    shaderCallback: (Rect bounds) {
                      return LinearGradient(
                        begin: Alignment.topCenter,
                        end: Alignment.bottomCenter,
                        colors: [Colors.white, Color(0xFFFFBDE9)],
                      ).createShader(Offset.zero & bounds.size);
                    },
                    child: Text(
                      '100',
                      style: TextStyle(
                          color: Colors.white,
                          fontSize: 40,
                          fontWeight: FontWeight.bold),
                    ),
                  )
                ],
              )
    

    一些调整

    上面已经基本实现了我们最初的效果,但仍存在一点问题,就是文字描边的边缘部分有一些露白的情况,这是因为描边的 strokeWidth有些大,超过了文字的矩形范围,而我们的渐变渲染范围只在矩形内。

    在这里可以看到是有部分越过了左右边界:

    如果用英文字符来看的话,会更明显:

    针对这些情况,我目前是两种处理:

    • 对于左右边界的情况,给文字前后添加空白字符:

    • 对于上下边界的情况,调整 TextStyle里 height属性:

    ShaderMask(
                    shaderCallback: (Rect bounds) {
                      return LinearGradient(
                        begin: Alignment.topCenter,
                        end: Alignment.bottomCenter,
                        colors: [Color(0xFF8F1FFF), Color(0xFFFF00FF)],
                      ).createShader(Offset.zero & bounds.size);
                    },
                    child: Text(
                      'you',
                      style: TextStyle(
                          fontSize: 40,
                          height: 1.4,
                          fontWeight: FontWeight.bold,
                          foreground: Paint()
                            ..style = PaintingStyle.stroke
                            ..strokeWidth = 6
                            ..color = Colors.white),
                    ),
                  )

    参考

    How to decorate text stroke in Flutter?
    How to create gradient text in Flutter

    到此这篇关于Flutters实现渐变色加描边字体效果的文章就介绍到这了。希望对大家的学习有所帮助,也希望大家多多支持。

    在线客服
    服务热线

    服务热线

    4008888355

    微信咨询
    二维码
    返回顶部
    ×二维码

    截屏,微信识别二维码

    打开微信

    微信号已复制,请打开微信添加咨询详情!