Flutter动态图片展示插件gif的使用

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

Flutter动态图片展示插件gif的使用

Overview

在Flutter中,为了实现GIF动画,我们可以直接使用Image组件加载GIF文件。然而,如果需要对GIF进行更精细的操作(如改变播放速度、控制播放帧范围等),则可以使用专门的GIF处理插件。这个插件不仅能够帮助我们解决上述问题,还能有效管理GIF缓存,避免每次加载时重新解析每一帧。

Example

下面是一个完整的示例代码,展示了如何异步加载GIF并显示文本占位符,在GIF加载完成后重置控制器并运行到结束。

示例代码

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

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

class MyApp extends StatelessWidget {
  const MyApp({super.key});

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: const MyHomePage(title: 'Flutter Demo Home Page'),
    );
  }
}

class MyHomePage extends StatefulWidget {
  const MyHomePage({super.key, required this.title});

  final String title;

  @override
  State<MyHomePage> createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> with TickerProviderStateMixin {
  late final GifController controller1, controller2, controller3;
  int _fps = 30;

  @override
  void initState() {
    controller1 = GifController(vsync: this);
    controller2 = GifController(vsync: this);
    controller3 = GifController(vsync: this);
    super.initState();
  }

  @override
  Widget build(BuildContext context) {
    return DefaultTabController(
      length: 2,
      child: Scaffold(
        appBar: AppBar(
          title: Text(widget.title),
          bottom: const TabBar(
            tabs: [
              Tab(
                child: Text('ImageProviders'),
              ),
              Tab(
                child: Text('Manage'),
              )
            ],
          ),
        ),
        body: TabBarView(
          children: [
            ListView(
              clipBehavior: Clip.none,
              children: [
                const Text('AssetImage (original fps, loop)'),
                Gif(
                  autostart: Autostart.loop,
                  placeholder: (context) =>
                      const Center(child: CircularProgressIndicator()),
                  image: const AssetImage('assets/rick.gif'),
                ),
                const Text('NetworkImage (30 fps, once)'),
                Gif(
                  fps: 30,
                  autostart: Autostart.once,
                  placeholder: (context) =>
                      const Center(child: CircularProgressIndicator()),
                  image: const NetworkImage(
                      'https://i.giphy.com/media/Ju7l5y9osyymQ/giphy.webp'),
                ),
                const Text('NetworkImage (20 seconds, once)'),
                Gif(
                  controller: controller2,
                  duration: const Duration(seconds: 20),
                  autostart: Autostart.once,
                  placeholder: (context) =>
                      const Center(child: CircularProgressIndicator()),
                  image: const NetworkImage(
                      'https://i.giphy.com/media/Ju7l5y9osyymQ/giphy.webp'),
                ),
              ],
            ),
            Column(
              children: [
                Gif(
                  controller: controller3,
                  fps: _fps,
                  image: const AssetImage('assets/rick.gif'),
                ),
                AnimatedBuilder(
                  animation: controller3,
                  builder: (BuildContext context, Widget? child) {
                    return Slider(
                      label: 'Timeline',
                      value: controller3.value,
                      onChanged: (v) => setState(() {
                        controller3.value = v;
                      }),
                    );
                  },
                ),
                Row(
                  mainAxisAlignment: MainAxisAlignment.spaceEvenly,
                  children: [
                    IconButton(
                      icon: const Icon(Icons.play_arrow),
                      onPressed: () {
                        controller3.repeat();
                      },
                    ),
                    IconButton(
                      icon: const Icon(Icons.stop),
                      onPressed: () {
                        controller3.stop();
                      },
                    ),
                  ],
                ),
                Slider(
                  label: _fps.toString(),
                  value: _fps.toDouble(),
                  min: 1,
                  max: 60,
                  divisions: 4,
                  onChanged: (v) => setState(() {
                    controller3.stop();
                    _fps = v.round();
                  }),
                ),
              ],
            )
          ],
        ),
      ),
    );
  }
}

关键点解释

  • GifController:用于控制GIF动画的播放。通过vsync参数确保动画与屏幕刷新率同步。
  • Gif:这是一个自定义组件,用于展示GIF动画。它支持多种配置选项,例如image指定要加载的GIF资源,controller关联一个控制器来控制播放行为,placeholder设置加载中的占位符,autostart定义自动播放的行为等。
  • AnimatedBuilder:当需要根据动画状态更新UI时非常有用。这里用来创建一个滑块,用户可以通过拖动滑块手动调整当前播放进度。
  • Slider:提供了两个功能,一个是作为时间轴让用户体验手动控制播放位置;另一个则是调节帧率(fps),从而改变GIF播放的速度。

Thanks

感谢peng8350/flutter_gifimage为社区贡献了这样一个优秀的GIF处理库。

License

本项目采用MIT协议授权,详情请参阅LICENSE文件。


更多关于Flutter动态图片展示插件gif的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter动态图片展示插件gif的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


在Flutter中展示动态图片(GIF)通常使用内置的Image小部件。Flutter本身已经很好地支持GIF图片的展示,因此你无需安装额外的插件,除非你有特定的需求,比如更高级的GIF处理功能。以下是一个简单的代码示例,展示如何在Flutter应用中动态展示GIF图片。

首先,确保你有一个GIF图片文件,比如example.gif,并将其放在项目的assets文件夹中。如果你还没有assets文件夹,可以在项目的根目录下创建一个,并将GIF文件放入其中。

接下来,你需要在pubspec.yaml文件中声明这个GIF文件作为项目的资源:

flutter:
  assets:
    - assets/example.gif

然后,在你的Dart文件中,你可以使用Image.asset构造函数来加载并展示这个GIF图片。以下是一个完整的示例代码,展示如何在Flutter应用中展示一个GIF图片:

import 'package:flutter/material.dart';

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'GIF Example',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: Scaffold(
        appBar: AppBar(
          title: Text('GIF Example'),
        ),
        body: Center(
          child: Image.asset(
            'assets/example.gif',
            width: 300, // 你可以根据需要调整宽度和高度
            height: 300,
          ),
        ),
      ),
    );
  }
}

在这个示例中,我们创建了一个简单的Flutter应用,其中包含一个ScaffoldAppBar和一个居中的Image小部件。Image.asset构造函数用于从项目的assets文件夹中加载GIF图片,并指定了图片的宽度和高度。

运行这个应用,你应该能够在屏幕上看到一个动态展示的GIF图片。

如果你需要更复杂的GIF处理功能,比如控制GIF的播放、暂停或循环次数,你可能需要查找第三方插件,如flutter_gifimagecached_network_image(后者也支持GIF但主要用于网络图片的缓存)。然而,对于基本的GIF展示,Flutter内置的Image小部件已经足够强大。

回到顶部