当前位置:   article > 正文

Lottie - 让复杂动画如此简单(基础篇)_lottieanimationview.setimageassetsfolder

lottieanimationview.setimageassetsfolder

 

Introduction.gif

animation.gif

使用准备

Lottie支持多平台,使用同一个JSON动画文件,可在不同平台实现相同的效果。Android 通过Airbnb的开源项目lottie-android实现,最低支持 API 16;

在项目的 build.gradle 文件添加依赖

  1. dependencies {
  2. implementation 'com.airbnb.android:lottie:$lottieVersion'
  3. }

最新的版本号可以到官网或者github查询,lottie仅支持api16及以上。

加载方式

1. src/main/assets

  1. lottieAnimationView = findViewById(R.id.lottieAnimationView);
  2. lottieAnimationView.setImageAssetsFolder("images");
  3. lottieAnimationView.setAnimation("data.json");
  4. lottieAnimationView.loop(true);
  5. lottieAnimationView.playAnimation();
  1. <com.airbnb.lottie.LottieAnimationView
  2. android:id="@+id/lottieAnimationView"
  3. android:layout_width="wrap_content"
  4. android:layout_height="wrap_content"
  5. app:lottie_fileName="hello-world.json"
  6. app:lottie_loop="true"
  7. app:lottie_autoPlay="true" />

2. Json String

加载服务器上的.json文件,若有图片可以设置本地代理文件夹或者将图片资源放入 JSON。

  1. private void loadUrl(String url) {
  2. Request request = new Request.Builder().url(url).build();
  3. OkHttpClient client = new OkHttpClient();
  4. client.newCall(request).enqueue(new Callback() {
  5. @Override public void onFailure(Call call, IOException e) {}
  6. @Override public void onResponse(Call call, Response response) throws IOException {
  7. try {
  8. JSONObject json = new JSONObject(response.body().string());
  9. LottieComposition.Factory
  10. .fromJson(getResources(), json, new OnCompositionLoadedListener() {
  11. @Override
  12. public void onCompositionLoaded(LottieComposition composition) {
  13. lottieAnimationView.setComposition(composition);
  14. lottieAnimationView.playAnimation();
  15. }
  16. });
  17. } catch (JSONException e) {
  18. e.printStackTrace();
  19. }
  20. }
  21. });
  22. }

3. Url 服务器上的压缩包(包含images和json文件)

  • 通过url直接加载
  1. lottieAnimationView.setAnimationFromUrl(url);
  2. lottieAnimationView.playAnimation();
  • 下载到本地解压后指定文件夹代理
  1. // 资源zip
  2. public final static File LOTTIE_FILES = new File(Environment.getExternalStorageDirectory()+"/ctclient/lottie/lottie.zip");
  3. // 动效图片资源
  4. public final static File IMAGES_FILES = new File(Environment.getExternalStorageDirectory()+"/ctclient/lottie/images");
  5. // data.json路径
  6. public final static File JSON_FILE = new File(Environment.getExternalStorageDirectory()+"/ctclient/lottie/data.json");
  7. FileInputStream fis = null;
  8. if (JSON_FILE.exists()) {
  9. try {
  10. fis = new FileInputStream(JSON_FILE);
  11. } catch (FileNotFoundException e) {
  12. e.printStackTrace();
  13. }
  14. }
  15. if (fis == null || !IMAGES_FILES.exists()) {
  16. Log.i("huangssh", "动画资源不存在");
  17. return;
  18. }
  19. final String absolutePath = IMAGES_FILES.getAbsolutePath();
  20. // 开启硬件加速
  21. lottieAnimationView.useHardwareAcceleration(true);
  22. // 设置动画文件夹代理类
  23. lottieAnimationView.setImageAssetDelegate(new ImageAssetDelegate() {
  24. @Override
  25. public Bitmap fetchBitmap(LottieImageAsset asset) {
  26. BitmapFactory.Options opts = new BitmapFactory.Options();
  27. opts.inScaled = true;
  28. opts.inDensity = UtilPhoneParam.densityDpi;
  29. Bitmap bitmap = null;
  30. try {
  31. bitmap = BitmapFactory.decodeFile(absolutePath + File.separator + asset.getFileName(), opts);
  32. }catch (Exception e){
  33. e.printStackTrace();
  34. }
  35. return bitmap;
  36. }
  37. });
  38. // 设置动画
  39. LottieComposition.Factory.fromInputStream(fis, new OnCompositionLoadedListener() {
  40. @Override
  41. public void onCompositionLoaded(@Nullable LottieComposition composition) {
  42. lottieAnimationView.setComposition(composition);
  43. lottieAnimationView.playAnimation();
  44. }
  45. });

4. 加载SDCard字体

  1. lottieAnimationView.setFontAssetDelegate(new FontAssetDelegate(){
  2. public Typeface fetchFont(String fontFamily) {
  3. Typeface customFont = Typeface.createFromFile(FONT_PATH + fontFamily);
  4. return customFont;
  5. }
  6. });

常用方法

1. 监听动画进度 [0,1]

  1. lottieAnimationView.addAnimatorUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
  2. @Override
  3. public void onAnimationUpdate(ValueAnimator valueAnimator) {
  4. // 判断动画加载结束
  5. if (valueAnimator.getAnimatedFraction() == 1f) {
  6. if (dialog.isShowing() && getActivity() != null)
  7. dialog.dismiss();
  8. }
  9. }
  10. });

2. 暂停/取消/播放

  1. lottieAnimationView.pauseAnimation();
  2. lottieAnimationView.cancelAnimation();
  3. lottieAnimationView.playAnimation();

3. 循环/播放某个部分

lottieAnimationView.loop(true);
  • ValueAnimator一样使用setRepeatMode(...) 或 setRepeatCount(...)
  • scaleType :只支持centerCrop 和 centerInside
  • 播放动画的某个部分
  1. setMinFrame(...)
  2. setMaxFrame(...)
  3. setMinProgress(...)
  4. setMaxProgress(...)
  5. setMinAndMaxFrame(...)
  6. setMinAndMaxProgress(...)

4. 硬件加速,解决lottie卡顿问题

lottieAnimationView.useHardwareAcceleration(true);

5. 缓存

  1. /*
  2. * Lottie内部有两个缓存map(强引用缓存,弱引用缓存),在动画文件加载完成后会根据设置的缓存策略缓存动画,方便下次使用。
  3. */
  4. lottieAnimationView.setAnimation(animation, LottieAnimationView.CacheStrategy.Strong); //强缓存
  5. lottieAnimationView.setAnimation(animation, LottieAnimationView.CacheStrategy.Weak); //弱缓存

根据进度缓存,并为下次播放作准备

  1. lottieAnimationView.setProgress(progress); //设置当前进度
  2. lottieAnimationView.buildDrawingCache(); //强制缓存绘制数据
  3. Bitmap image = lottieAnimationView.getDrawingCache(); //获取当前绘制数据

After Effects方面注意点(for设计师)

1. 官网动画实例 www.lottiefiles.com

2. AE文件预览 https://www.lottiefiles.com/preview

3. 在为Lottie构建时,您始终必须记住,这些JSON文件需要尽可能小巧令移动产品尽可能小。 例如,尽可能使用parenting。 在类似的图层上复制相同的关键帧会增加额外的代码。 只有在必要时才使用路径关键帧动画。 由于它为每个关键帧上的每个顶点添加数据,因此占用的空间最多。 诸如Autotrace之类的技术,或者每帧都为您提供关键帧的摇摆器,可能会使您的JSON文件非常大,并可能会对性能产生负面影响。 必须与组合物的设置方式保持平衡,以使事物尽可能高效。

4. 将任何Adobe Illustrator,EPS,SVG或PDF资源转换为After Effects中的图层,否则它们将无法在您的Lottie动画中使用。

5. Lottie尚不支持效果菜单中的表达式或任何效果。

6. 使用alpha遮罩会影响性能。 如果你使用的是alpha遮罩或alpha倒置遮罩,遮罩的大小会对性能产生更大的影响。 如果必须使用遮罩,请覆盖最小的区域。

7. 混合模式(如Multiply, Screen 或 Add)尚不受支持,也不支持Luma遮罩。

8. Lottie还不支持阴影,颜色叠加或笔触等图层效果。

9. 导出比您想要支持的最宽屏幕更宽的动画,使开发者在Android上使用centerCrop类型或在iOS上使用aspectFill内容模式。

10. 将图片资源放入JSON, 将图片资源整合到动画的 JSON文件中,开发人员的工作量就可以节约很多。

  • 需要先将图片转换成矢量图 SVG 格式,这个设计师一定有办法。
  • 使用 Illustrator 将 SVG 文件另存为 .ai 文件。
  • 使用 .ai 文件在 AE 中做动画处理。
  • 最后通过 Bodymovin 插件,输出动画资源。
    官方文档: artwork-to-lottie-walkthrough

引用文献

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家小花儿/article/detail/179416
推荐阅读
相关标签
  

闽ICP备14008679号