flutter进度条动画

dart 复制代码
import 'dart:async';
import 'package:jade/configs/PathConfig.dart';
import 'package:jade/utils/JadeColors.dart';
import 'package:flutter/material.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart';

class JadeLinearProgressIndicator extends StatefulWidget {
  final double currentProgress;
  JadeLinearProgressIndicator(this.currentProgress);
  @override
  State<StatefulWidget> createState() {
    // TODO: implement createState
    return _JadeLinearProgressIndicatorState();
  }
}

class _JadeLinearProgressIndicatorState extends State<JadeLinearProgressIndicator> with TickerProviderStateMixin {


  // 动画相关控制器与补间。
  AnimationController animation;
  Tween<double> tween;

  GlobalKey _keyOffset = GlobalKey();

  Timer _timer;
  int _animationIndex = 0;


  @override
  void initState() {
    // TODO: implement initState
    super.initState();
    animation = AnimationController(
        // 这个动画应该持续的时间长短。
        duration: const Duration(milliseconds: 900),
        vsync: this)
      ..addListener(() {
        setState(() {});
      });
    tween = Tween<double>(
      begin: 0.0,
      end: widget.currentProgress >1.0? 1.0 : widget.currentProgress,
    );
    // 开始向前运行这个动画(朝向最后)
    animation.forward();
    _processAnimation();
  }


  @override
  void dispose() {
    // TODO: implement dispose
    animation.dispose();
    _cancelTimer();
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    // TODO: implement build
    return Stack(
      alignment: Alignment.centerLeft,
      children: [
        Container(
          width: 250.w,
          height: 32.w,
          margin: EdgeInsets.only(left: 14.w),
          child: Stack(
            children: [
              Positioned.fill(
                  child: ClipRRect(
                    borderRadius: BorderRadius.all(Radius.circular(10.0)),
                    child: Container(
                      color: JadeColors.grey_13,
                      child: ListView.separated(
                          scrollDirection: Axis.horizontal,
                          itemBuilder: (context, index) => Icon(Icons.navigate_next,
                            color: index == _animationIndex?JadeColors.orange:Colors.white,size: 16,),
                          shrinkWrap: true,
                          physics: const NeverScrollableScrollPhysics(),
                          separatorBuilder: (context,index) =>Container(width: 16.w,),
                          itemCount: 6),
                    ),
                  )),
              ClipRRect(
                borderRadius: BorderRadius.all(Radius.circular(10.0)),
                child: Align(
                  widthFactor: tween.animate(animation).value,
                  child: Container(
                    key: _keyOffset,
                    decoration: BoxDecoration(
                        gradient: LinearGradient(
                            colors: [JadeColors.blue,JadeColors.blue_8],
                            begin: Alignment.centerLeft,end: Alignment.centerRight
                        )
                    ),
                  ),
                ),
              ),
              Container(
                alignment: Alignment.center,
                child: Text('${((widget.currentProgress > 1.0 ? 1.0: widget.currentProgress) * 100).toStringAsFixed(2)}%',
                  style: TextStyle(color: Colors.white,fontSize: 24.sp,fontFamily: 'PingFang'),),
              )
            ],
          ),
        ),
        Image.asset(PathConfig.iconFireBlue,width: 32.w,)
      ],
    );
  }

  //进度条箭头动画
  _processAnimation(){
    _timer = Timer.periodic(Duration(milliseconds: 100), (timer){
      _animationIndex ++;
      if(_animationIndex == 6){
        _animationIndex = 0;
      }
      setState(() {});
    });
  }

  _cancelTimer(){
    if(_timer !=null && _timer.isActive){
      _timer.cancel();
      _timer = null;
    }
  }
}
相关推荐
程序员老刘13 小时前
跨平台开发地图 | 2026年10月
flutter·ai编程·客户端
林瞅瞅15 小时前
Flutter 开发环境从零搭建与调试记录
flutter
FungLeo19 小时前
成为全栈·Flutter App 篇·Markdown 编辑器:编辑、预览与离开保护
flutter·移动开发·markdown编辑器·表单设计·成为全栈·草稿保存
FungLeo20 小时前
成为全栈·Flutter App 篇·会员中心:资料、密码、通知与私有数据缓存
flutter·dart·身份认证·数据隔离·成为全栈·会员中心
穆梓兰煊2 天前
Flutter端云协同推理架构解析
flutter·github
FungLeo2 天前
成为全栈·Flutter App 篇·内置 WebView:网页历史、App 返回与外链安全
flutter·网络安全·移动开发·webview·路由管理·成为全栈
m0_738185822 天前
Flutter 鸿蒙化实战:volume_controller 适配 OpenHarmony,系统音量控制
flutter·华为·harmonyos·鸿蒙
FungLeo2 天前
成为全栈·Flutter App 篇·Flutter Markdown 阅读器:支持范围与渲染边界
flutter·markdown·dart·代码高亮·成为全栈·移动阅读
m0_738185822 天前
Flutter 鸿蒙化实战:webview_cookie_manager 适配 OpenHarmony,WebView Cookie 管理
flutter·华为·harmonyos·鸿蒙