HarmonyOS三方件开发指南(15)-LoadingView功能介绍

开发 OpenHarmony
文章由鸿蒙社区产出,想要了解更多内容请前往:51CTO和华为官方战略合作共建的鸿蒙技术社区https://harmonyos.51cto.com

[[390520]]

想了解更多内容,请访问:

51CTO和华为官方合作共建的鸿蒙技术社区

https://harmonyos.51cto.com

1. LoadingView组件功能介绍

1.1. 功能介绍:

前言:

对于一些简单的动画我们开发者可以使用系统提供的一些方法来实现,但是在实际开发中设计师给出的动画都是很炫酷复杂的,如果采用手写代码的方式,就要面对很多问题:

(1) 如不同平台要重复开发,

(2) 开发者和动画设计师之间的沟通问题,

(3) 复杂动画对应的代码也非常复杂,后期维护困难等。

Lottie功能介绍:

Lottie是Airbnb 专门为移动开发设计的一个第三方开源库,他的优点如下:

(1) 跨平台(目前支持Android、iOS 、Web、React Native等平台),本组件完成了Lottie再HarmonyOS上的移植。

(2) 设计师通过After Effects将动画导出JSON文件,然后由Lottie加载和渲染这个文件并转成相应的代码,由于是JSON文件,文件也会很小,可以减少App包的大小。

(3) 把动画制作和APP开发的工作分开,由设计师来完成动画的制作

1.2. 模拟器上运行效果:

[[390521]]

2. Lottie使用方法

2.1. 新建工程,增加组件Har包依赖

在应用模块中添加HAR,只需要将lottie.har复制到entry\libs目录下即可(由于build.gradle中已经依赖的libs目录下的*.har,因此不需要在做修改)。

2.2. 增加动画json文件

在resources/rawfile目录下,放入动画对应的json文件,如bullseye.json.

2.3. 修改主页面的布局文件

修改主页面的布局文件ability_main.xml,在Layout标签中增加app命名空间。

然后添加一个com.airbnb.lottie.LottieView组件,设置LottieView_jsonFile属性。

全部代码如下:

  1. <?xml version="1.0" encoding="utf-8"?> 
  2. <DirectionalLayout 
  3.     xmlns:ohos="http://schemas.huawei.com/res/ohos" 
  4.     xmlns:app="http://schemas.huawei.com/apk/res/ohos" 
  5.     ohos:height="match_parent" 
  6.     ohos:width="match_parent" 
  7.     ohos:orientation="vertical"
  8.  
  9.     <com.airbnb.lottie.LottieView 
  10.         ohos:id="$+id:lottieView" 
  11.         ohos:height="match_content" 
  12.         ohos:width="match_content" 
  13.         app:LottieView_jsonFile = "resources/rawfile/bullseye.json" 
  14.     /> 
  15. </DirectionalLayout> 

3. Lottie开发实现

3.1. 新建一个Module

新建一个Module,类型选择HarmonyOS Library,模块名为lottie,如图:

3.2. 主要类介绍

3.3. JSON解析流程介绍

  1. // 解析json文件,获取InputStream 
  2. ResourceManager resourceManager = getContext().getResourceManager(); 
  3. RawFileEntry rawFileEntry = resourceManager.getRawFileEntry(jsonFile); 
  4. resource = rawFileEntry.openRawFile(); 
  5.  
  6. // 解析json文件,返回lottieComposition 
  7. JsonReader reader = JsonReader.of(buffer(source(resource))); 
  8.  
  9. // 构造compositionLayer 
  10. compositionLayer = new CompositionLayer( 
  11.         null
  12.         LayerParser.parse(lottieComposition), 
  13.         lottieComposition.getLayers(), 
  14.         lottieComposition); 

其中json文件大致说明如下:

  1.  
  2. "w", // 0 宽度 
  3. "h", // 1 高度 
  4. "ip", // 2 其实帧 
  5. "op", // 3 结束帧 
  6. "fr", // 4 帧率 
  7. "v", // 5 版本号 
  8. "layers", // 6 图层列表 
  9. "assets", // 7 图片资源列表 
  10. "fonts", // 8 字体列表 
  11. "chars", // 9 字体具体样式 
  12. "markers" // 10 遮盖层列表 
  13.  

其中assets图片资源说明如下:

  1. "assets": [ 
  2.  
  3.  
  4. "id", // 0 图片id 
  5. "w", // 2 宽度 
  6. "h", // 3 高度 
  7. "p", // 4 图片名称 
  8. "u" // 5 图片路径 
  9.  
  10.  
  11.  
  12. layers说明如下: 
  13.  
  14. "layers": [ 
  15.  
  16.  
  17. "nm", // 0 名称 
  18. "ind", // 1 索引 
  19. "refId", // 2 指向的资源id 
  20. "ty", // 3 图层类型(0:复合型,1: Solid类型 2:图片类型 4:Shape类型 5:Text类型) 
  21.  
  22. parent", // 4 父图层 
  23. "sw", // 5 Solid宽度 
  24. "sh", // 6 Solid高度 
  25. "sc", // 7 Solid颜色 
  26. "ks", // 8 包含的动画 
  27. "tt", // 9 遮盖类型 
  28. "masksProperties", // 10 遮盖列表 
  29. "shapes", // 11 图层包含的形状元素 
  30. "t", // 12 文本属性 
  31. "ef", // 13 填充效果(Lottie doesn't support layer effects) 
  32. "sr", // 14 时间调整系数 
  33. "st", // 15 图层起始帧 
  34. "w", // 16 图层宽度 
  35. "h", // 17 图层高度 
  36. "ip", // 18 图层起始关键帧 
  37. "op", // 19 图层结束关键帧 
  38.  
  39.  

layers中shapes解析如下:

  1. "shapes": [ 
  2.  
  3.  
  4. "ty", //类型(如gr:图形组, fl:图形填充, sh:图形路径) 
  5.  
  6. "nm",//名称 
  7. "hd", // 是否隐藏 
  8. "it" // 图形的轨迹集合 
  9.  
  10. [{ 
  11. "ind",//索引 
  12. "ks", //动画关键帧 
  13.  
  14.  
  15. "t",  // startFrame 
  16. "s",  // startValue 
  17. "e",  // endValue 
  18. "o",  // 动画起始点坐标 
  19. "i",  // 动画结束点坐标  
  20. "h",  // 插值器类型 
  21. "to", // 7 路径切线1坐标 
  22. "ti"  // 8 路径切线2坐标 
  23.  
  24.  
  25. }] 
  26.  
  27.  

3.4. 播放流程介绍

Lottie源码播放调用栈梳理如下:

  1. LottieDrawable.draw() 
  2.  
  3. drawInternal() 
  4.  
  5. drawWithOriginalAspectRatio() 
  6.  
  7. baseLayer.draw() 
  8.  
  9. compositionLayer.drawLayer() 
  10.  
  11. baseLayer.draw() 
  12.  
  13. compositionLayer.drawLayer() 
  14.  
  15. baseLayer.draw() 
  16.  
  17. ShapeLayer.drawLayer() 
  18.  
  19. ContentGroup.draw() 
  20.  
  21. FillContent.draw() or StrokeContent.draw()   

3.5. 主流程介绍

3.6. 编译HAR包

利用Gradle可以将HarmonyOS Library库模块构建为HAR包,构建HAR包的方法如下:

在Gradle构建任务中,双击PackageDebugHar或PackageReleaseHar任务,构建Debug类型或Release类型的HAR。

待构建任务完成后,可以在工程目录中的loadingview> bulid > outputs > har目录中,获取生成的HAR包。

4.项目源码

见github代码仓:https://github.com/isoftstone-dev/Lottie_HarmonyOS

更多原创,请关注"软通动力HarmonyOS学院https://harmonyos.51cto.com/column/30

想了解更多内容,请访问:

51CTO和华为官方合作共建的鸿蒙技术社区

https://harmonyos.51cto.com

 

责任编辑:jianghua 来源: 鸿蒙社区
相关推荐

2021-01-12 12:04:40

鸿蒙HarmonyOS应用开发

2021-03-19 17:42:01

鸿蒙HarmonyOS应用开发

2021-03-01 09:48:24

鸿蒙HarmonyOS应用开发

2021-02-24 15:22:47

鸿蒙HarmonyOS应用开发

2021-01-13 09:40:31

鸿蒙HarmonyOS开发

2021-04-16 09:28:18

鸿蒙HarmonyOS应用

2021-02-04 13:06:38

鸿蒙HarmonyOS应用开发

2021-06-28 14:48:03

鸿蒙HarmonyOS应用

2021-01-18 09:52:20

鸿蒙HarmonyOS开发

2021-02-04 09:45:19

鸿蒙HarmonyOS应用开发

2021-02-26 14:15:27

鸿蒙HarmonyOS应用开发

2021-01-21 13:21:18

鸿蒙HarmonyOSPhotoview组件

2021-01-20 09:54:56

鸿蒙HarmonyOS开发

2021-05-12 15:17:39

鸿蒙HarmonyOS应用

2021-03-01 14:01:41

鸿蒙HarmonyOS应用开发

2021-04-12 09:36:54

鸿蒙HarmonyOS应用

2021-01-22 17:33:03

鸿蒙HarmonyOS应用开发

2021-04-20 09:42:20

鸿蒙HarmonyOS应用开发

2023-02-07 15:43:13

三方库适配鸿蒙

2024-07-30 09:35:00

点赞
收藏

51CTO技术栈公众号