当前位置: 首页 > ds >正文

flutter实践:比例对比线图实现

需求:flutter实现一个左右对比线图,带有动画效果

效果图:

Widget _buildTop() {return Container(height: themeData.heightXl,padding: EdgeInsets.symmetric(horizontal: themeData.hSpacingMd),child: Row(mainAxisAlignment: MainAxisAlignment.spaceBetween,crossAxisAlignment: CrossAxisAlignment.center,children: [TdxText((module.sellSum > 0? (module.sellSum / (module.buySum + module.sellSum) * 100).toStringAsFixed(2): "--") +"%",textColor: themeData.colorTextDown,),SizedBox(width: themeData.hSpacingSm,),Expanded(child: ClipRRect(borderRadius: BorderRadius.circular(themeData.radiusMd),child: LayoutBuilder(builder: (context, constraints) {return AnimatedBuilder(animation: _animationController,builder: (context, child) {return CustomPaint(size: Size(constraints.maxWidth, 6),painter: TdxHqggWdpkHistogramPainter(percent: _progressAnimation.value),);},);},),),),SizedBox(width: themeData.hSpacingSm,),TdxText((module.buySum > 0? (module.buySum / (module.buySum + module.sellSum) * 100).toStringAsFixed(2): "--") +"%",textColor: themeData.colorTextUp,),],),);}
class TdxMarketHistogramPainter extends CustomPainter {//涨所占比例final percent;TdxMarketHistogramPainter({required this.percent,});@overridevoid paint(Canvas canvas, Size size) {//涨---进度条var paint1 = Paint()..style = PaintingStyle.fill..color = uiCommonConfig.colorTextUp;var path1 = Path()..moveTo(0, 0)..lineTo(max(size.width * percent, 0), 0)..lineTo(max(size.width * percent - 8, 0), size.height)..lineTo(0, size.height);//灰色区域var paint2 = Paint()..style = PaintingStyle.fill..color = uiCommonConfig.colorTextSecondary;var path2 = Path()..moveTo(max(size.width * percent + 4, 0), 0)..lineTo(max(size.width * percent + 10, 0), 0)..lineTo(size.width * percent + 2, size.height)..lineTo(max(size.width * percent - 4, 0), size.height);//跌---进度条var paint3 = Paint()..style = PaintingStyle.fill..color = uiCommonConfig.colorTextDown;var path3 = Path()..moveTo(size.width * percent + 14, 0)..lineTo(size.width, 0)..lineTo(size.width, size.height)..lineTo(size.width * percent + 6, size.height);//绘制canvas.drawPath(path1, paint1);canvas.drawPath(path2, paint2);canvas.drawPath(path3, paint3);}@overridebool shouldRepaint(TdxMarketHistogramPainter oldDelegate) => true;@overridebool shouldRebuildSemantics(TdxMarketHistogramPainter oldDelegate) => true;
}
late AnimationController _animationController; //动画控制器
late Animation _progressAnimation; //进度条动画
double oldRisePercnet = 0.5; //涨所占比例(旧)
double risePercnet = 0.5; //涨所占比例
void initAnimation() {//下面几个值需要初始化int totalCount = module.buySum + module.sellSum; //买卖总量_animationController = AnimationController(duration: const Duration(milliseconds: 300), vsync: this);risePercnet = module.sellSum != 0 ? module.sellSum / totalCount : 0.5;_progressAnimation = Tween(begin: oldRisePercnet, end: risePercnet).animate(_animationController);//执行动画_animationController.forward();oldRisePercnet = risePercnet;if (module.buySum > 0 && module.sellSum > 0) {module.updateDisplay();}}

http://www.xdnf.cn/news/2627.html

相关文章:

  • 第35课 常用快捷操作——用“鼠标左键”拖动图元
  • 集成方案 | Docusign + 甄零科技,赋能企业海外业务高效增长!
  • 第十三步:vue
  • 【实战篇】数字化打印——打印格式设计器的功能说明
  • 学习笔记2(Lombok+算法)
  • 关于PyQt5信号槽机制的解析
  • OpenSPG/KAG v0.7.1 发布, 针对新版若干优化和BUGFIX
  • 特征工程三:数据特征之词干提取器(stemmer)
  • ACM会议模板设置单排作者数量
  • 前端技术分享~谷歌调试工具
  • 服务器ubuntu镜像磁盘空间怎么管理
  • 基于STM32的便携式游戏机开发
  • 耳机,三段式, 四段式,录音,播放
  • Redis05-进阶-主从
  • GCC 内建函数汇编展开详解
  • `==` 和 `===` 的隐式转换规则总结
  • DHCP 服务器运行流程图
  • 初识集合框架 [数据结构 初阶]
  • 【创新实训个人博客】数据库搭建
  • 03 APQC PROCESS CLASSIFICATION FRAMEWORK (PCF)
  • 《Crawl4AI 爬虫工具部署配置全攻略》
  • uniapp跨平台开发---动态控制底部切换显示
  • Spring XML 外部实体(XXE)指南:示例和预防
  • 图解模型并行框架
  • Day14(链表)——LeetCode234.回文链表141.环形链表
  • 探针台在光电行业的应用
  • 徽客松S1 | 合肥首场 AI 黑客松招募
  • 今日头条安卓版新闻推荐精准度与广告影响测评
  • Python3:Jupyter Notebook 安装和配置
  • 详实的ADC检测电路计算