程序问答   发布时间:2022-06-01  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了如何在上一个圆弧动画完成后渲染圆弧路径大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

如何解决如何在上一个圆弧动画完成后渲染圆弧路径?

开发过程中遇到如何在上一个圆弧动画完成后渲染圆弧路径的问题如何解决?下面主要结合日常开发的经验,给出你关于如何在上一个圆弧动画完成后渲染圆弧路径的解决方法建议,希望对你解决如何在上一个圆弧动画完成后渲染圆弧路径有所启发或帮助;

当我尝试在同一路径中渲染两个圆弧时,两个圆弧都同时渲染,但我需要在第一个圆弧的动画完成后渲染第二个圆弧。

我只想渲染第二个弧,因为它应该从第一个弧的末端开始并完成动画的其余部分(连续动画)。

预期结果 实际结果

如何在上一个圆弧动画完成后渲染圆弧路径

如何在上一个圆弧动画完成后渲染圆弧路径

我附上了下面的代码片段,任何人都可以帮我解决这个问题。

class HomePage extends StatefulWidget {
  @overrIDe
  _HomePageState createState() => _HomePageState();
}

class _HomePageState extends State<HomePage> {
  @overrIDe
  Widget build(BuildContext context) {
    return Scaffold(
      body: Container(
        child: Circle(),),);
  }
}

class Circle extends StatefulWidget {
  @overrIDe
  _CircleState createState() => _CircleState();
}

class _CircleState extends State<Circle> with SingleTickerProvIDerStatemixin {
  double? _fraction = 0.0;
  late Animation<double> _animation;
  late AnimationController _controller;
  @overrIDe
  voID initState() {
    super.initState();

    _controller =
        AnimationController(duration: Duration(milliseconds: 5000),vsync: this);

    _animation = Tween(begin: 0.0,end: 1.0).animate(_controller)
      ..addListener(() {
        setState(() {
          _fraction = _animation.value;
        });
      });

    _controller.forWARD();
  }

  @overrIDe
  Widget build(BuildContext context) {
    return Container(
      child: Center(
        child: padding(
            padding: const EdgeInsets.all(24.0),child: CustomPaint(
              painter: CirclePainter(fraction: _fraction!),);
  }

  @overrIDe
  voID dispose() {
    _controller.dispose();
    super.dispose();
  }
}

class CirclePainter extends CustomPainter {
  final double? fraction;
  late Paint _circlePaint;

  CirclePainter({this.fraction}) {
    _circlePaint = Paint()
      ..color = colors.red
      ..style = PainTingStyle.fill;
  }
  final Paint _paint = Paint()
  ..color = colors.black
  ..style = PainTingStyle.stroke
  ..strokeWIDth = 3;

  @overrIDe
  voID paint(Canvas canvas,Size sizE) {
    final Path path = Path();
    path.addArc(
      Rect.fromCircle(center: Offset(size.wIDth/2,size.height/2),radius: 131.0909090909091),_degreesToradians(-90).todouble(),(_degreesToradians(269.999 * fraction!).todouble() - _degreesToradians(-90).todouble()));
    path.arcTo(
      Rect.fromCircle(center: Offset(size.wIDth/2,radius: 42.32727272727273),_degreesToradians(269.999 * fraction!).todouble(),_degreesToradians(-90).todouble() - _degreesToradians((269.999) * fraction!).todouble(),falsE);
    path.addArc(
      Rect.fromCircle(center: Offset(size.wIDth/2,(_degreesToradians(179.999 * fraction!).todouble() - _degreesToradians(-90).todouble()));
    path.arcTo(
      Rect.fromCircle(center: Offset(size.wIDth/2,_degreesToradians(179.999 * fraction!).todouble(),_degreesToradians(-90).todouble() - _degreesToradians((179.999) * fraction!).todouble(),falsE);
  canvas.drawPath(path,_circlePaint);
  canvas.drawPath(path,_paint);
  }

  @overrIDe
  bool shouldRepaint(CirclePainter oldDelegatE) {
    return oldDelegate.fraction != fraction;
  }
}
num _degreesToradians(num deg) => deg * (pi / 180);

预期:

如何在上一个圆弧动画完成后渲染圆弧路径

解决方法

你可以这样做,第一个角是起始角,第二个角是终止角。你可以随意调整其他东西,但要获得旋转的效果,你需要不断改变结束角度。

我不想让笔尖变圆,你可以放 StrokeCap.butt

这个弧度函数的库是 vector_math。

 _path.addArc(Rect.fromLTWH(0,size.width,size.height),vm.radians(-90),vm.radians(90));

    canvas.drawPath(
        _path,Paint()
          ..strokeCap = StrokeCap.round
          ..strokeWidth = 40
          ..style = PainTingStyle.strokE);

对于第二个开始,您可以再次使用与我在上面代码中编写的相同的概念,并结合交错动画。

 final Animation<double> firstAnimation=
        Tween<double>(begin: 0,end: 1).animate(CurvedAnimation(
      parent: animationController,curve: Interval(0,0.5,curve: Curves.easeIn),));

final Animation<double> secondAnimation=
        Tween<double>(begin: 0,curve: Interval(0.5,1,));

大佬总结

以上是大佬教程为你收集整理的如何在上一个圆弧动画完成后渲染圆弧路径全部内容,希望文章能够帮你解决如何在上一个圆弧动画完成后渲染圆弧路径所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。
标签: