IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 移动开发 -> Flutter 旋转动画 — RotationTransition -> 正文阅读

[移动开发]Flutter 旋转动画 — RotationTransition

系列文章

  1. Flutter 旋转动画 — RotationTransition
  2. Flutter 平移动画 — 4种实现方式
  3. Flutter 淡入淡出与逐渐出现动画
  4. Flutter 尺寸缩放、形状、颜色、阴影变换动画


1 旋转动画效果对比

旋转动画

2 动画基础知识

  • Animation 是 Flutter 动画库中的核心类,它插入用于引导动画的值。
  • AnimationController 管理动画。例如控制动画开始、停止、前进、后退等。
  • CurvedAnimation 将进程定义为非线性曲线。
  • Tween 在被动画对象使用的数据范围之间进行插值。 例如,Tween 可以定义从红色到蓝色或从 0 到 255 的插值。
  • Listeners 和 StatusListeners 可监控动画状态的变化。
  • AnimatedWidget 是展示动画的Widget,Flutter提供一些动画Widget让我们快速实现动画效果。例如:
    AnimatedBuilder、 AnimatedModalBarrier、DecoratedBoxTransition、FadeTransition、PositionedTransition、RelativePositionedTransition、RotationTransition、ScaleTransition、SizeTransition、SlideTransition

3 旋转动画案例

RotationTransition 继承于AnimatedWidget,是一个提供旋转功能的Widget,需要传入参数 Animation<double>。

Animation<double>中的值为 v,则旋转的弧度是 v * 2 * π

3.1 线性变化的旋转动画(补间动画 Tween)

3.1.1 首先创建 Animation 与 AnimationController

  /// 会重复播放的控制器
  late final AnimationController _repeatController;

  /// 线性动画
  late final Animation<double> _animation;

  @override
  void initState() {
    super.initState();
    /// 动画持续时间是 3秒,此处的this指 TickerProviderStateMixin
    _repeatController = AnimationController(
      duration: const Duration(seconds: 3),
      vsync: this,
    )
      ..repeat(); // 设置动画重复播放

    // 创建一个从0到360弧度的补间动画 v * 2 * π
    _animation = Tween<double>(begin: 0, end: 1).animate(_repeatController);
  }

3.1.2 构建Widget RotationTransition

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: Center(
        child: RotationTransition(
          turns: _animation,
          child: const Icon(Icons.arrow_drop_up, size: 180),
        ),
      ),
    );
  }

3.1.3 效果图

在这里插入图片描述


3.2 非线性变化的旋转动画(Curved-Animation)

3.2.1 代码实现

实现方式与线性变化的旋转动画类似,只是需要将 Tween 更改为 Curved-Animation

  class _RotationTransitionPageState extends State<RotationTransitionPage>
    with TickerProviderStateMixin {
  /// 会重复播放的控制器
  late final AnimationController _repeatController;

  /// 非线性动画
  late final Animation<double> _curveAnimation;

  @override
  void initState() {
    super.initState();
    _repeatController = AnimationController(
      duration: const Duration(seconds: 3),
      vsync: this,
    )..repeat();

    /// Curves 存在多种模式,具体的效果查看Curves源码,有链接展示动画效果
    _curveAnimation = CurvedAnimation(
      parent: _repeatController,
      curve: Curves.easeInCirc,
    );
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: Center(
        child: RotationTransition(
          turns: _curveAnimation,
          child: const Icon(Icons.arrow_drop_up, size: 180),
        ),
      ),
    );
  }
}

3.2.2 效果图

在这里插入图片描述


3.3 动画延时重复(每次重复播放前停顿一下)

实现思路:监听动画的状态,每当动画播放完成时延时一段时间,然后启动动画开始播放。

3.3.1 代码实现

 class _RotationTransitionPageState extends State<RotationTransitionPage>
    with TickerProviderStateMixin {
  /// 重复播放前需要停顿一下的控制器
  late final AnimationController _delayRepeatController;

  /// 延时重复播放动画
  late final Animation<double> _delayAnimation;

  @override
  void initState() {
    super.initState();
    _delayRepeatController = AnimationController(
      duration: const Duration(seconds: 3),
      vsync: this,
    )
    //  添加动画监听
      ..addListener(() {
        // 获取动画当前的状态
        var status = _delayRepeatController.status;
        if (status == AnimationStatus.completed) {
          // 延时1秒
          Future.delayed(const Duration(seconds: 1), () {
            //从0开始向前播放
            _delayRepeatController.forward(from: 0.0);
          });
        }
      })
      ..forward();

    _delayAnimation =
        Tween<double>(begin: 0, end: 1).animate(_delayRepeatController);
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: Center(
        child: RotationTransition(
          turns: _delayAnimation,
          child: const Icon(Icons.arrow_drop_up, size: 180),
        ),
      ),
    );
  }
}

3.3.2 效果图

在这里插入图片描述


3.4 手动控制旋转动画

实现方式:使用 AnimationController 的 animateTo 函数。

3.4.1 代码实现

class _RotationTransitionPageState extends State<RotationTransitionPage>
    with TickerProviderStateMixin {
  /// 手动控制动画的控制器
  late final AnimationController _manualController;

  /// 手动控制
  late final Animation<double> _manualAnimation;

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

    /// 不设置重复,使用代码控制进度,动画时间1秒
    _manualController = AnimationController(
      vsync: this,
      duration: const Duration(seconds: 1),
    );
    _manualAnimation =
        Tween<double>(begin: 0, end: 1).animate(_manualController);
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: Center(
        child: RotationTransition(
          turns: _manualAnimation,
          child: CupertinoButton(
            onPressed: () {
              /// 获取动画当前的值
              var value = _manualController.value;

              /// 0.5代表 180弧度
              if (value == 0.5) {
                _manualController.animateTo(0);
              } else {
                _manualController.animateTo(0.5);
              }
            },
            child: const Icon(Icons.arrow_drop_up, size: 180),
          ),
        ),
      ),
    );
  }
}

3.4.2 效果图

在这里插入图片描述

4 注意

别忘了释放AnimationController 资源。

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

  移动开发 最新文章
Vue3装载axios和element-ui
android adb cmd
【xcode】Xcode常用快捷键与技巧
Android开发中的线程池使用
Java 和 Android 的 Base64
Android 测试文字编码格式
微信小程序支付
安卓权限记录
知乎之自动养号
【Android Jetpack】DataStore
上一篇文章      下一篇文章      查看所有文章
加:2022-06-21 21:30:36  更:2022-06-21 21:30:45 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/25 3:01:06-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码