Flutter开发--隐式动画

隐性动画

隐式动画是在Flutter中生成响应widget属性变化的简单动画的非常方便的工具。隐式动画无需深入研究复杂的动画控制器和补间,使您能够为小部件的属性设置动画,而无需操心动画的复杂细节。隐式动画有对于单一属性的widget,也有多个属性同时改变的widget。先来看一个简单的修改opacity值的隐式动画widget:AnimatedOpacity

dart 复制代码
import 'package:flutter/material.dart';

class ImplicitAnimationPage extends StatefulWidget {
  const ImplicitAnimationPage({super.key});

  @override
  State<StatefulWidget> createState() => _ImplicitAnimationPageState();
}

class _ImplicitAnimationPageState extends State<ImplicitAnimationPage> {
  double opacity = 0; // 1

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: const Text("Implicit Animation"),
        actions: [
          TextButton(
              onPressed: () {
                setState(() { // 2
                  opacity = 1;
                });
              },
              child: const Text("Start"))
        ],
      ),
      body: Container(
        color: Colors.yellow,
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          crossAxisAlignment: CrossAxisAlignment.stretch,
          children: [
            Align(
              alignment: Alignment.center,
              child: AnimatedOpacity(  // 3
                duration: const Duration(seconds: 2), // 4
                opacity: opacity,
                child: Container(
                    color: Colors.red,
                    child: const Text(
                      "Implicit Animation",
                      style: TextStyle(fontSize: 30),
                    )),
              ),
            )
          ],
        ),
      ),
    );
  }
}

解释如下:

  1. 这个需要在一个StatefulWidget里使用,动画组件会监听属性值状态的变化。
  2. setStateopacity赋新的值开始动画。
  3. 使用AnimatedOpacity组件来执行动画。还有其他的类似的使用Animated为前缀的动画组件。
  4. 动画组件需要duration属性的值来决定动画的执行时间。

AnimatedOpacity是对于一个属性实现动画的动画组件。对于多个属性同时动画的组件叫做AnimatedContainer。 类似于一个标准容器,但它具有额外的动画能力。它对诸如大小、颜色和形状等属性的变化进行动画处理。让我们来探讨一个示例,说明使用 AnimatedContainer 小部件在按下按钮时对颜色变化进行动画处理。

隐性动画示例

dart 复制代码
import 'dart:math';

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

double randomBorderRadius() {
  return Random().nextDouble() * 64;
}

double randomMargin() {
  return Random().nextDouble() * 64;
}

Color randomColor() {
  return Color(0xFFFFFFFF & Random().nextInt(0xFFFFFFFF));
}

class ImplicitAnimationPage extends StatefulWidget {
  const ImplicitAnimationPage({super.key});

  @override
  State<StatefulWidget> createState() => _ImplicitAnimationPageState();
}

class _ImplicitAnimationPageState extends State<ImplicitAnimationPage> {
  double opacity = 0;
  //
  Color color = Colors.white;
  double radius = 0;
  double margin = 0;

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

    color = randomColor();
    radius = randomBorderRadius();
    margin = randomMargin();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: const Text("Implicit Animation"),
        actions: [
          TextButton(
              onPressed: () {
                setState(() {
                  opacity = 1;
                });
              },
              child: const Text("Start 1")),
          TextButton(
              onPressed: () {
                setState(() {
                  color = randomColor();
                  radius = randomBorderRadius();
                  margin = randomMargin();
                });
              },
              child: const Text("Start 2"))
        ],
      ),
      body: Container(
        color: Colors.yellow,
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          crossAxisAlignment: CrossAxisAlignment.stretch,
          children: [
            Align(
              alignment: Alignment.center,
              child: AnimatedOpacity(
                duration: const Duration(seconds: 2),
                opacity: opacity,
                child: AnimatedContainer( // 1
                    duration: const Duration(milliseconds: 500),
                    margin: EdgeInsets.all(margin),
                    decoration: BoxDecoration(
                        color: color,
                        borderRadius: BorderRadius.circular(radius)),
                    child: const Text(
                      "Implicit Animation",
                      style: TextStyle(fontSize: 30),
                    )),
              ),
            )
          ],
        ),
      ),
    );
  }
}

在这个例子中,AnimatedContainer会有圆角、背景色和margin三个属性的变化。在这里增加了三个随机值生成的方法,对于上述三个值每次点击按钮之后给setState三个随机的值。每次点击按钮都会看到不同的变化。

隐式动画是一种将动画引入到你的 Flutter 应用程序的用户友好型方法,无需动画控制器和补间的复杂性。

相关推荐
SoaringHeart1 天前
Flutter进阶:基于 EasyRefresh 的下拉刷新封装 n_easy_refresh_mixin.dart
前端·flutter
月光下的丝瓜2 天前
Flutter 国内安装指南
前端·flutter
恋猫de小郭5 天前
Amper 正式转正 Kotlin Toolchain ,Gradle 未来何去何从
android·前端·flutter
张风捷特烈5 天前
Flutter 类库大揭秘#02 | path_provider 各平台实现
前端·flutter
TT_Close6 天前
别劝退了!5秒搞定 Flutter 鸿蒙 FVM 起跑线
flutter·harmonyos·visual studio code
你听得到116 天前
用户说 App 卡,但说不清在哪?我把 Flutter 监控 SDK 升级成了链路观测工作台
前端·flutter·性能优化
stringwu7 天前
Flutter 开发必备:MVI 架构的高效实现指南
前端·flutter
程序员老刘8 天前
Flutter版本选择指南:3.44系列继续观望 | 2026年6月
flutter·ai编程·客户端
用户9655973619010 天前
Provider vs Bloc vs GetX vs Riverpod:Flutter 状态管理方案怎么选?
flutter
恋猫de小郭10 天前
Flutter Patchwork,不用 Fork 改依赖包源码的第三方工具
android·前端·flutter