如何绘制一个 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 个四分之一圆用作颤动中的边框?的主要内容,如果未能解决你的问题,请参考以下文章

可组合成内容形状的剪辑

如何在颤动中使容器大于实际屏幕

问一个简单的乐理知识

画图表示四分之三怎么画

如何绘制形状如下的UIButton?

Python数据可视化 箱线图