Lottie动画学习一 —— 入门博客介绍

Lottie是什么?

今天接手一个新项目的时候发现以前的同事引入了Lottie库,因为之前没有接触过后来百度了一下发现原来这个库主要是用来实现一些比较复杂的动画的。下面是官方的介绍,Lottie是Airbnb开源的一个支持Android、ios以及ReactNative,利用json文件的方式快速的实现动画效果的库,接下来就介绍一下它的如何使用的。

最开始我们就去github上看看它的源代码以及Demo:

https://github.com/airbnb/lottie-android

以前我们在实现动画的时候一般都有以下几种方式:

  • 使用帧动画。这种方式就是多张图片连续的切换,所以可想而知一个最大的弊端就是会导致最后的apk会非常的大。
  • 使用Gif。gif的话可以实现很多复杂的动画,但是我们知道Android本身是不支持gif的,而且还需要为各种屏幕的尺寸和分辨率做适配的,还有一个很重要的问题就是gif也会导致apk非常大的。
  • 使用代码实现,比如说补间动画和属性动画来实现很多复杂的动画,但是对于有些不擅长于写动画的童鞋来说是一个头痛的问题。
    为了解决上述等等各种问题,懒惰的人们就开发一款可以跨平台的动画框架,动画的路径数据就用一种通用的格式来记录,然后中间的话就分别用对应的平台来实现动画的走动。所以这个时候Lottie就出现了。

设计师的工作(其实这边我们可以不关心)

  • 首先我们让设计使用Adobe的Afeter Effects(简称AE)工具制作这个动画。
  • 然后需要在AE中安装一个叫做Bodymovin的插件,解压缩之后只需要\build\extension\bodymovin.zxp这个档案就可以
    image_1bele2fm415c4hmpu2abeb1i3k9.png-28.1kB

  • 手动安装plugin,以window系统而言,要先下载ExMan Command Line tool 并解压缩,再把下载的bodymovin压缩后的bodymovin-master/build/extension 目录下的bodymovin.zxp这个档案复制进去同一个资料夹。
    image_1beleasbktev188p6imc1o1om.png-90.8kB

  • 去找cmd,并以系统管理员身份执行。
    image_1beledjtt1e80q7trejfpp1ohn13.png-36.1kB

  • 打开 ExManCmd_win所在的路径,进入ExManCmd_win的资料夹中

    image_1belef8ch1d0e166813fr1mok1vca1g.png-15.4kB

  • 接着打 ExManCmd.exe /install bodymovin.zxp 就完成了

    image_1beleg5uoced1jdj1qolplg1uhr1t.png-17.2kB

  • 再来进入AE 后,可以在windows/extentions/bodymovin 找到插件,开启后按下Render 就完成了。 重点来了,这时会在你选的Destination Folder目录中生成一个json格式的文件,这个 json 文件描述了该动画的一些关键点的坐标以及运动轨迹,然后再转发给开发人员。
    image_1belenjie1hmr17b81upq1eht2ca2a.png-188.9kB

    工程师的工作

  • 首先我们需要在build.gradle 文件引入动画框架

    dependencies {  
         compile 'com.airbnb.android:lottie:2.0.0-beta4'
    }

    根据平时的经验我们都知道UI给我们的动画文件或者是资源文件都会放到drawable目录下去的,但是这次 UI 给我们的动画文件我们只能放到Assets目录下的,并不能放到其他的目录下,因为只有这样子的框架才能更好的找到其路径的。下面我们分别的来介绍三种方式加载动画文件。

    1. Assets目录默认加载
    首先我们将动画文件放到默Assets目录下,然后在layout布局文件中直接引用就可以了,其中fileName就是对应Assets目录下的文件的名字;loop true表示循环播放,false表示只播放一次; auto_play表示一开始就自动播放,设置false的话,就需要自己手动的调用 playAnimation() 来手动进行播放控制

    <com.airbnb.lottie.LottieAnimationView
        android:id="@+id/animation_view"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        app:lottie_fileName="data.json"
        app:lottie_loop="true"
        app:lottie_autoPlay="true" />

    2. 从网络上直接获取json数据进行加载

    public void loadRemoteLottie() {
        Request request;
        try {
            request = new Request.Builder().url(url).build();
        } catch (IllegalArgumentException e) {
            return;
        }
    
        if (client == null) {
            client = new OkHttpClient();
        }
        client.newCall(request).enqueue(new Callback() {
            public void onFailure(Call call, IOException e) {
            }
    
            public void onResponse(Call call, Response response) throws IOException {
                if (response.isSuccessful()) {
                    try {
                        JSONObject json = new JSONObject(response.body().string());
                        LottieComposition.Factory.fromJson(mResource, json, 
                                            new OnCompositionLoadedListener() {
                            @Override
                            public void onCompositionLoaded(LottieComposition lottieComposition) {
                                animation_view_network.setProgress(0);
                                animation_view_network.loop(true);
                                animation_view_network.setComposition(composition);
                                animation_view_network.playAnimation();
                            }
                        });
                    } catch (JSONException e) {
    
                    }
                }
            }
        });
    }

    我们可以通过获取远程json数据的这种格式来动态的配置应用里面的动画,这里面有几个要注意的问题:

    1. 这里我们在不能再像以前样子在layout中配置那些属性,这个时候我们只需要在xml中写一个简单的布局文件就可,如果你再设置那些属性的话,比如说你设置了自动播放和循环播放,但是你都还没有加载到资源,所以这个时候会有问题的。
    2. 这种通过获取json字符串来实现动画的方式,里面不能包含有图片,比如UE在做动画的时候有时候可能会带有图片的(特殊要求,比如说有些json不能实现的复杂的图片),这个时候如果还是通过这种方式再去加载的话,它会找不到路径的。

3. 从本地加载带有图片的文件
    有的时候UI做的AE动画文件中可能会带有图片的,这个时候如果你再使用原来那种通过获取json字符串的方式去获取本地文件的字符串的时候,这个时候会报一个内部的 You must set an images folder before loading an image. Set it with LottieComposition#setImagesFolder or LottieDrawable#setImagesFolder 因为它有图片,需要我们根据设定的路径去寻找图片并且渲染出来,这个后期我们会慢慢的分析。

private void loadLocal() {
        String sdcardPath = Environment.getExternalStorageDirectory();
        String path = sdcardPath + "/test_animation/newtest/data.json";
        final String imageFolder = sdcardPath + "/test_animation/newtest/images/";
        //1. 开始的时候我们需要设置它的图片存储的地方
        animation_view_network.setImageAssetsFolder(imageFolder);
        File file = new File(path);
        if(file.exists()) {
            try {
                FileInputStream fis = new FileInputStream(file);
                LottieComposition.Factory.fromInputStream(this, fis, 
                                                    new OnCompositionLoadedListener() {
                    @Override
                    public void onCompositionLoaded(LottieComposition lottieComposition) {
                        setComposition(lottieComposition);
                    }
                });
                //2. 然后调用该方法分别的去获取对应图片的地址,然后转化为Bitmap
                animation_view_network.setImageAssetDelegate(new ImageAssetDelegate() {
                    @Override
                    public Bitmap fetchBitmap(LottieImageAsset lottieImageAsset) {
                        String path = imageFolder + lottieImageAsset.getFileName();
                        BitmapFactory.Options opts = new BitmapFactory.Options();
                        opts.inScaled = true;
                        opts.inDensity = 160;
                        Bitmap bitmap = BitmapFactory.decodeFile(path, opts);
                        return bitmap;
                    }
                });
            } catch (FileNotFoundException e) {
                e.printStackTrace();
            }
        }
    }

     本次我们只是对Lottie Android做一个最基本如何使用它,但是我们学习一个框架的目的不仅仅只是为了学会使用它,更关键的是如何去学习它的思想以及一些好的代码规划。比如说对于本框架来说,我们的目的就是先弄清楚它里面的实现逻辑以及一些好的代码规范的,这样子我们以后也可以写出一个属于自己的框架。下面将会结合官方的例子以及代码将代码和demo放在一起,然后放在csdn上,感兴趣的同学可以在上面下载。

感激以下文章

Lottie- 让Android动画实现更简单

Lottie动画Demo是一种用于创建和展示矢量动画的工具。通过使用Lottie库,我们可以将由设计师在Adobe After Effects中创建的动画文件(如JSON文件)直接导出到移动应用程序中,并在应用中实现动画效果。 Lottie动画Demo具有以下优点和特点: 1. 高效性:Lottie动画使用矢量图形格式,因此文件体积较小,加载速度快。这使得应用程序能够在各种设备上平滑运行,并节省了用户的流量和存储空间。 2. 动画效果多样性:设计师可以在After Effects中自由制作各种复杂的动画效果,并通过Lottie库导出为可重用的JSON文件。这些动画可以应用于按钮、图标、背景等各种元素,使应用程序更具吸引力和互动性。 3. 可定制性:Lottie动画Demo不仅能够播放设计师创建的静态动画,还可以根据应用程序需求进行动态修改和操作。开发者可以使用Lottie库中提供的方法,通过代码控制动画的播放速度、循环次数、暂停和继续等等。 4. 跨平台兼容性:Lottie动画Demo可在iOS、Android和Web等多个平台上使用。这使得开发者能够创建一次动画,并在不同的操作系统和设备上无需进行额外的开发工作即可实现相同的动画效果。 总结而言,Lottie动画Demo是一项强大的工具,可以让应用程序中的设计更加丰富和生动。它不仅让设计师能够创建复杂的动画效果,还提供了开发者所需的灵活性和可定制性。有了Lottie动画Demo,我们可以为应用程序带来更出色的用户体验,提升用户对应用程序的满意度和忠诚度。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值