如何绘制一个 3 个四分之一圆用作颤动中的边框?
Posted
技术标签:
【中文标题】如何绘制一个 3 个四分之一圆用作颤动中的边框?【英文标题】:How to draw a 3 quarter circle for using as the border in the flutter? 【发布时间】:2021-12-01 22:10:16 【问题描述】:我需要一个画圆的边框,但它的四分之一是透明的
【问题讨论】:
【参考方案1】:嗨 为了达到预期的效果,我们必须使用 customPainter。
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'dart:math' as math;
void main()
runApp(MyApp());
class MyApp extends StatelessWidget
@override
Widget build(BuildContext context)
return MaterialApp(
home: MyHomePage(),
debugShowCheckedModeBanner: false,
);
class MyHomePage extends StatefulWidget
@override
_MyHomePageState createState() => _MyHomePageState();
class _MyHomePageState extends State<MyHomePage>
@override
Widget build(BuildContext context)
return Scaffold(
body: Center(
child: TweenAnimationBuilder(
duration: const Duration(seconds: 2),
tween: Tween(begin: 0.0, end: 1.0),
curve: Curves.easeOutCubic,
builder: (BuildContext context, dynamic value, Widget child)
return ;
,
),
),
);
class OpenPainter extends CustomPainter
final learned;
final notLearned;
final range;
final totalQuestions;
double pi = math.pi;
OpenPainter(this.learned, this.totalQuestions, this.notLearned, this.range);
@override
void paint(Canvas canvas, Size size)
double strokeWidth = 7;
Rect myRect = const Offset(-50.0, -50.0) & const Size(100.0, 100.0);
var paint1 = Paint()
..color = Colors.blue
..strokeWidth = strokeWidth
..style = PaintingStyle.stroke;
var paint2 = Paint()
..color = Colors.orange
..strokeWidth = strokeWidth
..style = PaintingStyle.stroke;
double firstLineRadianStart = 0;
double _unAnswered = (totalQuestions - notLearned - learned) * range / totalQuestions;
double firstLineRadianEnd = (360 * _unAnswered) * math.pi / 180;
canvas.drawArc(
myRect, firstLineRadianStart, firstLineRadianEnd, false, paint1);
double _learned = (learned) * range / totalQuestions;
double secondLineRadianEnd = getRadians(_learned);
canvas.drawArc(myRect, firstLineRadianEnd, secondLineRadianEnd, false, paint2);
// drawArc(Rect rect, double startAngle, double sweepAngle, bool useCenter, Paint paint)
double getRadians(double value)
return (360 * value) * pi / 180;
@override
bool shouldRepaint(CustomPainter oldDelegate) => true;
【讨论】:
【参考方案2】:您可以尝试自定义画家
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'dart:math' as math;
void main()
runApp(MyApp());
class MyApp extends StatelessWidget
@override
Widget build(BuildContext context)
return MaterialApp(
home: MyHomePage(),
debugShowCheckedModeBanner: false,
);
class MyHomePage extends StatefulWidget
@override
_MyHomePageState createState() => _MyHomePageState();
class _MyHomePageState extends State<MyHomePage>
@override
Widget build(BuildContext context)
return Scaffold(
body: Center(
child: TweenAnimationBuilder(
duration: const Duration(seconds: 0),
tween: Tween(begin: 0.0, end: 1.0),
curve: Curves.easeOutCubic,
builder: (BuildContext context, dynamic value, Widget child)
return CustomPaint(
painter: MyCustomPainter(
totalQuestions: 300,
learned: 75,
notLearned: 75,
range: value),
);
,
),
),
);
class MyCustomPainter extends CustomPainter
final learned;
final notLearned;
final range;
final totalQuestions;
double pi = math.pi;
MyCustomPainter(this.learned, this.totalQuestions, this.notLearned, this.range);
@override
void paint(Canvas canvas, Size size)
double strokeWidth = 7;
Rect myRect = const Offset(-50.0, -50.0) & const Size(100.0, 100.0);
var paint1 = Paint()
..color = Colors.red
..strokeWidth = strokeWidth
..style = PaintingStyle.stroke;
double firstLineRadianStart = 0;
double _unAnswered = (totalQuestions - notLearned - learned) * range / totalQuestions;
double firstLineRadianEnd = (360 * _unAnswered) * math.pi / 180;
canvas.drawArc(
myRect, firstLineRadianStart, firstLineRadianEnd, false, paint1);
double _learned = (learned) * range / totalQuestions;
double secondLineRadianEnd = getRadians(_learned);
canvas.drawArc(myRect, firstLineRadianEnd, secondLineRadianEnd, false, paint1);
double getRadians(double value)
return (360 * value) * pi / 180;
@override
bool shouldRepaint(CustomPainter oldDelegate) => true;
输出:
【讨论】:
以上是关于如何绘制一个 3 个四分之一圆用作颤动中的边框?的主要内容,如果未能解决你的问题,请参考以下文章