最新公告
  • 欢迎您光临起源地模板网,本站秉承服务宗旨 履行“站长”责任,销售只是起点 服务永无止境!立即加入钻石VIP
  • [Flutter]如何使用Rive动画

    正文概述 掘金(xSILENCEx)   2021-06-14   1986

    Rive2动画效果:

    [Flutter]如何使用Rive动画

    预览网站:rive-nav.liugl.cn/

    开始使用

    Rive2文件的后缀为.riv,将文件拖到Rive预览工具可以查看文件内提供的动画和状态

    [Flutter]如何使用Rive动画

    有了动画列表就可以开始准备使用了

    添加依赖
    rive: ^0.7.17

    .riv文件放到指定目录并引用

    assets:
        - riv_files/
    

    引入依赖
    import 'package:rive/rive.dart';

    这里我们制作的是一个简单的动画图标,所以只有两个动画:idleactive

    针对该图标的属性进行简单的封装:

    import 'package:flutter/material.dart';
    import 'package:flutter/services.dart';
    import 'package:rive/rive.dart';
    
    ///rive图标封装
    class RiveIcon extends StatefulWidget {
      const RiveIcon({
        Key? key,
        required this.isSelected,
        required this.rivPath,
        this.idle = 'idle',
        this.active = 'active',
      }) : super(key: key);
    
      ///是否选中
      final bool isSelected;
    
      ///文件路径
      final String rivPath;
    
      ///闲置状态
      final String idle;
    
      ///激活状态
      final String active;
    
      @override
      _RiveIconState createState() => _RiveIconState();
    }
    
    class _RiveIconState extends State<RiveIcon> {
      ///画布
      Artboard? _riveArtboard;
    
      @override
      void initState() {
        super.initState();
        _init();
      }
    
      @override
      void setState(VoidCallback fn) {
        if (mounted) super.setState(fn);
      }
    
      @override
      void didUpdateWidget(covariant RiveIcon oldWidget) {
        if (oldWidget.isSelected != widget.isSelected) {
          widget.isSelected ? _select() : _unSelect();
        }
    
        super.didUpdateWidget(oldWidget);
      }
    
      @override
      void dispose() {
        _riveArtboard?.remove();
        super.dispose();
      }
    
      ///选中
      void _select() {
        _riveArtboard?.removeController(SimpleAnimation(widget.idle));
        _riveArtboard?.addController(SimpleAnimation(widget.active));
      }
    
      ///未选中
      void _unSelect() {
        _riveArtboard?.removeController(SimpleAnimation(widget.active));
        _riveArtboard?.addController(SimpleAnimation(widget.idle));
      }
    
      ///初始化
      Future<void> _init() async {
        _riveArtboard =
            RiveFile.import(await rootBundle.load(widget.rivPath)).mainArtboard;
    
        setState(() {});
    
        widget.isSelected ? _select() : _unSelect();
      }
    
      @override
      Widget build(BuildContext context) {
        return _riveArtboard == null
            ? const SizedBox.shrink()
            : Rive(artboard: _riveArtboard!);
      }
    }
    

    这样做封装是为了更好地控制动画的状态,非循环的rive动画在被添加时只会播放一次,想重新从头开始播放需要移除该动画并重新添加

    ///选中
    void _select() {
        _riveArtboard?.removeController(SimpleAnimation(widget.idle));
        _riveArtboard?.addController(SimpleAnimation(widget.active));
    }
    
    ///未选中
    void _unSelect() {
        _riveArtboard?.removeController(SimpleAnimation(widget.active));
        _riveArtboard?.addController(SimpleAnimation(widget.idle));
    }
    

    如何使用?

    RiveIcon(
        rivPath: 'riv_files/test.riv',
        isSelected: true,
        idle: 'idle',
        active: 'active',
    )
    

    rivPath为文件路径
    修改isSelected以控制动画状态
    idleactive的值可根据图标内的动画名自定义

    [Flutter]如何使用Rive动画

    为什么不推荐使用官方提供的.asset或者.network构造函数?

    官方提供的构造函数不包含状态管理,难以切换动画,只适合循环动画或者一次性动画

    PS:

    Demo地址
    rive文件也在demo里面,感兴趣的朋友可以尝试使用
    如果对rive动画的制作也感兴趣可以看一下:[Flutter] Rive2(新版Flare)编辑工具简介


    起源地下载网 » [Flutter]如何使用Rive动画

    常见问题FAQ

    免费下载或者VIP会员专享资源能否直接商用?
    本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
    提示下载完但解压或打开不了?
    最常见的情况是下载不完整: 可对比下载完压缩包的与网盘上的容量,若小于网盘提示的容量则是这个原因。这是浏览器下载的bug,建议用百度网盘软件或迅雷下载。若排除这种情况,可在对应资源底部留言,或 联络我们.。
    找不到素材资源介绍文章里的示例图片?
    对于PPT,KEY,Mockups,APP,网页模版等类型的素材,文章内用于介绍的图片通常并不包含在对应可供下载素材包内。这些相关商业图片需另外购买,且本站不负责(也没有办法)找到出处。 同样地一些字体文件也是这种情况,但部分素材会在素材包内有一份字体下载链接清单。
    模板不会安装或需要功能定制以及二次开发?
    请QQ联系我们

    发表评论

    还没有评论,快来抢沙发吧!

    如需帝国cms功能定制以及二次开发请联系我们

    联系作者

    请选择支付方式

    ×
    迅虎支付宝
    迅虎微信
    支付宝当面付
    余额支付
    ×
    微信扫码支付 0 元