【问题标题】:How to draw a 3 quarter circle for using as the border in the flutter?如何绘制一个 3 个四分之一圆用作颤动中的边框?
【发布时间】:2021-12-01 22:10:16
【问题描述】:

我需要一个画圆的边框,但它的四分之一是透明的

【问题讨论】:

    标签: flutter dart user-interface widget draw


    【解决方案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;
      }
      
      

      输出:

      【讨论】:

        猜你喜欢
        • 2023-03-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-02-15
        • 2019-12-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多