Flutter动画效果插件animateable的使用

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

Flutter动画效果插件animateable的使用

一个为Flutter应用提供动画效果的包。

特性

  • crossfade 淡入淡出动画当数据发生变化时

使用

此示例展示了该包的一个特性用法。

crossfade 示例

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

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

  [@override](/user/override)
  State<CrossFadeExample> createState() => _CrossFadeExampleState();
}

class _CrossFadeExampleState extends State<CrossFadeExample> {
  DateTime current = DateTime.now();
  late final Stream<String> timer;

  [@override](/user/override)
  void initState() {
    timer = Stream.periodic(const Duration(seconds: 1), (i) {
      current = current.add(const Duration(seconds: 1));
      return 'current time is ${current.hour}:${current.minute}:${current.second}';
    });
    super.initState();
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    // 忽略不必要的容器
    return Container(
      child: StreamBuilder<String>(
        stream: timer,
        builder: (context, snapshot) {
          return Row(
            mainAxisAlignment: MainAxisAlignment.center,
            children: [
              CrossFade<String?>(
                initialData: 'initdata',
                data: snapshot.data,
                builder: (data) => Text('$data'),
              )
            ],
          );
        },
      ),
    );
  }
}

其他信息

更多相关信息或需要联系我,可以查看我的 GitHub主页


### 完整示例代码

```dart
import 'package:flutter/material.dart';
import 'home.dart';

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

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

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      theme: ThemeData(
        primarySwatch: Colors.pink,
        visualDensity: VisualDensity.adaptivePlatformDensity,
      ),
      home: const Home(),
      debugShowCheckedModeBanner: false,
    );
  }
}

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

1 回复

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


当然,animateable 并不是 Flutter 官方的一个核心库或插件,但 Flutter 社区中有许多动画相关的库和插件,例如 flutter_hooks 结合 animated_builder 可以实现复杂的动画效果。不过,基于你的要求,我会展示如何使用 Flutter 内置的动画系统来创建动画效果,这通常涉及到 AnimatedBuilderTweenAnimationController 等类。

下面是一个简单的例子,展示如何使用 Flutter 内置的动画系统来创建一个动画效果:

1. 添加必要的依赖

确保你的 pubspec.yaml 文件中包含必要的 Flutter SDK 版本(通常不需要额外添加动画相关的依赖,因为 Flutter SDK 已经内置了动画支持)。

dependencies:
  flutter:
    sdk: flutter

2. 创建动画效果

我们将创建一个简单的动画,其中一个 Container 会从屏幕左侧移动到右侧。

import 'package:flutter/material.dart';

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

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

class MyAnimatedWidget extends StatefulWidget {
  @override
  _MyAnimatedWidgetState createState() => _MyAnimatedWidgetState();
}

class _MyAnimatedWidgetState extends State<MyAnimatedWidget> with SingleTickerProviderStateMixin {
  late AnimationController _controller;
  late Animation<Offset> _animation;

  @override
  void initState() {
    super.initState();
    _controller = AnimationController(
      duration: const Duration(seconds: 2),
      vsync: this,
    )..repeat(reverse: true); // 不断往返动画

    _animation = Tween<Offset>(
      begin: Offset.zero,
      end: Offset.fromDirection(1.0), // 从左到右
    ).animate(CurvedAnimation(
      parent: _controller,
      curve: Curves.easeInOut,
    ));
  }

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

  @override
  Widget build(BuildContext context) {
    return SlideTransition(
      position: _animation,
      child: Container(
        width: 100,
        height: 100,
        color: Colors.blue,
        child: Center(
          child: Text(
            'Animate',
            style: TextStyle(color: Colors.white),
          ),
        ),
      ),
    );
  }
}

解释

  1. 导入必要的包

    import 'package:flutter/material.dart';
    
  2. 创建主应用

    void main() {
      runApp(MyApp());
    }
    
    class MyApp extends StatelessWidget {
      @override
      Widget build(BuildContext context) {
        return MaterialApp(
          home: Scaffold(
            appBar: AppBar(
              title: Text('Animateable Example'),
            ),
            body: Center(
              child: MyAnimatedWidget(),
            ),
          ),
        );
      }
    }
    
  3. 创建动画组件

    • 继承 StatefulWidget 并创建其状态类。
    • 使用 SingleTickerProviderStateMixin 混入,以便使用 AnimationController
    • initState 方法中初始化动画控制器和动画。
    • 使用 TweenCurvedAnimation 创建动画。
    • 使用 SlideTransition 应用动画。
    class MyAnimatedWidget extends StatefulWidget {
      @override
      _MyAnimatedWidgetState createState() => _MyAnimatedWidgetState();
    }
    
    class _MyAnimatedWidgetState extends State<MyAnimatedWidget> with SingleTickerProviderStateMixin {
      late AnimationController _controller;
      late Animation<Offset> _animation;
    
      @override
      void initState() {
        super.initState();
        _controller = AnimationController(
          duration: const Duration(seconds: 2),
          vsync: this,
        )..repeat(reverse: true);
    
        _animation = Tween<Offset>(
          begin: Offset.zero,
          end: Offset.fromDirection(1.0),
        ).animate(CurvedAnimation(
          parent: _controller,
          curve: Curves.easeInOut,
        ));
      }
    
      @override
      void dispose() {
        _controller.dispose();
        super.dispose();
      }
    
      @override
      Widget build(BuildContext context) {
        return SlideTransition(
          position: _animation,
          child: Container(
            width: 100,
            height: 100,
            color: Colors.blue,
            child: Center(
              child: Text(
                'Animate',
                style: TextStyle(color: Colors.white),
              ),
            ),
          ),
        );
      }
    }
    

这个例子展示了如何使用 Flutter 内置的动画系统来创建一个简单的滑动动画。如果你想要使用更复杂的动画库或插件,可以探索如 flutter_hooksanimations 等社区库。

回到顶部