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

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

效果图:

Dart 复制代码
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,
          ),
        ],
      ),
    );
  }
Dart 复制代码
class TdxMarketHistogramPainter extends CustomPainter {
  //涨所占比例
  final percent;
  TdxMarketHistogramPainter({
    required this.percent,
  });

  @override
  void 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);
  }

  @override
  bool shouldRepaint(TdxMarketHistogramPainter oldDelegate) => true;

  @override
  bool shouldRebuildSemantics(TdxMarketHistogramPainter oldDelegate) => true;
}
Dart 复制代码
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();
    }
  }
相关推荐
fanruitian5 小时前
uniapp android开发 测试板本与发行版本
前端·javascript·uni-app
rayufo5 小时前
【工具】列出指定文件夹下所有的目录和文件
开发语言·前端·python
RANCE_atttackkk5 小时前
[Java]实现使用邮箱找回密码的功能
java·开发语言·前端·spring boot·intellij-idea·idea
ujainu6 小时前
Flutter + OpenHarmony 游戏开发进阶:轨迹拖尾特效——透明度渐变与轨迹数组管理
flutter·游戏·openharmony
一起养小猫6 小时前
Flutter for OpenHarmony 实战:记账应用数据统计与可视化
开发语言·jvm·数据库·flutter·信息可视化·harmonyos
2501_944525547 小时前
Flutter for OpenHarmony 个人理财管理App实战 - 支出分析页面
android·开发语言·前端·javascript·flutter
李白你好7 小时前
Burp Suite插件用于自动检测Web应用程序中的未授权访问漏洞
前端
刘一说9 小时前
Vue 组件不必要的重新渲染问题解析:为什么子组件总在“无故”刷新?
前端·javascript·vue.js
徐同保9 小时前
React useRef 完全指南:在异步回调中访问最新的 props/state引言
前端·javascript·react.js
刘一说10 小时前
Vue 导航守卫未生效问题解析:为什么路由守卫不执行或逻辑失效?
前端·javascript·vue.js