【发布时间】:2021-10-01 08:55:24
【问题描述】:
我正在寻找一种不使用 ShaderMask() 来创建渐变图标的方法。
为什么没有 ShaderMask ?
因为调用saveLayer() 会分配一个屏幕外缓冲区。将内容绘制到屏幕外缓冲区可能会触发在旧 GPU 中特别慢的渲染目标切换。 (official flutter documentation)
这里是我用 ShaderMask 制作的 GradientIcon。
import 'package:flutter/material.dart';
class GradientIcon extends StatefulWidget {
final IconData? icon;
final double? size;
final Gradient? gradient;
const GradientIcon({
@required this.icon,
@required this.size,
@required this.gradient,
Key? key
}) : super(key: key);
@override
_GradientIconState createState() => _GradientIconState();
}
class _GradientIconState extends State<GradientIcon> {
double size = 0;
static const iconSizeMultiplier = 1.2;
Shader? shaderFromGradient;
@override
void initState() {
super.initState();
if (widget.size != null)
size = widget.size! * iconSizeMultiplier;
}
@override
Widget build(BuildContext context) {
return ShaderMask(
child: Icon(
widget.icon,
size: size,
color: Colors.white,
),
shaderCallback: (Rect bounds) {
return widget.gradient!.createShader(Rect.fromLTRB(0, 0, size, size));
},
);
}
}
所以我的问题是:有没有一种方法可以在不调用saveLayer() 的情况下渲染渐变图标,所以不调用ShaderMask()?
【问题讨论】:
-
即使与
RepaintBoundary一起使用也会有问题吗? -
在官方文档中它说“其他可能触发 saveLayer() 并且可能代价高昂的小部件:ShaderMask、ColorFilter、Chip—如果 disabledColorAlpha != 0xff, Text—可能会导致调用 saveLayer()如果存在溢出着色器,则调用 saveLayer()”。所以是的。
-
我的意思是,如果您尝试使用
RepaintBoundary小部件包装所有内容 - 我已经知道saveLayoer可能很昂贵 -
嗯,我没用过所以不知道怎么画
-
return RepaintBoundary(child: ShaderMask(...
标签: flutter performance icons gradient