Bootstrap

Flutter动画渐变

User experience is everything. One way to improve it is by making transitions between different UI elements smoother and more visually appealing. This is where the AnimatedCrossFade widget comes in handy.

用户体验就是一切。改善用户体验的方法之一就是让不同 UI 元素之间的过渡更加流畅,更具视觉吸引力。这就是 AnimatedCrossFade widget 的用武之地。

AnimatedCrossFade is a powerful tool that allows you to transition between two widgets with a cross-fade animation. It’s perfect for scenarios where you want to replace one widget with another while maintaining a smooth and visually pleasing transition.

AnimatedCrossFade 是一款功能强大的工具,可让您通过交叉渐变动画在两个窗口小部件之间进行过渡。它非常适合您用一个窗口小部件替换另一个窗口小部件,同时保持平滑和视觉愉悦的过渡效果。

Here’s a step-by-step guide on how to use AnimatedCrossFade to enhance your app’s user experience:

以下是如何使用 AnimatedCrossFade 增强应用程序用户体验的分步指南:

Step 1: Import the Flutter Material library

步骤 1:导入 Flutter 材质库

Make sure to import the Flutter Material library to access the AnimatedCrossFade widget and other essential UI components.

确保导入 Flutter Material 库,以访问 AnimatedCrossFade widget 和其他重要 UI 组件。

import ‘package:flutter/material.dart’;

Step 2: Create a StatefulWidget

步骤 2:创建 StatefulWidget

To work with AnimatedCrossFade, you’ll need to use a StatefulWidget. This is because you’ll be changing the widgets over time, and StatefulWidget provides the necessary mechanism to do so.

要使用 AnimatedCrossFade,您需要使用 StatefulWidget。这是因为您将随着时间的推移而改变部件,而 StatefulWidget 提供了必要的机制来实现这一点。

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

  
  _AnimatedCrossFadeExampleState createState() =>
      _AnimatedCrossFadeExampleState();
}

Step 3: Define the State

步骤 3:定义状态

Define the state for your StatefulWidget. In this example, we’ll use a boolean variable to toggle between two widgets.

定义 StatefulWidget 的状态。在本例中,我们将使用一个布尔变量在两个 Widget 之间切换。

class _AnimatedCrossFadeExampleState extends State<AnimatedCrossFadeExample> {
  bool _isFirstWidgetVisible = false;

Step 4: Create the AnimatedCrossFade

第 4 步:创建动画交叉渐变

Inside your build method, create the AnimatedCrossFade widget. This widget will smoothly transition between two child widgets based on the value of _isFirstWidgetVisible.

在构建方法中,创建 AnimatedCrossFade widget。该部件将根据 _isFirstWidgetVisible 的值在两个子部件之间平滑过渡。


Widget build(BuildContext context) {
  return MaterialApp(
    home: Scaffold(
      appBar: AppBar(
        title: const Text("动画交叉渐变示例"),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            AnimatedCrossFade(
              duration: const Duration(seconds: 1), // Animation duration
              firstChild: Container(
                width: 200,
                height: 200,
                color: Colors.blue,
                child: const Center(
                  child: Text(
                    "第一个组件",
                    style: TextStyle(
                      color: Colors.white,
                      fontSize: 20,
                    ),
                  ),
                ),
              ),
              secondChild: Container(
                width: 200,
                height: 200,
                color: Colors.green,
                child: const Center(
                  child: Text(
                    "第二个组件",
                    style: TextStyle(
                      color: Colors.white,
                      fontSize: 20,
                    ),
                  ),
                ),
              ),
              // 交叉状态
              crossFadeState: _isFirstWidgetVisible
              ? CrossFadeState.showFirst
              : CrossFadeState.showSecond,
            ),
            const SizedBox(height: 20),
            ElevatedButton(
              onPressed: () {
                setState(() {
                  // 点击切换展示不同的组件
                  _isFirstWidgetVisible = !_isFirstWidgetVisible;
                });
              },
              child: const Text("切换"),
            ),
          ],
        ),
      ),
    ),
  );
}

Step 5: Toggle the Transition

步骤 5:切换过渡效果

In this example, we have two child widgets inside the AnimatedCrossFade: firstChild and secondChild. The crossFadeState property is set based on the value of _isFirstWidgetVisible. When you tap the “Toggle Widget” button, it changes the value of _isFirstWidgetVisible, triggering the cross-fade animation between the two child widgets.

在本示例中,我们在 AnimatedCrossFade 内有两个子部件:firstChild 和 secondChild。crossFadeState 属性是根据 _isFirstWidgetVisible 的值设置的。当您点击 “Toggle Widget”(切换部件)按钮时,它将改变 _isFirstWidgetVisible 的值,从而触发两个子部件之间的交叉渐变动画。

And that’s it! You’ve added a smooth cross-fade transition between two widgets, making your app’s user experience more visually appealing. You can customize the widgets, duration, and transition state to achieve various effects and improve your app’s overall look and feel.

就是这样!您已经在两个窗口小部件之间添加了平滑的交叉淡入淡出过渡,使您应用程序的用户体验更具视觉吸引力。您可以自定义窗口小部件、持续时间和过渡状态,以实现各种效果并改善应用程序的整体外观和感觉。

完整代码

import 'package:flutter/material.dart';

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

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

  
  _AnimatedCrossFadeExampleState createState() =>
      _AnimatedCrossFadeExampleState();
}

class _AnimatedCrossFadeExampleState extends State<AnimatedCrossFadeExample> {
  bool _isFirstWidgetVisible = false;

  
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: const Text("动画交叉渐变示例"),
        ),
        body: Center(
          child: Column(
            mainAxisAlignment: MainAxisAlignment.center,
            children: <Widget>[
              AnimatedCrossFade(
                duration: const Duration(seconds: 1), // Animation duration
                firstChild: Container(
                  width: 200,
                  height: 200,
                  color: Colors.blue,
                  child: const Center(
                    child: Text(
                      "第一个组件",
                      style: TextStyle(
                        color: Colors.white,
                        fontSize: 20,
                      ),
                    ),
                  ),
                ),
                secondChild: Container(
                  width: 200,
                  height: 200,
                  color: Colors.green,
                  child: const Center(
                    child: Text(
                      "第二个组件",
                      style: TextStyle(
                        color: Colors.white,
                        fontSize: 20,
                      ),
                    ),
                  ),
                ),
                // 交叉状态
                crossFadeState: _isFirstWidgetVisible
                    ? CrossFadeState.showFirst
                    : CrossFadeState.showSecond,
              ),
              const SizedBox(height: 20),
              ElevatedButton(
                onPressed: () {
                  setState(() {
                    // 点击切换展示不同的组件
                    _isFirstWidgetVisible = !_isFirstWidgetVisible;
                  });
                },
                child: const Text("切换"),
              ),
            ],
          ),
        ),
      ),
    );
  }
}

悦读

道可道,非常道;名可名,非常名。 无名,天地之始,有名,万物之母。 故常无欲,以观其妙,常有欲,以观其徼。 此两者,同出而异名,同谓之玄,玄之又玄,众妙之门。

;