Flutter圆形旋转动画插件circular_rotation的使用

发布于 1周前 作者 gougou168 来自 Flutter

Flutter圆形旋转动画插件circular_rotation的使用

circular_rotation 是一个用于在Flutter中创建自定义圆形旋转动画的插件。它允许您将小部件以圆形方式排列,并支持类似于太阳系的运动效果。以下是该插件的基本用法和示例代码。

插件信息

支持平台

  • Android
  • iOS
  • Linux
  • Mac
  • Web
  • Windows

许可证

使用方法

示例代码

以下是一个完整的示例,展示如何使用 circular_rotation 插件创建一个圆形旋转动画:

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

void main() {
  runApp(
    const MaterialApp(
      debugShowCheckedModeBanner: false,
      home: MyApp(),
    ),
  );
}

class MyApp extends StatefulWidget {
  const MyApp({Key? key}) : super(key: key);

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

class _MyAppState extends State<MyApp> {
  final List<Widget> _firstCircleImages = [];
  final List<Widget> _secondCircleImages = [];
  final List<Widget> _thirdCircleImages = [];

  @override
  void initState() {
    generateImages();
    super.initState();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: Container(
        decoration: const BoxDecoration(
          image: DecorationImage(
            fit: BoxFit.fill,
            image: AssetImage('assets/galaxy.jpg'), // 替换为实际背景图片路径
          ),
        ),
        child: CircularRotation(
          circularRotationProperty: CircularRotationModel(
            firstCircleFill: true,
            secondCircleFill: true,
            thirdCircleFill: true,
            firstCircleFillColor: Colors.red,
            secondCircleFillColor: Colors.blue,
            thirdCircleFillColor: Colors.purple,
            defaultCircleStrokeWidth: 0.2,
            defaultCircleStrokeColor: Colors.white,
            startAnimation: true,
            repeatAnimation: false,
            firstCircleAnimationDuration: 5000,
            secondCircleAnimationDuration: 7000,
            thirdCircleAnimationDuration: 10000,
            centerWidget: const InkWell(
              onTap: CircularRotation.eitherStartOrStopAnimation,
              child: _GetProfile(
                name: 'Tom',
                image: 'assets/center.png', // 替换为实际中心图片路径
                radius: 48.0,
              ),
            ),
            firstCircleWidgets: _firstCircleImages,
            secondCircleWidgets: _secondCircleImages,
            thirdCircleWidgets: _thirdCircleImages,
          ),
        ),
      ),
    );
  }

  void generateImages() {
    var listOfNames = ['Dad', 'Uncle P', 'Cindy', 'Sally', 'Sammy', 'Bob', 'Aria'];

    /// Adding images into first circle.
    _firstCircleImages.add(_GetProfile(name: listOfNames[4], image: 'assets/planet_5.png')); // 替换为实际图片路径
    _firstCircleImages.add(_GetProfile(name: listOfNames[3], image: 'assets/planet_4.png'));
    _firstCircleImages.add(_GetProfile(name: listOfNames[6], image: 'assets/planet_7.png'));

    /// Adding images into second circle.
    _secondCircleImages.add(_GetProfile(name: listOfNames[1], image: 'assets/planet_2.png'));
    _secondCircleImages.add(_GetProfile(name: listOfNames[2], image: 'assets/planet_3.png'));
    _secondCircleImages.add(_GetProfile(name: listOfNames[5], image: 'assets/planet_6.png'));

    /// Adding images into third circle.
    _thirdCircleImages.add(_GetProfile(name: listOfNames[0], image: 'assets/planet_1.png'));
  }
}

class _GetProfile extends StatelessWidget {
  const _GetProfile({
    required this.name,
    required this.image,
    this.radius = 32.0,
    Key? key,
  }) : super(key: key);
  final String name;
  final String image;
  final double radius;

  @override
  Widget build(BuildContext context) {
    return Column(
      children: [
        _CircularImage(image: image, radius: radius),
        Text(
          name,
          style: const TextStyle(
            color: Colors.white,
          ),
        ),
      ],
    );
  }
}

class _CircularImage extends StatelessWidget {
  const _CircularImage({required this.image, required this.radius, Key? key}) : super(key: key);
  final String image;
  final double radius;

  @override
  Widget build(BuildContext context) {
    return CircleAvatar(
      radius: radius,
      backgroundImage: AssetImage(image),
      backgroundColor: Colors.transparent,
    );
  }
}

参数说明

  • firstCircleFill: 控制第一个圆是否填充。
  • secondCircleFill: 控制第二个圆是否填充。
  • thirdCircleFill: 控制第三个圆是否填充。
  • firstCircleFillColor: 第一个圆的填充颜色。
  • secondCircleFillColor: 第二个圆的填充颜色。
  • thirdCircleFillColor: 第三个圆的填充颜色。
  • defaultCircleStrokeWidth: 所有圆的边框宽度。
  • defaultCircleStrokeColor: 所有圆的边框颜色。
  • startAnimation: 是否开始动画。
  • repeatAnimation: 是否重复动画。
  • firstCircleAnimationDuration: 第一个圆的动画持续时间(毫秒)。
  • secondCircleAnimationDuration: 第二个圆的动画持续时间(毫秒)。
  • thirdCircleAnimationDuration: 第三个圆的动画持续时间(毫秒)。
  • centerWidget: 圆心的小部件。
  • firstCircleWidgets: 第一个圆上的小部件列表。
  • secondCircleWidgets: 第二个圆上的小部件列表。
  • thirdCircleWidgets: 第三个圆上的小部件列表。

通过这些参数,您可以高度定制您的圆形旋转动画,满足各种需求。希望这个示例能帮助您更好地理解和使用 circular_rotation 插件。


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

1 回复

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


当然,以下是如何在Flutter中使用circular_rotation插件来实现圆形旋转动画的示例代码。请注意,由于circular_rotation可能不是一个官方或广泛认可的插件名称,我将假设你想要实现一个基本的圆形旋转动画,并使用Flutter内置的动画功能来完成这个任务。如果你提到的circular_rotation是一个特定的第三方包,请确保你已经在pubspec.yaml文件中添加了相应的依赖。

下面是一个使用Flutter内置动画功能实现圆形旋转动画的示例:

  1. 首先,确保你的pubspec.yaml文件中包含了Flutter SDK的依赖(通常这是默认的,不需要额外添加)。

  2. 创建一个新的Flutter项目或在现有项目中添加以下代码。

import 'package:flutter/material.dart';
import 'dart:math' as math;

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Circular Rotation Animation',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: Scaffold(
        appBar: AppBar(
          title: Text('Circular Rotation Animation'),
        ),
        body: Center(
          child: RotatingCircle(),
        ),
      ),
    );
  }
}

class RotatingCircle extends StatefulWidget {
  @override
  _RotatingCircleState createState() => _RotatingCircleState();
}

class _RotatingCircleState extends State<RotatingCircle> 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: 2 * math.pi).animate(_controller);
  }

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

  @override
  Widget build(BuildContext context) {
    return AnimatedBuilder(
      animation: _animation,
      child: Container(
        width: 100,
        height: 100,
        decoration: BoxDecoration(
          shape: BoxShape.circle,
          color: Colors.blue,
        ),
      ),
      builder: (context, child) {
        return Transform.rotate(
          angle: _animation.value,
          child: child,
        );
      },
    );
  }
}

在这个示例中,我们创建了一个名为RotatingCircle的自定义Widget,它使用AnimationController来控制动画。Tween用于在0到2π(一个完整的圆周)之间插值,而Transform.rotate则用于根据动画值旋转子Widget。

  • initState方法中初始化了AnimationControllerTween动画,并设置了动画的持续时间为2秒,同时让动画反复进行(..repeat(reverse: true))。
  • dispose方法中释放了AnimationController以避免内存泄漏。
  • AnimatedBuilder用于监听动画的变化并构建旋转的圆形。

这个示例展示了如何使用Flutter内置的动画系统来实现一个基本的圆形旋转动画。如果你提到的circular_rotation是一个特定的第三方插件,请参考该插件的文档以获取更具体的用法。通常,第三方插件的使用方式与内置功能类似,但可能提供了一些额外的配置选项或更高级的API。

回到顶部