IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 移动开发 -> Flutter: 倒计时组件 -> 正文阅读

[移动开发]Flutter: 倒计时组件

import 'dart:async';
import 'dart:math';

import 'package:flutter/animation.dart';
import 'package:flutter/material.dart';

/// 倒计时

typedef DownTimeEndListener = void Function();

class DownTimeWidget extends StatefulWidget {
  Color clors;
  double width;
  double strokeWidth;
  int time;
  TextStyle textStyle;
  DownTimeEndListener endListener;

  DownTimeWidget(
      {Key key,
      this.clors,
      this.width,
      this.strokeWidth,
      this.time,
      this.textStyle,
      this.endListener})
      : super();

  @override
  _DownTimeWidgetState createState() => _DownTimeWidgetState();
}

class _DownTimeWidgetState extends State<DownTimeWidget>
    with TickerProviderStateMixin {
  int _time;
  AnimationController controller;
  CurvedAnimation curvedAnimation;
  Tween<double> animationTween;
  Animation<double> animation;
  double angle;

  @override
  void initState() {
    super.initState();
    _time = (widget.time / 1000).toInt();
    controller = new AnimationController(
        vsync: this, duration: Duration(milliseconds: widget.time));
    curvedAnimation =
        new CurvedAnimation(parent: controller, curve: Curves.linear);
    animationTween = new Tween(begin: 0.0, end: 360.0);
    animation = animationTween.animate(curvedAnimation);

    animation.addStatusListener((status) {
      //动画播放完成
      if (status == AnimationStatus.completed) {
        widget.endListener();
      }
    });

    animation.addListener(() {
      angle = animation.value;
      setState(() {});
    });
    controller.forward();
  }

  @override
  Widget build(BuildContext context) {
    return Container(
      width: widget.width,
      height: widget.width,
      decoration: BoxDecoration(
          borderRadius: BorderRadius.circular(widget.width / 2),
          color: Colors.white),
      child: Stack(
        children: [
          Center(
            child: DownTimeText(
              time: _time,
              textStyle: widget.textStyle,
            ),
          ),
          CustomPaint(
            painter: new DrawArcPainter(
              colors: widget.clors,
              angle: angle,
              width: widget.width,
            ),
          ),
        ],
      ),
    );
  }

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

///进度条
class DrawArcPainter extends CustomPainter {
  DrawArcPainter({this.colors, this.angle, this.width, this.mStrokeWidth});

  Color colors;

  double mStrokeWidth;

  double width;

  double angle;

  double angleToRadian(double angle) => angle * (pi / 180.0);

  double radianToAngle(double radian) => radian * (180.0 / pi);

  @override
  void paint(Canvas canvas, Size size) {
    Paint paint = new Paint()
      ..color = colors == null ? Colors.red : colors
      ..strokeWidth = mStrokeWidth == null ? 2.0 : mStrokeWidth
      ..style = PaintingStyle.stroke
      ..strokeCap = StrokeCap.round;
    Rect rect = new Rect.fromLTWH(0.0, 0.0, width, width);
    canvas.drawArc(rect, 0.0, angleToRadian(angle), false, paint);
  }

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

///时间
class DownTimeText extends StatefulWidget {
  int time;
  TextStyle textStyle;

  DownTimeText({Key key, this.time, this.textStyle}) : super(key: key);

  @override
  _DownTimeTextState createState() => _DownTimeTextState();
}

class _DownTimeTextState extends State<DownTimeText> {
  int _time;
  Timer timer;

  @override
  void initState() {
    super.initState();
    _time = widget.time;
    startDownTimer();
  }

  ///倒计时
  void startDownTimer() {
    timer = Timer.periodic(Duration(seconds: 1), (time) {
      if (_time == null || _time == 0) {
        setState(() {});
        timer?.cancel();
        return;
      }
      _time--;

      setState(() {});
    });
  }

  @override
  Widget build(BuildContext context) {
    return Text(
      "倒计时:$_time",
      style: widget.textStyle,
    );
  }

  @override
  void dispose() {
    timer.cancel();
    super.dispose();
  }
}
child: Container(
            margin: EdgeInsets.all(10.0),
            child: DownTimeWidget(clors: Colors.red,time: 5000,width: 50,strokeWidth: 5.0,
              textStyle: TextStyle(color: Colors.black,fontSize: 8.0
                  ,decoration:TextDecoration.none ),
              endListener: (){
                showNextPage();
              },),
          ),

  移动开发 最新文章
Vue3装载axios和element-ui
android adb cmd
【xcode】Xcode常用快捷键与技巧
Android开发中的线程池使用
Java 和 Android 的 Base64
Android 测试文字编码格式
微信小程序支付
安卓权限记录
知乎之自动养号
【Android Jetpack】DataStore
上一篇文章      下一篇文章      查看所有文章
加:2021-08-28 09:27:50  更:2021-08-28 09:28:52 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2025年1日历 -2025/1/31 6:08:54-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码