我有一个Paint对象,并且尝试使用绘制一个Arc Gradient canvas.drawArc,但唯一的方法(至少根据我的研究)是使用a Shader,但是Shader要从一个Gradient对象获取a ,则必须use Gradient.createShader(Rect rect),它接受一个矩形。我的问题是,有没有办法为弧形而不是矩形创建着色器?到目前为止,这里可供我参考:
Paint
canvas.drawArc
Shader
Gradient
Gradient.createShader(Rect rect)
Paint paint = new Paint() ..color = bgColor ..strokeCap = StrokeCap.round ..strokeWidth = 3.0 ..style = PaintingStyle.stroke ..shader = new Gradient.radial(size.width / 2.0, size.height / 2.0, size.height / 3.0, Colors.transparent, timerColor, TileMode.mirror).createShader(/* I don't have a rect object */); canvas.drawArc(..., paint);
您所需的矩形实际上是一个正方形,您要绘制的圆将适合该正方形。圆弧只是那圆弧中扫过许多弧度的一片馅饼。使用Rect.fromCircle,使用中心和半径创建此正方形。然后在创建渐变和绘制圆弧时使用此正方形。
Rect.fromCircle
这是一个例子
import 'dart:math'; import 'package:flutter/material.dart'; class X1Painter extends CustomPainter { @override void paint(Canvas canvas, Size size) { // create a bounding square, based on the centre and radius of the arc Rect rect = new Rect.fromCircle( center: new Offset(165.0, 55.0), radius: 180.0, ); // a fancy rainbow gradient final Gradient gradient = new RadialGradient( colors: <Color>[ Colors.green.withOpacity(1.0), Colors.green.withOpacity(0.3), Colors.yellow.withOpacity(0.2), Colors.red.withOpacity(0.1), Colors.red.withOpacity(0.0), ], stops: [ 0.0, 0.5, 0.7, 0.9, 1.0, ], ); // create the Shader from the gradient and the bounding square final Paint paint = new Paint()..shader = gradient.createShader(rect); // and draw an arc canvas.drawArc(rect, pi / 4, pi * 3 / 4, true, paint); } @override bool shouldRepaint(X1Painter oldDelegate) { return true; } } class X1Demo extends StatelessWidget { @override Widget build(BuildContext context) { return new Scaffold( appBar: new AppBar(title: const Text('Arcs etc')), body: new CustomPaint( painter: new X1Painter(), ), ); } } void main() { runApp( new MaterialApp( theme: new ThemeData.dark(), home: new X1Demo(), ), ); }