flutter 播放SVGA动图

这篇具有很好参考价值的文章主要介绍了flutter 播放SVGA动图。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

        SVGAPlayer-Flutter:这是一个轻量级的动画渲染库,可以通过Flutter CustomPainter原生渲染动画,为您带来高性能,低成本的动画体验123。

您可以按照以下步骤使用 SVGAPlayer-Flutter 插件:

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

dependencies:
  svgaplayer_flutter: ^2.2.0

2.在需要使用插件的文件中导入插件:

import 'package:svgaplayer_flutter/svgaplayer_flutter.dart';

 3.在需要播放 SVGA 动画的位置添加 SvgaPlayer 组件:这个是最简单的播放网络图

class MyWidget extends Widget {

  @override
  Widget build(BuildContext context) {
    return Container(
      child: SVGASimpleImage(
          resUrl: "https://github.com/yyued/SVGA-Samples/blob/master/angel.svga?raw=true"),
    );
  }

}

4.播放本地SVGA动画图 

class MyWidget extends Widget {

  @override
  Widget build(BuildContext context) {
    return Container(
      child: const SVGASimpleImage(
            assetsName: '本地svga路径',)
    );
  }

}

这里是最简单的播放svga动画,无需其他操作。

SVGASimpleImage属性说明直接看我写的这篇文章就好

地址flutter 播放svga插件SVGAImage属性说明_flutter svga-CSDN博客

这里将一下如何自定义svga尺寸和控制svga动画播放次数和播放完成监听

1.控制svga尺寸,上述的代码会根据svga本身大小来显示,这里如果需要控制他的大小,需要在 SVGA的组件外层加一个父容器即可解决。这样就会生成一个高270.h宽270.h的一个svga动图播放

SizedBox(
                  height: 270.h,
                  width: 270.h,
                  child: SVGASimpleImage(
                      resUrl: list[i].svga_img!),
                )

2.控制svga播放方式,需要替换SVGASimpleImageSVGAImage,如果想控制他的播放方式需要写一个动画控制器,这里使用的repeat可以一直循环动画播放。

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

void main() => runApp(MyApp());

class MyApp extends StatefulWidget {
  @override
  _MyAppState createState() => _MyAppState();
}

// SingleTickerProviderStateMixin 单个动画  TickerProviderStateMixin多个动画
class _MyAppState extends State<MyApp> with SingleTickerProviderStateMixin {
  SVGAAnimationController animationController;

  @override
  void initState() {
    animationController = SVGAAnimationController(vsync: this);
    //初始化(可以哪里用加哪里)
    loadAnimation();
    super.initState();
  }

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

  //自定义方法
  void loadAnimation() async {
    //放入网络地址的svga动画
    final videoItem = await SVGAParser.shared.decodeFromURL(
        "https://github.com/yyued/SVGA-Samples/blob/master/angel.svga?raw=true");
    this.animationController.videoItem = videoItem;
    this
        .animationController
        .repeat() // Try to use .forward() .reverse() 这里是动画方式
        .whenComplete(() => this.animationController.videoItem = null);
  }

  @override
  Widget build(BuildContext context) {
    return Container(
      child: SVGAImage(this.animationController),
    );
  }
}

//动画属性说明一下
enum AnimationStatus {
  /// 动画开始时结束
  dismissed,

  /// 动画开始
  forward,

  /// 逆向动画
  reverse,

  /// 动画完成结束
  completed,
}

this.animationController ?.addStatusListener((status) => print('---status---$status'));

3.如果想播放一遍就停止,并进行你自己的操作,可以这样使用。使用forward

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

void main() => runApp(MyApp());

class MyApp extends StatefulWidget {
  @override
  _MyAppState createState() => _MyAppState();
}

// SingleTickerProviderStateMixin 单个动画  TickerProviderStateMixin多个动画
class _MyAppState extends State<MyApp> with SingleTickerProviderStateMixin {
  SVGAAnimationController animationController;

  @override
  void initState() {
    animationController = SVGAAnimationController(vsync: this);
    //初始化(可以哪里用加哪里)
    loadAnimation();
    super.initState();
  }

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

  //自定义方法
  void loadAnimation() async {
    //放入网络地址的svga动画
    final videoItem = await SVGAParser.shared.decodeFromURL(
        "https://github.com/yyued/SVGA-Samples/blob/master/angel.svga?raw=true");
    this.animationController.videoItem = videoItem;
    this
        .animationController
        .forward() // Try to use .forward() .reverse() 这里是动画方式
        .whenComplete(() => this.animationController.videoItem = null);
    // 监听动画
    animationController.addListener(() {
     if(animationController!.isCompleted){
        //动画播放完成,进行你自己的操作
      }
    });
  }

  @override
  Widget build(BuildContext context) {
    return Container(
      child: SVGAImage(this.animationController),
    );
  }
}
进阶玩法

       如果你一个页面要操作n个动画,使用同一个播放SVGA插件进行播放的时候就需要用到如下方法了。就是每次运行结束后要把动画的监听移除掉,要不然后续运行的时候会走2遍,再次运行可能就是4遍。所以必须要每次使用都要移除一遍,确保使用的这个是最新的这个!

//在需要的地方进行调用即可
void showSVGA(String urlSVGA) async {
    // 动画正在进行中不做处理
    if (animationControllerSL.isAnimating) {
      LogE('进行中====');
    } else {
      final videoItem = await _loadSVGA(true, urlSVGA);
      videoItem.autorelease = false;
      animationControllerSL?.videoItem = videoItem;
      animationControllerSL
          ?.forward() // Try to use .forward() .reverse()
          .whenComplete(() => animationControllerSL?.videoItem = null);
      // 监听动画
      animationControllerSL?.addListener(_animListener);
    }
  }
  void _animListener() {
    //TODO
    if (animationControllerSL.isCompleted) {
      LogE('动画结束 ${DateTime.now()}');
      setState(() {
        // 动画播放到最后一帧时停止播放
        animationControllerSL?.stop();
        //移除动画监听
        animationControllerSL.removeListener(_animListener);
       
      });
    }
  }

//播放svga的组件替换成这个
SizedBox(
   height: double.infinity,
   width: double.infinity,
   child: SVGAImage(
       animationControllerSL,    //动画控制器
       fit: BoxFit.fitHeight, //svga动画需要占据空间的方式
    ),
),

到此,无论是播放本地还是网络地址,修改尺寸,控制播放次数等操作完全可以正常运行使用。文章来源地址https://www.toymoban.com/news/detail-808367.html

到了这里,关于flutter 播放SVGA动图的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Flutter音乐播放audioplayers

    Flutter的audioplayers是一个Flutter插件,可以播放多个同时的音频文件,支持Android、iOS、Linux、macOS、Windows和web平台。它有以下特点: 可以从本地文件、网络资源或内存中加载音频 可以控制音量、进度、速度和循环 可以播放多个音频同时,或者使用单例模式 可以监听播放状态和

    2024年02月04日
    浏览(36)
  • 【Flutter】Flutter 使用 video_player 播放视频

    【Flutter】Flutter 使用 video_player 播放视频 大家好,我是小雨青年,今天我要和大家分享一款非常实用的 Flutter 包—— video_player 。这个包可以让我们在 Flutter 应用中轻松地嵌入和控制视频播放,不论是 Android、iOS 还是 Web 平台。 本文重点介绍: video_player 的基本功能和用法 如

    2024年02月05日
    浏览(37)
  • Flutter中的视频播放插件

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 video_player是一个在Flutter开发框架中进行应用程序开发的Flutter插件.在项目开发中使用video_player插件中的VideoPlayer组件进行视频播放时,需要由VideoPlayerController组件对视频的播放进行控制。VideoPlayerContr

    2024年02月11日
    浏览(29)
  • Flutter之视频播放Chewie

    Chewie是一个用于在Flutter应用中展示视频的插件。它基于video_player插件构建,提供了更多的功能和自定义选项,使视频播放更加灵活和易用。 Chewie的主要特点和功能包括: 自定义控件: Chewie提供了一个内置的视频控制栏,其中包含播放/暂停按钮、进度条、音量控制和全屏切换

    2024年02月11日
    浏览(29)
  • fijkplayer flutter 直播流播放

    fijkplayer 是 ijkplayer 的 Flutter 封装, 是一款支持 android 和 iOS 的 Flutter 媒体播放器插件, 由 ijkplayer 底层驱动。 通过纹理(Texture)接入播放器视频渲染到 Flutter 中。 目前使用的服务端是 srs_stack 我的本地环境 [✓] Flutter (Channel stable, 3.13.1, on macOS 13.6.1 22G313 darwin-x64, locale zh-Ha

    2024年02月04日
    浏览(40)
  • Flutter的AspectRatio控件实现视频播放、图片播放按照长宽比缩放

    AspectRatio小部件用于调整其子级小部件的宽高比。它将其子级小部件的宽度调整为给定的宽度,并根据宽度计算出相应的高度,以保持指定的宽高比。 调整容器的宽高比: 当您希望在布局中使用容器或小部件时,以特定的宽高比显示内容时,可以使用AspectRatio。 例如,您可能

    2024年02月13日
    浏览(46)
  • flutter开发实战-实现音效soundpool播放音频及控制播放暂停停止设置音量

    flutter开发实战-实现音效soundpool播放音频 最近开发过程中遇到低配置设备时候,在Media播放音频时候出现音轨限制问题。所以将部分音频采用音效sound来播放。 在iOS中使用sound来播放mp3音频示例如下 在iOS中通过soundID,可以控制播放与暂停,当然iOS中sound播放完成有通知回调c

    2024年02月14日
    浏览(33)
  • 【Flutter】flutter_tts 语音播放文本 Text-to-Speech

    在移动应用开发中,文本到语音(Text-to-Speech,简称 TTS)的功能越来越常见。它可以帮助我们实现语音播报、语音提示等功能,极大地丰富了应用的交互方式。 本文将介绍如何在 Flutter 中实现 TTS 功能,我们将使用一个名为 flutter_tts 的插件来完成这个任务。 本文的重点包括

    2024年02月08日
    浏览(44)
  • Flutter video_player点击重新播放

    视频播放完成之后,暂停视频,点击重新播放 pubspec.yaml依赖 要求Android compileSdkVersion 为33

    2024年02月14日
    浏览(34)
  • Flutter视频播放器在iOS端和Android端都能实现全屏播放

    Flutter开发过程中,对于视频播放的三方组件有很多,在Android端适配都挺好,但是在适配iPhone手机的时候,如果设置了 UIInterfaceOrientationLandscapeLeft 和 UIInterfaceOrientationLandscapeRight 都为false的情况下,无法做到全屏播放,因为FLutter的 SystemChrome.setPreferredOrientations 方法不适配iOS端

    2024年02月05日
    浏览(37)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包