ios json文件加载动态图,让app真正动起来

    最近项目中遇到的需求是这样的:打开app,我们需要加载一个动态的网络图片(gif图).但美工做好之后,给了我们一个几十兆的gif动画图片(而且还是压缩压缩再压缩的都有毛边儿效果了),先不说效果怎么样,单纯的加在项目中,而且还是动态获取,可想而知,用户打开app.首先下载个几十兆的动态图!估计app在用户端的手机上存活的时间不超过三秒!!!更别说后续体验怎么样了.

     鉴于以上弊端,在网上查了些资料,发现了一个ios、 Android、 macOS、React Native中均可使用的开源库:Lottie!

     大致工作原理是:Lottie是一个可以解析使用【bodymovin】插件从 Adobe After Effects 中导出的格式为 json 的文件,并在 iOS、Android、macOS、React Native 中进行解析使用的开源库。

     至于如何制成并导出动画json文件及lottie的使用 ,大家可以参考一下两个链接,我也在博主的博客中受益!!!再次也多谢技术分享的大佬们!

     1.lottie官网 gitHub地址:https://github.com/airbnb/lottie-ios

     2.iTerryWang博主的:Lottie简介 & iOS集成使用.


    那么本篇文章中,不详细叙述关于lottie的原理等.只粘出lottie在项目中的使用情况.

    假设我们已经在项目中配置了lottie.

    场景1:UI设计提供了动画json 文件及所需images包资源.(此场景在app中每次固定显示,耦合度较高,使用条件有限!)

    场景1中效果,我们可以直接使用官网给出的简单实现方法:

     1.先将json文件及images图片资源包拖到工程中.

        例: json文件为:data.json

        声明个lottie动画对象: 

        @property(nonatomic,strong)LOTAnimationView *launchAnimation;

    //添加动画:

    _launchAnimation =[LOTAnimationView animationNamed:@"data"];//实例化对象

    _launchAnimation.cacheEnable =NO;

    _launchAnimation.frame =CGRectMake(20, 200, 350, 250);//动画范围

    _launchAnimation.contentMode =UIViewContentModeScaleToFill;

    _launchAnimation.animationSpeed =0.5;//动画时间

    _launchAnimation.loopAnimation =YES;//是否循环动画

    [_launchAnimation play];//开始动画

    [self.view addSubview:_launchAnimation];


   场景2:动态网络获取相关json文件及所需images包资源.(此场景可应对项目中gif动图根据需求随时修改,耦合度较低,也经常被使用!)

    //创建文件夹

    NSFileManager *fileManager = [NSFileManager defaultManager];

    NSString *str1 = NSHomeDirectory();

    NSString *filePath = [NSString stringWithFormat:@"%@/Documents/imageViews",str1];

    if(![fileManager fileExistsAtPath:filePath]){

        NSString *path = [NSHomeDirectory() stringByAppendingPathComponent:@"Documents"];

        NSString *directryPath = [path stringByAppendingPathComponent:@"imageViews"];

        [fileManager createDirectoryAtPath:directryPath withIntermediateDirectories:YES attributes:nil error:nil];


        filePath =directryPath;

    }

    //NSLog(@"filePath --- %@",filePath);

    //假设img资源包有12个元素(当然返回多少图片根据服务器返回结果确定!)

    for (int i =0; i <12; i ++) {

        NSString *urlString =[NSString stringWithFormat:@"http://192.168.1.188/images/img_%d.png",i];

        NSData *data = [NSData dataWithContentsOfURL:[NSURL  URLWithString:urlString]];

        UIImage *image = [UIImage imageWithData:data]; // 取得图片

        NSString * string =[NSString stringWithFormat:@"%@/images/img_%d.png",filePath,i];

        BOOL success = [UIImagePNGRepresentation(image) writeToFile:string  atomically:YES];

        if (success){

            NSLog(@"写入本地成功");

        }

    }

    //data.json文件存储这里不描述

    //找到data.json文件路径.

    NSString * dataPath  =[NSString stringWithFormat:@"%@/data.json",filePath];

    _launchAnimation =[LOTAnimationView animationWithFilePath:dataPath];

    _launchAnimation.cacheEnable =NO;

    _launchAnimation.frame =CGRectMake(20, 200, 350, 250);//动画范围

    _launchAnimation.contentMode =UIViewContentModeScaleToFill;

    _launchAnimation.animationSpeed =0.5;//动画时间

    _launchAnimation.loopAnimation =YES;//是否循环动画

    [_launchAnimation play];//开始动画

    [self.view addSubview:_launchAnimation];


       到此,lottie加载json文件gif动画,在项目中的使用基本解决,更多特效如有需要继续研究,也希望大佬们有好的建议,积极分享讨论!欢迎加入技术交流群One Team:  234713941 



你可能感兴趣的:(iOS)