• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1# Lottie
2
3提供Lottie动画。
4
5> **说明:**
6>
7> 从 API Version 8 开始支持。后续版本如有新增内容,则采用上角标单独标记该内容的起始版本。
8
9
10
11## 导入模块
12
13```
14import lottie from '@ohos/lottieETS'
15```
16
17> **说明:**
18>
19> 在Terminal窗口使用 `npm install @ohos/lottieETS` 命令下载Lottie,下载之前需要配置权限。
20>
21> 安装ohos npm 三方包时,需要先执行`npm config set @ohos:registry=https://repo.harmonyos.com/npm/`设置仓库地址。
22
23
24## lottie.loadAnimation
25
26loadAnimation(
27
28path: string, container: object, render: string, loop: boolean, autoplay: boolean, name: string ): AnimationItem
29
30加载动画,须提前声明Animator('__lottie_ets')对象,并在Canvas完成布局后调用。可配合Canvas组件生命周期接口onReady()使用。
31
32**参数:**
33
34| 参数             | 类型                          | 必填   | 描述                                       |
35| -------------- | --------------------------- | ---- | ---------------------------------------- |
36| path           | string                      | 是    | hap包内动画资源文件路径,仅支持json格式。示例:path: "common/lottie/data.json" |
37| container      | object                      | 是    | canvas绘图上下文,声明范式需提前声明CanvasRenderingContext2D。 |
38| render         | string                      | 是    | 渲染类型,仅支持“canvas”。                        |
39| loop           | boolean \| number | 否    | 动画播放结束后,是否循环播放,默认值true。值类型为number,且大于等于1时为设置的重复播放的次数。 |
40| autoplay       | boolean                     | 否    | 是否自动播放动画,默认值true。                        |
41| name           | string                      | 否    | 开发者自定义的动画名称,后续支持通过该名称引用控制动画,默认为空。        |
42| initialSegment | [number, number]       | 否    | 指定动画播放的起始帧号,指定动画播放的结束帧号。                 |
43
44
45## lottie.destroy
46
47destroy(name: string): void
48
49销毁动画,页面退出时,必须调用。可配合Canvas组件生命周期接口使用,比如onDisappear()与onPageHide()。
50
51**参数:**
52
53| 参数   | 类型     | 必填   | 描述                                       |
54| ---- | ------ | ---- | ---------------------------------------- |
55| name | string | 是    | 被指定的动画名,同loadAnimation接口参数name, 缺省时销毁所有动画。 |
56
57**示例:**
58  ```ts
59  // xxx.ets
60  import lottie from '@ohos/lottieETS'
61
62  @Entry
63  @Component
64  struct Index {
65    private controller: CanvasRenderingContext2D = new CanvasRenderingContext2D()
66    private animateName: string = "animate"
67    private animatePath: string = "common/lottie/data.json"
68    private animateItem: any = null
69
70    onPageHide(): void {
71      console.log('onPageHide')
72      lottie.destroy()
73    }
74
75    build() {
76      Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Center }) {
77        Canvas(this.controller)
78        .width('30%')
79        .height('20%')
80        .backgroundColor('#0D9FFB')
81        .onReady(() => {
82          console.log('canvas onAppear');
83          this.animateItem = lottie.loadAnimation({
84            container: this.controller,
85            renderer: 'canvas',
86            loop: true,
87            autoplay: true,
88            name: this.animateName,
89            path: this.animatePath,
90          })
91        })
92
93        Animator('__lottie_ets') // declare Animator('__lottie_ets') when use lottie
94        Button('load animation')
95          .onClick(() => {
96          if (this.animateItem != null) {
97            this.animateItem.destroy()
98            this.animateItem = null
99          }
100          this.animateItem = lottie.loadAnimation({
101            container: this.controller,
102            renderer: 'canvas',
103            loop: true,
104            autoplay: true,
105            name: this.animateName,
106            path: this.animatePath,
107            initialSegment: [10, 50],
108          })
109        })
110
111        Button('destroy animation')
112          .onClick(() => {
113            lottie.destroy(this.animateName)
114            this.animateItem = null
115          })
116      }
117      .width('100%')
118      .height('100%')
119    }
120  }
121  ```
122
123  ![zh-cn_image_0000001194352468](figures/zh-cn_image_0000001194352468.gif)
124
125
126## lottie.play
127
128play(name: string): void
129
130播放指定动画。
131
132**参数:**
133
134| 参数   | 类型     | 必填   | 描述                                       |
135| ---- | ------ | ---- | ---------------------------------------- |
136| name | string | 是    | 被指定的动画名, 同loadAnimation接口参数name,缺省时播放所有动画。 |
137
138**示例:**
139
140  ```ts
141  lottie.play(this.animateName)
142  ```
143
144
145## lottie.pause
146
147pause(name: string): void
148
149暂停指定动画,下次调用lottie.play()从当前帧开始。
150
151**参数:**
152
153| 参数   | 类型     | 必填   | 描述                                       |
154| ---- | ------ | ---- | ---------------------------------------- |
155| name | string | 是    | 被指定的动画名,同loadAnimation接口入参name,缺省时暂停所有动画。 |
156
157**示例:**
158
159  ```ts
160  lottie.pause(this.animateName)
161  ```
162
163
164## lottie.togglePause
165
166togglePause(name: string): void
167
168暂停或播放指定动画,等效于lottie.play()与lottie.pause()切换调用。
169
170**参数:**
171
172| 参数   | 类型     | 必填   | 描述                                       |
173| ---- | ------ | ---- | ---------------------------------------- |
174| name | string | 是    | 被指定的动画名,同loadAnimation接口参数name,缺省时停止所有动画。 |
175
176**示例:**
177
178  ```ts
179  lottie.togglePause(this.animateName)
180  ```
181
182
183## lottie.stop
184
185stop(name: string): void
186
187停止指定动画,下次调用lottie.play()从第一帧开始。
188
189**参数:**
190
191| 参数   | 类型     | 必填   | 描述                                       |
192| ---- | ------ | ---- | ---------------------------------------- |
193| name | string | 是    | 被指定的动画名,同loadAnimation接口参数name,缺省时停止所有动画。 |
194
195**示例:**
196
197  ```ts
198  lottie.stop(this.animateName)
199  ```
200
201
202## lottie.setSpeed
203
204setSpeed(speed: number, name: string): void
205
206设置指定动画播放速度。
207
208**参数:**
209
210| 参数    | 类型     | 必填   | 描述                                       |
211| ----- | ------ | ---- | ---------------------------------------- |
212| speed | number | 是    | 值为浮点类型, speed>0正向播放, speed<0反向播放, speed=0暂停播放, speed=1.0/-1.0正常速度播放。 |
213| name  | string | 是    | 被指定的动画,同loadAnimation接口参数name,缺省时停止所有动画。 |
214
215**示例:**
216
217  ```ts
218  lottie.setSpeed(5, this.animateName)
219  ```
220
221
222## lottie.setDirection
223
224setDirection(direction: AnimationDirection, name: string): void
225
226设置指定动画播放顺序。
227
228**参数:**
229
230| 参数        | 类型                 | 必填   | 描述                                       |
231| --------- | ------------------ | ---- | ---------------------------------------- |
232| direction | AnimationDirection | 是    | 1为正向,-1为反向;&nbsp;当设置为反向时,从当前播放进度开始回播直到首帧,loop值为true时可无限倒放;speed&lt;0叠加时也是倒放。<br/>AnimationDirection:1&nbsp;\|&nbsp;-1 |
233| name      | string             | 是    | 被指定的动画名,同loadAnimation接口参数name,缺省时设置所有动画方向。 |
234
235**示例:**
236
237  ```ts
238  lottie.setDirection(-1, this.animateName)
239  ```
240
241
242## AnimationItem
243
244loadAnimation接口的返回对象,具有属性与接口。属性描述如下:
245
246| 参数名称              | 参数类型                                     | 参数描述                                     |
247| ----------------- | ---------------------------------------- | ---------------------------------------- |
248| name              | string                                   | 动画名称。                                    |
249| isLoaded          | boolean                                  | 动画是否已加载。                                 |
250| currentFrame      | number                                   | 当前播放的帧号,&nbsp;默认精度为&gt;=0.0的浮点数,&nbsp;调用setSubframe(false)后精度为去小数点后的正整数。 |
251| currentRawFrame   | number                                   | 当前播放帧数,&nbsp;精度为&gt;=0.0的浮点数。            |
252| firstFrame        | number                                   | 当前播放片段的第一帧帧号。                            |
253| totalFrames       | number                                   | 当前播放片段的总帧数。                              |
254| frameRate         | number                                   | 帧率&nbsp;(frame/s)。                       |
255| frameMult         | number                                   | 帧率&nbsp;(frame/ms)。                      |
256| playSpeed         | number                                   | 值为浮点类型,&nbsp;speed&gt;0正向播放,&nbsp;speed&lt;0反向播放,&nbsp;speed=0暂停播放,&nbsp;speed=1.0&nbsp;\|&nbsp;-1.0正常速度播放。 |
257| playDirection     | number                                   | 播放方向,&nbsp;1为正放,&nbsp;-1为倒放。             |
258| playCount         | number                                   | 动画完成播放的次数。                               |
259| isPaused          | boolean                                  | 当前动画是否已暂停,&nbsp;值为true动画已暂停。             |
260| autoplay          | boolean                                  | 加载动画后是否自动播放,&nbsp;若值为false需要再调用play()接口开始播放。 |
261| loop              | boolean&nbsp;\|&nbsp;number              | 类型为boolean时是否循环播放,&nbsp;类型为number时播放次数。  |
262| renderer          | any                                      | 动画渲染对象,&nbsp;根据渲染类型而定。                   |
263| animationID       | string                                   | 动画ID。                                    |
264| timeCompleted     | number                                   | 当前动画片段完成单次播放的帧数,&nbsp;受AnimationSegment设置影响,&nbsp;与totalFrames属性值相同。 |
265| segmentPos        | number                                   | 当前动画片段序号,&nbsp;值为&gt;=0的正整数。             |
266| isSubframeEnabled | boolean                                  | 关联了currentFrame的精度是否为浮点数。                |
267| segments          | AnimationSegment&nbsp;\|&nbsp;AnimationSegment[] | 当前动画的播放片段。                               |
268
269
270## AnimationItem.play
271
272play(name?: string): void
273
274播放动画。
275
276**参数:**
277
278| 参数   | 类型     | 必填   | 描述              |
279| ---- | ------ | ---- | --------------- |
280| name | string | 否    | 被指定的动画名,缺省默认为空。 |
281
282**示例:**
283
284  ```ts
285  this.animateItem.play()
286  ```
287
288
289## AnimationItem.destroy
290
291destroy(name?: string): void
292
293销毁动画。
294
295**参数:**
296
297| 参数   | 类型     | 必填   | 描述              |
298| ---- | ------ | ---- | --------------- |
299| name | string | 否    | 被指定的动画名,缺省默认为空。 |
300
301**示例:**
302
303  ```ts
304  this.animateItem.destroy()
305  ```
306
307
308## AnimationItem.pause
309
310pause(name?: string): void
311
312暂停动画,下次调用play接口从当前帧开始播放。
313
314**参数:**
315
316| 参数   | 类型     | 必填   | 描述              |
317| ---- | ------ | ---- | --------------- |
318| name | string | 否    | 被指定的动画名,缺省默认为空。 |
319
320**示例:**
321
322  ```ts
323  this.animateItem.pause()
324  ```
325
326
327## AnimationItem.togglePause
328
329togglePause(name?: string): void
330
331暂停或播放动画,等效于play接口与pause接口之间轮换调用。
332
333**参数:**
334
335| 参数   | 类型     | 必填   | 描述              |
336| ---- | ------ | ---- | --------------- |
337| name | string | 否    | 被指定的动画名,缺省默认为空。 |
338
339**示例:**
340
341  ```ts
342  this.animateItem.togglePause()
343  ```
344
345
346## AnimationItem.stop
347
348stop(name?: string): void
349
350停止动画,下次调用play接口从第一帧开始播放。
351
352**参数:**
353
354| 参数   | 类型     | 必填   | 描述              |
355| ---- | ------ | ---- | --------------- |
356| name | string | 否    | 被指定的动画名,缺省默认为空。 |
357
358**示例:**
359
360  ```ts
361  this.animateItem.stop()
362  ```
363
364
365## AnimationItem.setSpeed
366
367setSpeed(speed: number): void
368
369设置动画播放速度。
370
371**参数:**
372
373| 参数    | 类型     | 必填   | 描述                                       |
374| ----- | ------ | ---- | ---------------------------------------- |
375| speed | number | 是    | 值为浮点类型,&nbsp;speed&gt;0正向播放,&nbsp;speed&lt;0反向播放,&nbsp;speed=0暂停播放,&nbsp;speed=1.0&nbsp;\|&nbsp;-1.0正常速度播放。 |
376
377**示例:**
378
379  ```ts
380  this.animateItem.setSpeed(5);
381  ```
382
383
384## AnimationItem.setDirection
385
386setDirection(direction: AnimationDirection): void
387
388设置动画播放顺序。
389
390**参数:**
391
392| 参数        | 类型                 | 必填   | 描述                                       |
393| --------- | ------------------ | ---- | ---------------------------------------- |
394| direction | AnimationDirection | 是    | 1为正向,-1为反向;&nbsp;当设置为反向时,从当前播放进度开始回播直到首帧,loop值为true时可无限倒放;speed&lt;0叠加时也是倒放。<br/>AnimationDirection:1&nbsp;\|&nbsp;-1。 |
395
396**示例:**
397
398  ```ts
399  this.animateItem.setDirection(-1)
400  ```
401
402
403## AnimationItem.goToAndStop
404
405goToAndStop(value: number, isFrame?: boolean): void
406
407设置动画停止在指定帧或时间进度。
408
409**参数:**
410
411| 参数      | 类型      | 必填   | 描述                                       |
412| ------- | ------- | ---- | ---------------------------------------- |
413| value   | number  | 是    | 帧号(值大于等于0)或时间进度(ms)。                     |
414| isFrame | boolean | 否    | true:&nbsp;按指定帧控制,false:按指定时间控制,缺省默认false。 |
415| name    | string  | 否    | 被指定的动画名,缺省默认为空。                          |
416
417**示例:**
418
419  ```ts
420  // 按帧号控制
421  this.animateItem.goToAndStop(25, true)
422  // 按时间进度控制
423  this.animateItem.goToAndStop(300, false, this.animateName)
424  ```
425
426
427## AnimationItem.goToAndPlay
428
429goToAndPlay(value: number, isFrame: boolean, name?: string): void
430
431设置动画从指定帧或时间进度开始播放。
432
433**参数:**
434
435| 参数      | 类型      | 必填   | 描述                                       |
436| ------- | ------- | ---- | ---------------------------------------- |
437| value   | number  | 是    | 帧号(值大于等于0)或时间进度(ms)                      |
438| isFrame | boolean | 是    | true:按指定帧控制,&nbsp;false:按指定时间控制,缺省默认false。 |
439| name    | string  | 否    | 被指定的动画名,缺省默认为空。                          |
440
441**示例:**
442
443  ```ts
444  // 按帧号控制
445  this.animateItem.goToAndPlay(25, true)
446  // 按时间进度控制
447  this.animateItem.goToAndPlay(300, false, this.animateName)
448  ```
449
450
451## AnimationItem.playSegments
452
453playSegments(segments: AnimationSegment | AnimationSegment[], forceFlag: boolean): void
454
455设置动画仅播放指定片段。
456
457**参数:**
458
459| 参数        | 类型                                       | 必填   | 描述                                       |
460| --------- | ---------------------------------------- | ---- | ---------------------------------------- |
461| segments  | AnimationSegment&nbsp;=&nbsp;[number,&nbsp;number]&nbsp;\|&nbsp;AnimationSegment[] | 是    | 片段或片段列表;<br/>如果片段列表全部播放完毕后,下轮循环播放仅播放最后一个片段 |
462| forceFlag | boolean                                  | 是    | true:即时生效播放,false:延迟到下轮循环播放再生效           |
463
464**示例:**
465
466  ```ts
467  // 指定播放片段
468  this.animateItem.playSegments([10, 20], false)
469  // 指定播放片段列表
470  this.animateItem.playSegments([[0, 5], [20, 30]], true)
471  ```
472
473
474## AnimationItem.resetSegments
475
476resetSegments(forceFlag: boolean): void
477
478重置动画播放片段,播放全帧。
479
480**参数:**
481
482| 参数        | 类型      | 必填   | 描述                             |
483| --------- | ------- | ---- | ------------------------------ |
484| forceFlag | boolean | 是    | true:即时生效播放,false:延迟到下轮循环播放再生效 |
485
486**示例:**
487
488  ```ts
489  this.animateItem.resetSegments(true)
490  ```
491
492
493## AnimationItem.resize
494
495resize(): void
496
497刷新动画布局。
498
499**示例:**
500
501  ```ts
502  this.animateItem.resize()
503  ```
504
505
506## AnimationItem.setSubframe
507
508setSubframe(useSubFrame: boolean): void
509
510设置属性currentFrame的精度显示浮点数。
511
512**参数:**
513
514| 参数           | 类型      | 必填   | 描述                                       |
515| ------------ | ------- | ---- | ---------------------------------------- |
516| useSubFrames | boolean | 是    | currentFrame属性默认显示浮点数,该接口参数将影响currentFrame属性的精度。<br/>true:属性currentFrame显示浮点。<br/>false:属性currentFrame去浮点数显示整数。 |
517
518**示例:**
519
520  ```ts
521  this.animateItem.setSubframe(false)
522  ```
523
524
525## AnimationItem.getDuration
526
527getDuration(inFrames?: boolean): void
528
529获取动画单次完整播放的时间(与播放速度无关)或帧数, 与Lottie.loadAnimation接口入参initialSegment有关。
530
531**参数:**
532
533| 参数       | 类型      | 必填   | 描述                                       |
534| -------- | ------- | ---- | ---------------------------------------- |
535| inFrames | boolean | 否    | true:获取帧数,&nbsp;false:获取时间(单位ms),缺省默认false。 |
536
537**示例:**
538
539  ```ts
540  this.animateItem.getDuration(true)
541  ```
542
543
544## AnimationItem.addEventListener
545
546addEventListener&lt;T = any&gt;(name: AnimationEventName, callback: AnimationEventCallback&lt;T&gt;): () =&gt; void
547
548添加侦听事件, 事件完成后会触发指定回调函数。返回可删除该侦听事件的函数对象。
549
550**参数:**
551
552| 参数       | 类型                              | 必填   | 描述                                       |
553| -------- | ------------------------------- | ---- | ---------------------------------------- |
554| name     | AnimationEventName              | 是    | 指定动画事件类型,Lottie内置动画事件类型AnimationEventName:<br/>'enterFrame'、'loopComplete'、'complete'、'segmentStart'、'destroy'、'config_ready'、'data_ready'、'DOMLoaded'、'error'、'data_failed'、'loaded_images' |
555| callback | AnimationEventCallback&lt;T&gt; | 是    | 用户自定义回调函数                                |
556
557**示例:**
558
559  ```ts
560  private callbackItem: any = function() {
561      console.log("grunt loopComplete")
562  }
563  let delFunction = this.animateItem.addEventListener('loopComplete', this.animateName)
564
565  // 删除侦听
566  delFunction()
567  ```
568
569
570## AnimationItem.removeEventListener
571
572removeEventListener&lt;T = any&gt;(name: AnimationEventName, callback?: AnimationEventCallback&lt;T&gt;): void
573
574删除侦听事件。
575
576**参数:**
577
578| 参数       | 类型                              | 必填   | 描述                                       |
579| -------- | ------------------------------- | ---- | ---------------------------------------- |
580| name     | AnimationEventName              | 是    | 指定动画事件类型,Lottie内置动画事件类型AnimationEventName:<br/>'enterFrame'、'loopComplete'、'complete'、'segmentStart'、'destroy'、'config_ready'、'data_ready'、'DOMLoaded'、'error'、'data_failed'、'loaded_images' |
581| callback | AnimationEventCallback&lt;T&gt; | 否    | 用户自定义回调函数;缺省为空时,删除此事件的所有回调函数。            |
582
583**示例:**
584
585  ```ts
586  this.animateItem.removeEventListener('loopComplete', this.animateName)
587  ```
588
589
590## AnimationItem.triggerEvent
591
592triggerEvent&lt;T = any&gt;(name: AnimationEventName, args: T): void
593
594直接触发指定事件的所有已设置的回调函数。
595
596**参数:**
597
598| 参数   | 类型                 | 必填   | 描述        |
599| ---- | ------------------ | ---- | --------- |
600| name | AnimationEventName | 是    | 指定动画事件类型  |
601| args | any                | 是    | 用户自定义回调参数 |
602
603**示例:**
604
605  ```ts
606  private triggerCallBack: any = function(item) {
607      console.log("trigger loopComplete, name:" + item.name)
608  }
609
610  this.animateItem.addEventListener('loopComplete', this.triggerCallBack)
611  this.animateItem.triggerEvent('loopComplete', this.animateItem)
612  this.animateItem.removeEventListener('loopComplete', this.triggerCallBack)
613  ```
614