使用 Flutter LinearGradient

简介: 使用 Flutter LinearGradient

LinearGradient 是 2D 线性渐变

BoxDecration 使用 LinearGradient

const LinearGradient({
    this.begin = Alignment.centerLeft,
    this.end = Alignment.centerRight,
    required super.colors,
    super.stops,
    this.tileMode = TileMode.clamp,
    super.transform,
  });
复制代码

begin 和 end

begin,end 决定了渐变的起点和终点,是比例值,所以无论应用在多大尺寸的目标上都没有问题。默认是从左到右水平渐变。

BoxDecoration(
   gradient: LinearGradient(
     colors: <Color>[
       Colors.blue,
       Colors.green
     ], 
     tileMode: TileMode.decal,
   ),
 ));
复制代码

image.png

这就是默认的从左到右水平渐变的效果,不指定 begin,end时的默认值。其实 begin end,可以从任意位置开始

LinearGradient(
    begin: Alignment.center,
    colors: <Color>[
      Colors.blue,
      Colors.green
    ], 
    tileMode: TileMode.decal,
  )
复制代码

image.png

这就是起点从中心开始的效果。

tileMode

我们注意到上面的例子中 tileMode: TileMode.decal 这是为了演示起点的效果。如果是默认值TileMode.clamp 效果是这样的,和 web 中的渐变效果一样。

image.png

tileMode 是一个枚举,还有两个值。TileMode.mirror 是镜像。

image.png

TileMode.repeated 是重复。

image.png

除了 decal 是严格只填充起点到终点的空间外,其它三个选项都会按策略填充空白区域。

stops

stops 是用来调整不同色值的临界点的。如果不指定 stops ,所有颜色平均分配位置。

LinearGradient( 
      colors: <Color>[
        Colors.blue,
        Colors.green,
      ], 
      stops: [0.4,0.6],
      tileMode: TileMode.decal,
    )
复制代码

image.png

本例中,本来 stops:[0.0,1.0],现在把蓝与绿色的临界点向右移动 40%,造成 0%-40% 是纯蓝。40%-60% 之间是蓝色与縁色的渐变区域。

Custumpainter 使用 LinearGradient

绘制渐变矩形

image.png

class MyPainter extends CustomPainter {
  @override
  void paint(Canvas canvas, Size size) {
    var paint = Paint()
      ..shader = LinearGradient(
        colors: <Color>[
          Colors.blue,
          Colors.green,
        ],
        stops: [0, 1],
        tileMode: TileMode.decal,
      ).createShader(Offset(0, 0) & size);
    canvas.drawRect(Rect.fromLTWH(0, 0, 200, 200), paint);
  }
  @override
  bool shouldRepaint(covariant CustomPainter oldDelegate) {
    return false;
  }
}
复制代码

绘制渐变文字

image.png

ShaderMask(
      blendMode: BlendMode.srcATop,
      shaderCallback: (Rect bounds) {
        return LinearGradient(
          colors: <Color>[Colors.green, Colors.red],
          tileMode: TileMode.mirror,
        ).createShader(bounds);
      },
      child: const Text(
        'IAM17 flutter 天天更新'
      ),
)
复制代码

不用 ShaderMask 也可以

Text( 
    'Greetings, planet!', 
     style: TextStyle( 
         fontSize: 40, 
         foreground: Paint() 
         ..shader = ui.Gradient.linear( 
             const Offset(0, 20), 
             const Offset(150, 20),
             <Color>[ 
             Colors.red, 
             Colors.yellow,
             ],
            ) 
          ),
 )


目录
相关文章
【交互 widget】 Flutter BottomSheet
【交互 widget】 Flutter BottomSheet
344 0
【交互 widget】 Flutter BottomSheet
|
Dart 测试技术 开发工具
了解 Flutter 的 Timer 类和 Timer.periodic【Flutter 专题 19】
在构建移动应用程序时,我们经常会遇到必须在一定时间后执行任务的场景。还记得在进入应用程序之前看到闪亮的启动画面吗? 或者我们可能需要一段代码在一段时间后重复执行,比如显示剩余时间限制以填充一次性密码或每秒更改小部件的颜色以创建漂亮的动画。
5565 0
利用Flutter的LayoutBuilder、BoxConstraints创建自适应布局控件
利用Flutter的LayoutBuilder、BoxConstraints创建自适应布局控件
|
Android开发 iOS开发
Flutter应用开发,系统样式改不了?SystemChrome 状态栏、导航栏、屏幕方向……想改就改
Flutter应用开发,系统样式改不了?SystemChrome 状态栏、导航栏、屏幕方向……想改就改
|
Dart API
Dart中Class、mixin、interface三者间关系及异同
Dart中Class、mixin、interface三者间关系及异同
|
10月前
|
前端开发
Flutter 如何绘制文字
Flutter 如何绘制文字
|
10月前
|
存储 设计模式 Dart
Flutter笔记:getX库中的GetView中间件
Flutter笔记:getX库中的GetView中间件
370 0
flutter系列之:按比例缩放的AspectRatio和FractionallySizedBox
我们在构建UI的时候,为了适应不同的屏幕大小,通常需要进行一些自适应的配置,而最常见的自适应就是根据某个宽度或者高度自动进行组件的缩放。 今天要给大家介绍两个可以自动缩放的组件AspectRatio和FractionallySizedBox。
flutter系列之:按比例缩放的AspectRatio和FractionallySizedBox
【交互 widget】Flutter Dialog
【交互 widget】Flutter Dialog
336 0
【交互 widget】Flutter Dialog
Flutter 121: 图解简易 Slider 滑动条
0 基础学习 Flutter,第一百二十一步:简单学习 Slider 滑动条!
1616 0