Flutter圆形动画插件circulito的使用

Flutter圆形动画插件circulito的使用

简介

Circulito 提供了一种高度可定制的方式,用于绘制和动画化环形/甜甜圈/饼图以可视化数据。它具有以下特点:

  • 显示带有自定义区段的环形/甜甜圈/饼图。
  • 通过提供金额或百分比及对应颜色轻松可视化数据。
  • 区段和背景的渐变装饰。
  • 交互式区段:hoveronTap 事件。
  • 支持多层级嵌套。
  • 动画化的区段。

example circle wheel

示例功能

Donut 和 Pie 图表

example circle wheel 3

动态图表与动画区段

example circle wheel 2

倒计时

example circle wheel 4

Apple 风格健身环

example circle wheel 5

入门指南

添加依赖

pubspec.yaml 文件中添加以下依赖:

dependencies:
  circulito: ^1.0.1

使用方法

基本用法

Circulito(
    maxSize: 480,
    sections: [
        // 单个区段占50%
        CirculitoSection(
          value: 0.5,
          decoration: const CirculitoDecoration.fromColor(Colors.amber),
        )
    ],
);

自定义配置

Circulito(
  maxSize: 480,
  padding: 20.0,
  key: GlobalKey(),
  strokeWidth: 150,
  isCentered: true,
  onHoverExit: () {},
  startPoint: StartPoint.left,
  animation: CirculitoAnimation(),
  background: CirculitoBackground(),
  strokeCap: CirculitoStrokeCap.round,
  direction: CirculitoDirection.clockwise,
  sectionValueType: SectionValueType.amount,
  childStackingOrder: ChildStackingOrder.behindParent,
  sections: [
    // 男性比例
    CirculitoSection(
      value: 750,
      decoration: const CirculitoDecoration.fromColor(
        Colors.blue,
        hoverColor: Colors.blueAccent,
      ),
    ),

    // 女性比例
    CirculitoSection(
      value: 997,
      decoration: const CirculitoDecoration.fromColor(
        Colors.pink,
        hoverColor: Colors.pinkAccent,
        shadow: CirculitoShadow(),
        border: CirculitoBorder(
          color: Colors.white,
          size: 3.0,
        ),
      ),
    ),
  ],
  child: const Text('Genders'),
);

使用金额值

Circulito(
  sectionValueType: SectionValueType.amount,
  sections: [
      CirculitoSection(
        value: 535, // 金额值而非百分比
        color: Colors.blue,
      ),
    //...其他金额值区段
  ]

  // ...其他 Circulito 属性
);

添加动画

Circulito(
  animation: CirculitoAnimation(),
  // ...其他 Circulito 属性
);

也可以自定义动画的持续时间和曲线:

Circulito(
  animation: CirculitoAnimation(
    duration: 200,
    curve: Curves.easeInOut,
  ),
  // ...其他 Circulito 属性
);

装饰设置

Circulito(
    background: CirculitoBackground(
        // 使用颜色装饰背景
        decoration: CirculitoDecoration.fromColor(
            Colors.white,
            hoverColor: Colors.grey,
        ),
    ),
    sections: [
        CirculitoSection(
            value: 0.5,
            // 使用渐变装饰区段
            decoration: CirculitoDecoration.fromGradient(
                const LinearGradient(colors: [Colors.green, Colors.yellow]),
            ),
      ),
  ]
  // ...其他 Circulito 属性
);

添加阴影

decoration: const CirculitoDecoration.fromColor(
    Colors.grey,
    // 默认灰色阴影
    shadow: CirculitoShadow(),
),

或者自定义阴影:

decoration: CirculitoDecoration.fromColor(
    Colors.grey,
    // 自定义阴影
    shadow: CirculitoShadow(
        spreading: 16.0,
        blurStyle: BlurStyle.normal,
        color: Colors.blueGrey.withOpacity(.3),
    ),
),

添加边框

decoration: const CirculitoDecoration.fromColor(
    Colors.grey,
    // 默认黑色边框
    border: CirculitoBorder(),
),

或者自定义边框:

decoration: CirculitoDecoration.fromColor(
    Colors.grey,
    // 自定义边框
    border: CirculitoBorder(
        size: 8.0,
        color: Colors.blueGrey,
    ),
),

区段交互

Circulito(
  sections: [
      CirculitoSection(
        ...// 必要属性
        onHover: _doHoverAction,
        onTap: _doTapAction,
      ),
  ]
  // ...其他 Circulito 属性
);

参数列表

名称 类型 描述
animation Animation 应用于轮子的动画
background CirculitoAnimation? 要绘制的轮子背景
child Widget 显示在轮子上的小部件
direction CirculitoDirection 确定轮子的方向
isCentered bool 小部件是否应居中显示在其父级中
maxSize double 小部件在其父级中可以增长的最大尺寸
padding double? 应用于小部件的内边距
sections List<CirculitoSection> 表示每个图表区段的 CirculitoSection 对象列表
sectionValueType SectionValueType 每个区段的值类型(amountpercentage
startPoint StartPoint 确定轮子的起点
strokeCap CirculitoStrokeCap 描边末端类型(roundbutt
strokeWidth double 定义图表轮廓的描边宽度

完整示例代码

下面是一个完整的示例代码,展示了如何使用 Circulito 创建一个简单的环形图表:

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

void main() => runApp(const MyApp());

class MyApp extends StatelessWidget {
  const MyApp({super.key});

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(title: const Text('Circulito Example')),
        body: Center(
          child: Circulito(
            maxSize: 200,
            sections: [
              CirculitoSection(
                value: 0.3,
                decoration: const CirculitoDecoration.fromColor(Colors.red),
              ),
              CirculitoSection(
                value: 0.5,
                decoration: const CirculitoDecoration.fromColor(Colors.green),
              ),
              CirculitoSection(
                value: 0.2,
                decoration: const CirculitoDecoration.fromColor(Colors.blue),
              ),
            ],
            animation: CirculitoAnimation(
              duration: 1000,
              curve: Curves.easeInOut,
            ),
            onHover: (index) => print('Hovered on section $index'),
            onTap: (index) => print('Tapped on section $index'),
          ),
        ),
      ),
    );
  }
}

这个示例创建了一个包含三个区段的环形图表,并为每个区段设置了不同的颜色和动画效果。同时,还添加了鼠标悬停和点击事件处理程序。

希望这些信息能帮助你更好地理解和使用 Circulito 插件!如果有任何问题或需要进一步的帮助,请随时提问。


更多关于Flutter圆形动画插件circulito的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter圆形动画插件circulito的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,以下是如何在Flutter项目中使用circulito插件来创建圆形动画的示例代码。circulito是一个用于创建各种圆形动画效果的Flutter插件。

首先,确保你已经将circulito添加到你的pubspec.yaml文件中:

dependencies:
  flutter:
    sdk: flutter
  circulito: ^最新版本号  # 请替换为实际的最新版本号

然后,运行flutter pub get来安装依赖。

接下来是一个完整的示例代码,展示了如何使用circulito来创建一个简单的圆形动画:

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

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Circulito Animation Example'),
        ),
        body: Center(
          child: CirculitoExample(),
        ),
      ),
    );
  }
}

class CirculitoExample extends StatefulWidget {
  @override
  _CirculitoExampleState createState() => _CirculitoExampleState();
}

class _CirculitoExampleState extends State<CirculitoExample> with SingleTickerProviderStateMixin {
  late AnimationController _controller;
  late Animation<double> _animation;

  @override
  void initState() {
    super.initState();
    _controller = AnimationController(
      duration: const Duration(seconds: 2),
      vsync: this,
    )..repeat(reverse: true);

    _animation = Tween<double>(begin: 0.0, end: 1.0).animate(_controller);
  }

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

  @override
  Widget build(BuildContext context) {
    return Column(
      mainAxisAlignment: MainAxisAlignment.center,
      children: <Widget>[
        SizedBox(
          width: 200,
          height: 200,
          child: Circulito(
            animation: _animation,
            child: Container(
              decoration: BoxDecoration(
                shape: BoxShape.circle,
                color: Colors.blue,
              ),
            ),
          ),
        ),
        SizedBox(height: 20),
        Text(
          'Animation Value: ${_animation.value.toStringAsFixed(2)}',
          style: TextStyle(fontSize: 18),
        ),
      ],
    );
  }
}

在这个示例中:

  1. CirculitoExample是一个StatefulWidget,它在其initState方法中初始化了一个AnimationController,用于控制动画的持续时间、重复行为等。
  2. _animation是一个Animation<double>对象,它使用Tween从0.0到1.0进行插值。
  3. Circulito组件接收一个animation参数,这个参数控制动画的进度。在这个例子中,Circulito包裹了一个简单的蓝色圆形Container
  4. 还有一个Text组件,用于显示当前的动画值,以便你可以看到动画的进度。

请注意,Circulito的实际用法可能会因插件版本和API的更新而有所变化。因此,建议查阅最新的插件文档以获取最准确的信息。

此外,Circulito可能提供了更多配置选项和动画效果,你可以参考插件的官方文档或示例代码来探索更多功能。

回到顶部