Flutter动画过渡效果插件tween_image_widget的使用

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

Flutter 动画过渡效果插件 tween_image_widget 的使用

tween_image_widget 是一个用于在 Flutter 中实现图像序列动画的插件。通过该插件,您可以轻松地创建重复或可控的动画效果。下面将详细介绍如何使用这个插件,并提供一个完整的示例 Demo。

1. 添加依赖

首先,在 pubspec.yaml 文件中添加 tween_image_widget 作为依赖项:

dependencies:
  tween_image_widget: ^0.0.2  # 请使用 pub 上的最新版本

2. 使用 Widget

2.1 重复动画

如果您想创建一个简单的重复动画,只需传递图像路径、索引范围和动画持续时间即可。例如:

TweenImageWidget(
  ImagesEntry(1, 8, "assets/img/addpage_icon_load%s.png"),  // 图像路径模板
  durationMilliseconds: 500,  // 动画持续时间为 500 毫秒
  height: 50,  // 可选:设置图像的高度
  width: 50,   // 可选:设置图像的宽度
)
2.2 控制动画

如果您需要手动控制动画(如暂停、恢复、反转等),则需要将 repeat 参数设置为 false,并定义 TweenImageWidget,然后根据场景调用 reverse()forward()stop() 等方法。例如:

class _MyHomePageState extends State<MyHomePage> {
  TweenImageWidget _curtainAnimationImage;

  [@override](/user/override)
  void initState() {
    super.initState();
    _curtainAnimationImage = TweenImageWidget(
      ImagesEntry(1, 20, "equipmentcontrol_pic_curtain%s".toAssetImg()),  // 图像路径模板
      durationMilliseconds: 5000,  // 动画持续时间为 5000 毫秒
      repeat: false,  // 不自动重复
    );
  }

  void _startAnimation() {
    _curtainAnimationImage.forward();  // 开始正向播放动画
  }

  void _stopAnimation() {
    _curtainAnimationImage.stop();  // 停止动画
  }

  void _reverseAnimation() {
    _curtainAnimationImage.reverse();  // 反向播放动画
  }
}
2.3 其他参数
  • startsValue: 动画的起始状态值,以百分比计算。例如,startsValue: curtainPosition / 100 表示从 curtainPosition 百分比处开始动画。
  • widthheight: 可选参数,用于指定图像的宽度和高度。如果设置了这些参数,图像将根据指定的尺寸进行缩放。

3. 示例代码

下面是一个完整的示例,展示了如何使用 tween_image_widget 实现门的开关动画。用户可以通过点击按钮来控制门的开闭。

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

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

class MyApp extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'tween_image_widget Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: MyHomePage(title: 'Tween Image Widget Home Page'),
    );
  }
}

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

  final String title;

  [@override](/user/override)
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  bool isDoorOpen = true;
  TweenImageWidget _doorAnimationImage;

  [@override](/user/override)
  void initState() {
    super.initState();
    _doorAnimationImage = TweenImageWidget(
      ImagesEntry(1, 4, "images/equipmentcontrol_pic_door%s"),  // 图像路径模板
      durationMilliseconds: 600,  // 动画持续时间为 600 毫秒
      repeat: false,  // 不自动重复
      startsValue: isDoorOpen ? 1 : 0,  // 根据门的状态设置起始值
    );
  }

  void _toggleDoor() {
    setState(() {
      isDoorOpen = !isDoorOpen;  // 切换门的状态
      if (isDoorOpen) {
        _doorAnimationImage.forward();  // 打开门
      } else {
        _doorAnimationImage.reverse();  // 关闭门
      }
    });
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text(widget.title),
      ),
      body: Column(
        children: [
          Expanded(child: _doorAnimationImage),  // 显示动画
          SizedBox(height: 20),
          Row(
            mainAxisAlignment: MainAxisAlignment.spaceAround,
            children: [
              ElevatedButton(
                child: Text("Lock"),
                onPressed: () {
                  _toggleDoor();  // 关闭门
                },
              ),
              ElevatedButton(
                child: Text("Unlock"),
                onPressed: () {
                  _toggleDoor();  // 打开门
                },
              ),
            ],
          ),
        ],
      ),
    );
  }
}

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

1 回复

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


当然,下面是一个关于如何在Flutter中使用tween_image_widget插件来实现动画过渡效果的代码案例。这个插件允许你在两个图像之间创建平滑的过渡效果。

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

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

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

接下来是一个完整的示例代码,展示了如何使用TweenImage来在两个图像之间创建过渡效果:

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

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

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

class TweenImageDemo extends StatefulWidget {
  @override
  _TweenImageDemoState createState() => _TweenImageDemoState();
}

class _TweenImageDemoState extends State<TweenImageDemo> with SingleTickerProviderStateMixin {
  late AnimationController _controller;
  late Animation<double> _animation;

  @override
  void initState() {
    super.initState();
    _controller = AnimationController(
      duration: const Duration(seconds: 2),
      vsync: this,
    )..repeat(reverse: true);

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

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

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Tween Image Widget Demo'),
      ),
      body: Center(
        child: TweenImage(
          beginImage: AssetImage('assets/image1.png'), // 替换为你的第一张图片路径
          endImage: AssetImage('assets/image2.png'),   // 替换为你的第二张图片路径
          animation: _animation,
          width: 300,
          height: 300,
        ),
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: () {
          setState(() {
            // 可以在这里触发动画重新开始,如果需要的话
            // 例如,可以重置动画控制器
            _controller.reset();
            _controller.forward();
          });
        },
        tooltip: 'Restart Animation',
        child: Icon(Icons.replay),
      ),
    );
  }
}

在这个示例中:

  1. 我们创建了一个TweenImageDemo小部件,它是一个有状态的部件,因为我们需要在其中管理动画控制器。
  2. initState方法中,我们初始化了AnimationController,并设置了动画的持续时间为2秒。_controller.repeat(reverse: true)让动画在正向和反向之间不断循环。
  3. _animation是一个Animation<double>对象,它使用Tween<double>从0到1进行动画化。
  4. build方法中,我们使用TweenImage小部件,将beginImageendImage分别设置为我们希望过渡的两个图像。
  5. animation属性设置为我们的_animation对象,这样TweenImage就可以根据动画的进度在两个图像之间进行过渡。
  6. 我们还添加了一个浮动操作按钮,可以在需要时重置并重新启动动画。

请确保将assets/image1.pngassets/image2.png替换为你实际使用的图像路径,并将这些图像添加到你的pubspec.yaml文件的assets部分中。

这样,你就可以在Flutter应用中实现两个图像之间的平滑过渡效果了。

回到顶部