Flutter动画布局插件animated_fractionally_sized_box的使用

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

Flutter动画布局插件 animated_fractionally_sized_box 的使用

AnimatedFractionallySizedBoxFractionallySizedBox 的动画版本,它可以在一段时间内逐渐改变其属性值。当属性发生变化时,它会自动使用提供的曲线和持续时间进行动画过渡。

描述

AnimatedFractionallySizedBox 会在属性值变化时自动在旧值和新值之间进行动画过渡,使用的曲线和持续时间由开发者提供。未设置的属性不会被动画化。它的子组件及其后代组件不会被动画化。

使用方法

添加依赖

pubspec.yaml 文件中添加以下依赖:

dependencies:
  animated_fractionally_sized_box: ^2.0.1

导入包

在 Dart 文件中导入该包:

import 'package:animated_fractionally_sized_box/animated_fractionally_sized_box.dart';

使用示例

AnimatedFractionallySizedBox 的使用方式与 FractionallySizedBox 类似:

AnimatedFractionallySizedBox(
    widthFactor: widthFactor,
    heightFactor: heightFactor,
    alignment: Alignment.centerLeft,
    child: ...
)

完整示例 Demo

下面是一个完整的示例,展示了如何使用 AnimatedFractionallySizedBox 来创建一个简单的动画效果:

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

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Animated Fractionally Sized Box Example',
      theme: ThemeData(
        primarySwatch: Colors.blue,
        visualDensity: VisualDensity.adaptivePlatformDensity,
      ),
      home: MyHomePage(title: 'Example'),
    );
  }
}

class MyHomePage extends StatefulWidget {
  MyHomePage({Key? key, required this.title}) : super(key: key);
  final String title;

  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  final int min = 0;
  final int max = 10;
  final double height = 10;
  late int counter;

  @override
  void initState() {
    counter = min;
    super.initState();
  }

  void increment() {
    setState(() {
      counter++;
      counter = counter.clamp(min, max);
    });
  }

  void decrement() {
    setState(() {
      counter--;
      counter = counter.clamp(min, max);
    });
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text(widget.title),
      ),
      body: Container(
        padding: const EdgeInsets.all(8.0),
        alignment: Alignment.center,
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            Stack(
              children: [
                Container(
                  height: height,
                  color: Colors.black,
                ),
                AnimatedFractionallySizedBox(
                  duration: Duration(milliseconds: 500),
                  widthFactor: counter / max,
                  child: Container(
                    height: height,
                    color: Colors.green,
                  ),
                ),
              ],
            ),
            ElevatedButton(onPressed: increment, child: Text('Increment')),
            ElevatedButton(onPressed: decrement, child: Text('Decrement')),
          ],
        ),
      ),
    );
  }
}

在这个示例中,我们创建了一个简单的界面,包含一个黑色背景的容器和一个绿色背景的容器。绿色容器的宽度会根据计数器的值进行动画变化。点击“Increment”按钮会增加计数器的值,点击“Decrement”按钮会减少计数器的值。每次计数器的值变化时,绿色容器的宽度都会平滑地进行动画过渡。


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

1 回复

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


当然,animated_fractionally_sized_box 是一个在 Flutter 中用于创建动画效果的布局插件。它允许你根据父容器的一定比例调整子组件的大小,并在这些比例变化时添加动画效果。

以下是一个使用 animated_fractionally_sized_box 的代码示例。在这个例子中,我们将展示如何使用该插件来创建一个动画效果的布局,其中子组件的大小会根据父容器的一定比例动态变化。

首先,你需要在 pubspec.yaml 文件中添加 animated_fractionally_sized_box 依赖:

dependencies:
  flutter:
    sdk: flutter
  animated_fractionally_sized_box: ^x.y.z  # 请替换为最新版本号

然后,运行 flutter pub get 来获取依赖。

接下来是示例代码:

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

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Animated Fractionally Sized Box Demo'),
        ),
        body: Center(
          child: AnimatedFractionallySizedBoxDemo(),
        ),
      ),
    );
  }
}

class AnimatedFractionallySizedBoxDemo extends StatefulWidget {
  @override
  _AnimatedFractionallySizedBoxDemoState createState() => _AnimatedFractionallySizedBoxDemoState();
}

class _AnimatedFractionallySizedBoxDemoState extends State<AnimatedFractionallySizedBoxDemo> with SingleTickerProviderStateMixin {
  double _flex = 0.3; // 初始比例

  void _changeFlex() {
    setState(() {
      _flex = _flex == 0.3 ? 0.7 : 0.3; // 切换比例
    });
  }

  @override
  Widget build(BuildContext context) {
    return Column(
      mainAxisAlignment: MainAxisAlignment.center,
      children: <Widget>[
        ElevatedButton(
          onPressed: _changeFlex,
          child: Text('Change Size'),
        ),
        SizedBox(height: 20),
        Container(
          color: Colors.grey[200],
          height: 200,
          width: double.infinity,
          child: AnimatedFractionallySizedBox(
            widthFactor: _flex,
            heightFactor: _flex,
            alignment: Alignment.center,
            child: Container(
              color: Colors.blue,
              child: Center(
                child: Text(
                  'Animated Box',
                  style: TextStyle(color: Colors.white),
                ),
              ),
            ),
            duration: Duration(seconds: 2), // 动画持续时间
            curve: Curves.easeInOut, // 动画曲线
          ),
        ),
      ],
    );
  }
}

在这个示例中,我们创建了一个 AnimatedFractionallySizedBoxDemo 组件,其中包含一个按钮和一个 AnimatedFractionallySizedBox。点击按钮时,会改变 _flex 的值,从而触发子组件大小的动画变化。

  • widthFactorheightFactor 用于设置子组件相对于父容器的宽度和高度比例。
  • alignment 用于设置子组件在父容器中的对齐方式。
  • duration 用于设置动画的持续时间。
  • curve 用于设置动画的曲线,这里使用了 Curves.easeInOut

这个示例展示了如何使用 animated_fractionally_sized_box 来创建具有动画效果的布局,你可以根据需要调整比例和动画参数。

回到顶部