【发布时间】:2018-04-17 14:56:35
【问题描述】:
我们正在尝试在 Flutter 中构建一个可以在运行时更改的自定义形状矢量。
例如,我们需要一个披萨形状矢量小部件,我们可以根据变量值更改切片颜色。
我们尝试在 Flutter 中使用 canvas 和painter,但他们没有清晰和好的文档。
我们也尝试过 SVG,但不幸的是 Flutter 也不支持 SVG 标签和 SVG 视图。
【问题讨论】:
我们正在尝试在 Flutter 中构建一个可以在运行时更改的自定义形状矢量。
例如,我们需要一个披萨形状矢量小部件,我们可以根据变量值更改切片颜色。
我们尝试在 Flutter 中使用 canvas 和painter,但他们没有清晰和好的文档。
我们也尝试过 SVG,但不幸的是 Flutter 也不支持 SVG 标签和 SVG 视图。
【问题讨论】:
您可以创建一个扩展 CustomPainter 的小部件
class Sky extends CustomPainter { @override void paint(Canvas canvas, Size size) { var rect = Offset.zero & size; var gradient = new RadialGradient( center: const Alignment(0.7, -0.6), radius: 0.2, colors: [const Color(0xFFFFFF00), const Color(0xFF0099FF)], stops: [0.4, 1.0], ); canvas.drawRect( rect, new Paint()..shader = gradient.createShader(rect), ); } @override SemanticsBuilderCallback get semanticsBuilder { return (Size size) { // Annotate a rectangle containing the picture of the sun // with the label "Sun". When text to speech feature is enabled on the // device, a user will be able to locate the sun on this picture by // touch. var rect = Offset.zero & size; var width = size.shortestSide * 0.4; rect = const Alignment(0.8, -0.9).inscribe(new Size(width, width), rect); return [ new CustomPainterSemantics( rect: rect, properties: new SemanticsProperties( label: 'Sun', textDirection: TextDirection.ltr, ), ), ]; }; } // Since this Sky painter has no fields, it always paints // the same thing and semantics information is the same. // Therefore we return false here. If we had fields (set // from the constructor) then we would return true if any // of them differed from the same fields on the oldDelegate. @override bool shouldRepaint(Sky oldDelegate) => false; @override bool shouldRebuildSemantics(Sky oldDelegate) => false; }
另见
【讨论】: