Flutter动画效果插件animations的使用

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

Flutter动画效果插件animations的使用

高质量预构建的Flutter动画

此包包含了一些常见的动画效果,这些动画可以自定义内容并直接应用到您的应用程序中以吸引用户。

要查看以下动画在设备或模拟器上的示例,请执行以下命令:

cd example/
flutter run --release

Material 动效为 Flutter 设计

Material 动效是一组过渡模式,有助于用户理解和导航应用程序。有关模式及其选择方法的更多信息,请参阅 Material 动效系统规范。 还有一个Codelab,使用Material Motion for Flutter构建漂亮的过渡,可供学习。

Material motion 定义了以下过渡模式:

  1. 容器转换 (Container transform): 用于具有容器的UI元素之间的过渡。这种模式在两个UI元素之间创建可见的连接。
  2. 共享轴 (Shared axis): 用于具有空间或导航关系的UI元素之间的过渡。这种模式使用x、y或z轴上的共享变换来强化元素之间的关系。
  3. 淡入淡出 (Fade through): 用于没有强关联的UI元素之间的过渡。
  4. 淡入/淡出 (Fade): 用于屏幕范围内进入或退出的UI元素,如居中淡入的对话框。

容器转换 (Container transform)

容器转换

  • 卡片变为详情页
  • 列表项变为详情页
  • FAB变为详情页
  • 搜索栏展开为扩展搜索

共享轴 (Shared axis)

共享轴

  • 新手引导流程沿X轴过渡
  • 步骤条沿Y轴过渡
  • 父子导航沿Z轴过渡

淡入淡出 (Fade through)

淡入淡出

  • 底部导航栏中的目的地点击
  • 刷新图标点击
  • 账户切换器点击

淡入/淡出 (Fade)

淡入

  • 对话框
  • 菜单
  • Snackbar
  • FAB

示例代码

以下是 main.dart 文件的完整示例代码,展示了如何使用 animations 插件实现上述四种动画模式:

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

import 'container_transition.dart';
import 'fade_scale_transition.dart';
import 'fade_through_transition.dart';
import 'shared_axis_transition.dart';

void main() {
  runApp(
    MaterialApp(
      theme: ThemeData.from(
        colorScheme: const ColorScheme.light(),
      ).copyWith(
        pageTransitionsTheme: const PageTransitionsTheme(
          builders: <TargetPlatform, PageTransitionsBuilder>{
            TargetPlatform.android: ZoomPageTransitionsBuilder(),
          },
        ),
      ),
      home: _TransitionsHomePage(),
    ),
  );
}

class _TransitionsHomePage extends StatefulWidget {
  @override
  _TransitionsHomePageState createState() => _TransitionsHomePageState();
}

class _TransitionsHomePageState extends State<_TransitionsHomePage> {
  bool _slowAnimations = false;

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: const Text('Material Transitions')),
      body: Column(
        children: <Widget>[
          Expanded(
            child: ListView(
              children: <Widget>[
                _TransitionListTile(
                  title: 'Container transform',
                  subtitle: 'OpenContainer',
                  onTap: () {
                    Navigator.of(context).push(
                      MaterialPageRoute<void>(
                        builder: (BuildContext context) {
                          return const OpenContainerTransformDemo();
                        },
                      ),
                    );
                  },
                ),
                _TransitionListTile(
                  title: 'Shared axis',
                  subtitle: 'SharedAxisTransition',
                  onTap: () {
                    Navigator.of(context).push(
                      MaterialPageRoute<void>(
                        builder: (BuildContext context) {
                          return const SharedAxisTransitionDemo();
                        },
                      ),
                    );
                  },
                ),
                _TransitionListTile(
                  title: 'Fade through',
                  subtitle: 'FadeThroughTransition',
                  onTap: () {
                    Navigator.of(context).push(
                      MaterialPageRoute<void>(
                        builder: (BuildContext context) {
                          return const FadeThroughTransitionDemo();
                        },
                      ),
                    );
                  },
                ),
                _TransitionListTile(
                  title: 'Fade',
                  subtitle: 'FadeScaleTransition',
                  onTap: () {
                    Navigator.of(context).push(
                      MaterialPageRoute<void>(
                        builder: (BuildContext context) {
                          return const FadeScaleTransitionDemo();
                        },
                      ),
                    );
                  },
                ),
              ],
            ),
          ),
          const Divider(height: 0.0),
          SafeArea(
            child: SwitchListTile(
              value: _slowAnimations,
              onChanged: (bool value) async {
                setState(() {
                  _slowAnimations = value;
                });
                if (_slowAnimations) {
                  await Future<void>.delayed(const Duration(milliseconds: 300));
                }
                timeDilation = _slowAnimations ? 20.0 : 1.0;
              },
              title: const Text('Slow animations'),
            ),
          ),
        ],
      ),
    );
  }
}

class _TransitionListTile extends StatelessWidget {
  const _TransitionListTile({
    this.onTap,
    required this.title,
    required this.subtitle,
  });

  final GestureTapCallback? onTap;
  final String title;
  final String subtitle;

  @override
  Widget build(BuildContext context) {
    return ListTile(
      contentPadding: const EdgeInsets.symmetric(
        horizontal: 15.0,
      ),
      leading: Container(
        width: 40.0,
        height: 40.0,
        decoration: BoxDecoration(
          borderRadius: BorderRadius.circular(20.0),
          border: Border.all(
            color: Colors.black54,
          ),
        ),
        child: const Icon(
          Icons.play_arrow,
          size: 35,
        ),
      ),
      onTap: onTap,
      title: Text(title),
      subtitle: Text(subtitle),
    );
  }
}

通过以上代码和解释,您可以了解如何在Flutter项目中使用animations插件实现高质量的预构建动画效果。希望这对您有所帮助!


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

1 回复

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


当然,以下是一个关于如何在Flutter中使用animations插件来实现动画效果的示例代码。请注意,animations插件可能指的是Flutter社区中的一个具体动画库,但Flutter本身已经提供了强大的动画支持。因此,我将基于Flutter原生的动画系统给出一个示例,这通常也是实现动画效果的首选方式。

示例:使用Flutter原生动画系统实现简单的淡入淡出动画

首先,确保你的Flutter环境已经设置好,并且你已经创建了一个新的Flutter项目。

1. 添加依赖

对于Flutter原生的动画功能,你不需要添加任何额外的依赖,因为flutter包中已经包含了动画相关的类和方法。

2. 编写动画逻辑

在你的main.dart文件中,你可以按照以下步骤编写一个简单的淡入淡出动画:

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: 'Flutter Animation Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: AnimationDemo(),
    );
  }
}

class AnimationDemo extends StatefulWidget {
  @override
  _AnimationDemoState createState() => _AnimationDemoState();
}

class _AnimationDemoState extends State<AnimationDemo> with SingleTickerProviderStateMixin {
  late AnimationController _controller;
  late Animation<double> _opacity;

  @override
  void initState() {
    super.initState();
    _controller = AnimationController(
      duration: const Duration(seconds: 2),
      vsync: this,
    )..repeat(reverse: true); // 无限循环动画,反向播放

    _opacity = _controller.drive(CurveTween(curve: Curves.easeInOut));
  }

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

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Flutter Animation Demo'),
      ),
      body: Center(
        child: AnimatedBuilder(
          animation: _controller,
          child: Container(
            color: Colors.blue,
            width: 200,
            height: 200,
            alignment: Alignment.center,
            child: Text(
              'Hello, Flutter!',
              style: TextStyle(color: Colors.white, fontSize: 24),
            ),
          ),
          builder: (BuildContext context, Widget? child) {
            return Opacity(
              opacity: _opacity.value,
              child: child,
            );
          },
        ),
      ),
    );
  }
}

3. 解释代码

  • AnimationController:这是动画的核心控制器,它管理动画的时长、状态(如开始、停止、反向)等。
  • Animation<double>:这是一个表示动画值的类,其值在0到1之间变化。
  • CurveTween:这用于将动画控制器的时间值映射到另一个值,通过curve参数你可以定义动画的缓动效果。
  • AnimatedBuilder:这是一个方便构建动画的widget,它会在动画值变化时自动重建子widget。
  • Opacity:这是一个简单的widget,它根据opacity属性改变其子widget的透明度。

总结

以上代码展示了如何在Flutter中使用原生的动画系统实现一个简单的淡入淡出动画效果。虽然animations插件可能提供了更多高级功能,但理解Flutter原生的动画系统是实现复杂动画效果的基础。如果你对特定插件有更详细的需求,建议查阅该插件的官方文档或GitHub仓库以获取更多信息和示例代码。

回到顶部