Flutter 自定义view

带进度动画的圆环。没gif,效果大家自行脑补。

继承CustomPainterpaint()方法中拿到canvas,绘制API和android差不多。

import 'package:flutter/material.dart';

class ProgressRingPainter extends CustomPainter {
  double strokeWidth = 20;
  Color _colorBg = Colors.white10;
  final double progress;

  ProgressRingPainter({this.progress});

  @override
  void paint(Canvas canvas, Size size) {
    var xCenter = size.width / 2;
    var yCenter = size.height / 2;

    Rect rect = Rect.fromCenter(
        center: Offset(xCenter, yCenter),
        width: size.width,
        height: size.height);

    var paintBg = Paint()
      ..style = PaintingStyle.stroke
      ..isAntiAlias = true
      ..strokeWidth = strokeWidth
      ..color = _colorBg;

    List<Color> colors = List();
    colors.add(Colors.white70);
    colors.add(Colors.white);
    colors.add(Colors.white70);

    var paint = Paint()
      ..style = PaintingStyle.stroke
      ..isAntiAlias = true
      ..strokeWidth = strokeWidth
      ..shader = LinearGradient(colors: colors).createShader(rect);

    canvas.drawArc(rect, 0, 36, false, paintBg);
    canvas.drawArc(rect, 4.5, -progress, false, paint);
  }

  @override
  bool shouldRepaint(CustomPainter oldDelegate) {
    return true;
  }
}

import 'package:flutter/material.dart';
import 'package:flutter_app_demo/widget/progress_ring_paint.dart';

AnimationController animationController;

class ProgressRing extends StatefulWidget {
  @override
  State<StatefulWidget> createState() {
    return ProgressRingState();
  }

  static void startAnimation() {
    animationController.forward(from: 0);
  }
}

class ProgressRingState extends State<ProgressRing>
    with SingleTickerProviderStateMixin {
  Animation<double> animation;
  AnimationController controller;

  @override
  void initState() {
    super.initState();
    controller = new AnimationController(
        duration: const Duration(seconds: 5), vsync: this);
    animation = CurvedAnimation(parent: controller, curve: Curves.linear);
    animation = new Tween(begin: 0.0, end: 36.0).animate(animation);
    controller.forward(from: 0);
    animationController = controller;
  }

  @override
  void dispose() {
    controller.dispose();
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    return AnimatedProgressRing(animation: animation);
  }
}

class AnimatedProgressRing extends AnimatedWidget {
  AnimatedProgressRing({Key key, Animation<double> animation})
      : super(key: key, listenable: animation);

  Widget build(BuildContext context) {
    final Animation<double> animation = listenable;
    return CustomPaint(
      size: Size(200, 200),
      painter: ProgressRingPainter(progress: animation.value),
    );
  }
}

猜你喜欢

转载自blog.csdn.net/qq_27981847/article/details/132151636