Flutter动画位置控制插件position_animator的使用

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

Flutter动画位置控制插件position_animator的使用

position_animator 是一个 Flutter 包,允许你从一个部件当前位置平滑地移动到屏幕上的另一个部件的位置。该包还提供了自定义动画行为和外观的功能。

特性

  • 动画部件从当前位置移动到目标部件的位置。
  • 可以自定义动画曲线和持续时间。
  • 选项可以调整动画过程中部件的大小。
  • 可以使用自定义构建器来定义部件如何被动画化。

使用示例

以下是一些示例图片:

Image Image Image Image

入门指南

安装

在你的 pubspec.yaml 文件中添加 position_animator

dependencies:
  position_animator: ^1.0.0

然后运行:

flutter pub get
使用

要使用 PositionAnimator,你需要将要动画的部件包装在一个 PositionAnimatorWidget 中,并为要动画的部件和目标部件提供 GlobalKey

import 'dart:math';
import 'package:flutter/material.dart';
import 'package:position_animator/position_animator.dart';

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

class MyApp extends StatelessWidget {
  final GlobalKey appBarKey = GlobalKey();
  final GlobalKey bottomBarKey = GlobalKey();

  MyApp({super.key});

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      debugShowCheckedModeBanner: false,
      home: Builder(builder: (context) {
        return Scaffold(
          appBar: AppBar(
            title: const Text('AppBar'),
            actions: [
              Icon(
                Icons.shopping_cart_outlined,
                key: appBarKey,
              ),
              const SizedBox(width: 20),
            ],
          ),
          bottomNavigationBar: SizedBox(
            height: kToolbarHeight,
            child: AppBar(
              title: const Text('BottomBar'),
              actions: [
                Icon(
                  Icons.shopping_cart_outlined,
                  key: bottomBarKey,
                ),
                const SizedBox(width: 20),
              ],
            ),
          ),
          body: ListView.separated(
            itemCount: 20,
            padding: const EdgeInsets.all(20),
            itemBuilder: (BuildContext context, int index) {
              final GlobalKey widgetKey = GlobalKey();
              return Row(
                children: [
                  PositionAnimatorWidget(
                    key: widgetKey,
                    child: SizedBox.square(
                      dimension: 100,
                      child: Card(
                        color:
                        Color.fromRGBO(Random().nextInt(255), Random().nextInt(255), Random().nextInt(255), 1),
                        child: const FittedBox(
                          fit: BoxFit.scaleDown,
                          child: Icon(Icons.shopping_basket_outlined),
                        ),
                      ),
                    ),
                  ),
                  const Spacer(flex: 2),
                  ElevatedButton(
                    onPressed: () {
                      final animator = PositionAnimator(
                        targetWidgetKey: bottomBarKey,
                        widgetKey: widgetKey,
                        duration: const Duration(seconds: 3),
                        curve: Curves.elasticInOut,
                      );
                      animator.start(context);
                    },
                    child: const Text('Add'),
                  ),
                  const SizedBox(width: 20),
                  ElevatedButton(
                    onPressed: () {
                      final animator = PositionAnimator(
                        targetWidgetKey: appBarKey,
                        widgetKey: widgetKey,
                        duration: const Duration(seconds: 1),
                        curve: Curves.linear,
                      );
                      animator.start(context);
                    },
                    child: const Text('Add'),
                  ),
                ],
              );
            },
            separatorBuilder: (BuildContext context, int index) {
              return const Divider();
            },
          ),
        );
      }),
    );
  }
}

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

1 回复

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


当然,position_animator 是一个在 Flutter 中用于控制动画位置的插件。以下是一个如何使用 position_animator 的代码案例,展示如何控制动画对象的位置。

首先,确保你已经在 pubspec.yaml 文件中添加了 position_animator 依赖:

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

然后,运行 flutter pub get 来安装依赖。

接下来是一个完整的示例代码,展示如何使用 position_animator 来控制动画对象的位置:

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

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Position Animator Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: PositionAnimatorDemo(),
    );
  }
}

class PositionAnimatorDemo extends StatefulWidget {
  @override
  _PositionAnimatorDemoState createState() => _PositionAnimatorDemoState();
}

class _PositionAnimatorDemoState extends State<PositionAnimatorDemo> with SingleTickerProviderStateMixin {
  late PositionAnimatorController _controller;

  @override
  void initState() {
    super.initState();
    _controller = PositionAnimatorController(
      duration: const Duration(seconds: 2),
      curve: Curves.easeInOut,
      vsync: this,
    )..addStatusListener((status) {
        if (status == AnimationStatus.completed) {
          _controller.reverse();
        } else if (status == AnimationStatus.dismissed) {
          _controller.forward();
        }
      });

    // 初始位置
    _controller.value = Position(dx: 0, dy: 0);
  }

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

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Position Animator Demo'),
      ),
      body: Center(
        child: AnimatedBuilder<Position>(
          animation: _controller,
          builder: (context, child) {
            return Positioned(
              left: _controller.value.dx,
              top: _controller.value.dy,
              child: Container(
                width: 50,
                height: 50,
                color: Colors.red,
                child: Center(child: Text('Animate')),
              ),
            );
          },
        ),
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: () {
          // 动画路径:从当前位置到 (200, 200)
          _controller.animateTo(Position(dx: 200, dy: 200));
        },
        tooltip: 'Animate',
        child: Icon(Icons.play_arrow),
      ),
    );
  }
}

代码说明:

  1. 依赖导入:在 pubspec.yaml 中添加 position_animator 依赖。
  2. 动画控制器:在 _PositionAnimatorDemoState 中创建 PositionAnimatorController 对象,并设置动画时长和曲线。
  3. 动画状态监听:在 initState 中添加动画状态监听器,使动画在完成后反向播放,在反向播放结束后重新开始。
  4. 动画构建:使用 AnimatedBuilder 包装 Positioned 小部件,通过 _controller.value 获取当前动画位置。
  5. 触发动画:在浮动操作按钮的点击事件中调用 _controller.animateTo 方法,使动画对象移动到指定位置。

这个示例展示了如何使用 position_animator 来控制动画对象的位置,并通过按钮触发动画。你可以根据需要调整动画路径和参数。

回到顶部