• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1# @ohos.animator (动画)
2
3本模块提供组件动画效果,包括定义动画、启动动画和以相反的顺序播放动画等。
4
5> **说明:**
6>
7> 本模块首批接口从API version 6开始支持。后续版本的新增接口,采用上角标单独标记接口的起始版本。
8
9
10## 导入模块
11
12```js
13import animator from '@ohos.animator';
14```
15## create<sup>9+</sup>
16
17create(options: AnimatorOptions): AnimatorResult
18
19定义Animator类。
20
21**系统能力:**  SystemCapability.ArkUI.ArkUI.Full
22
23**参数:**
24
25| 参数名     | 类型                                  | 必填   | 说明      |
26| ------- | ----------------------------------- | ---- | ------- |
27| options | [AnimatorOptions](#animatoroptions) | 是    | 定义动画选项。 |
28
29**返回值:**
30
31| 类型                                | 说明            |
32| --------------------------------- | ------------- |
33| [AnimatorResult](#animatorresult) | Animator结果接口。 |
34
35**示例:**
36
37  ```js
38  let options = {
39    duration: 1500,
40    easing: "friction",
41    delay: 0,
42    fill: "forwards",
43    direction: "normal",
44    iterations: 3,
45    begin: 200.0,
46    end: 400.0
47  };
48  animator.create(options);
49  ```
50
51## AnimatorResult
52
53定义Animator结果接口。
54
55### reset<sup>9+</sup>
56
57reset(options: AnimatorOptions): void
58
59更新当前动画器。
60
61**系统能力:**  SystemCapability.ArkUI.ArkUI.Full
62
63**参数:**
64
65| 参数名     | 类型                                  | 必填   | 说明      |
66| ------- | ----------------------------------- | ---- | ------- |
67| options | [AnimatorOptions](#animatoroptions) | 是    | 定义动画选项。 |
68
69**错误码:**
70
71以下错误码的详细介绍请参见[ohos.animator(动画)](../errorcodes/errorcode-animator.md)错误码。
72
73| 错误码ID   | 错误信息 |
74| --------- | ------- |
75| 100001    | if no page is found for pageId or fail to get object property list. |
76
77
78**示例:**
79
80```js
81let options = {
82  duration: 1500,
83  easing: "friction",
84  delay: 0,
85  fill: "forwards",
86  direction: "normal",
87  iterations: 3,
88  begin: 200.0,
89  end: 400.0
90};
91try {
92  animator.reset(options);
93} catch(error) {
94  console.error(`Animator reset failed, error code: ${error.code}, message: ${error.message}.`);
95}
96```
97
98### play
99
100play(): void
101
102启动动画。动画会保留上一次的播放状态,比如播放状态设置reverse后,再次播放会保留reverse的播放状态。
103
104**系统能力:**  SystemCapability.ArkUI.ArkUI.Full
105
106**示例:**
107
108```js
109animator.play();
110```
111
112### finish
113
114finish(): void
115
116结束动画。
117
118**系统能力:**  SystemCapability.ArkUI.ArkUI.Full
119
120**示例:**
121
122```js
123animator.finish();
124```
125
126### pause
127
128pause(): void
129
130暂停动画。
131
132**系统能力:**  SystemCapability.ArkUI.ArkUI.Full
133
134**示例:**
135
136```js
137animator.pause();
138```
139
140### cancel
141
142cancel(): void
143
144删除动画。
145
146**系统能力:**  SystemCapability.ArkUI.ArkUI.Full
147
148**示例:**
149
150```js
151animator.cancel();
152```
153
154### reverse
155
156reverse(): void
157
158以相反的顺序播放动画。
159
160**系统能力:**  SystemCapability.ArkUI.ArkUI.Full
161
162**示例:**
163
164```js
165animator.reverse();
166```
167
168### onframe
169
170onframe: (progress: number) => void
171
172接收到帧时回调。
173
174**系统能力:**  SystemCapability.ArkUI.ArkUI.Full
175
176**参数:**
177
178| 参数名      | 类型     | 必填   | 说明       |
179| -------- | ------ | ---- | -------- |
180| progress | number | 是    | 动画的当前进度。 |
181
182**示例:**
183
184```js
185let animatorResult = animator.create(options)
186animatorResult.onframe = function(value) {
187  console.info("onframe callback")
188}
189```
190
191### onfinish
192
193onfinish: () => void
194
195动画完成时回调。
196
197**系统能力:**  SystemCapability.ArkUI.ArkUI.Full
198
199**示例:**
200
201```js
202let animatorResult = animator.create(options)
203animatorResult.onfinish = function() {
204  console.info("onfinish callback")
205}
206```
207
208### oncancel
209
210oncancel: () => void
211
212动画被取消时回调。
213
214**系统能力:**  SystemCapability.ArkUI.ArkUI.Full
215
216**示例:**
217
218```js
219let animatorResult = animator.create(options)
220animatorResult.oncancel = function() {
221  console.info("oncancel callback")
222}
223```
224
225### onrepeat
226
227onrepeat: () => void
228
229动画重复时回调。
230
231**系统能力:**  SystemCapability.ArkUI.ArkUI.Full
232
233**示例:**
234
235```js
236let animatorResult = animator.create(options)
237animatorResult.onrepeat = function() {
238  console.info("onrepeat callback")
239}
240```
241
242
243
244## AnimatorOptions
245
246定义动画选项。
247
248**系统能力:** SystemCapability.ArkUI.ArkUI.Full
249
250| 名称       | 类型                                                        | 必填 | 说明                                                         |
251| ---------- | ----------------------------------------------------------- | ---- | ------------------------------------------------------------ |
252| duration   | number                                                      | 是   | 动画播放的时长,单位毫秒。                                   |
253| easing     | string                                                      | 是   | 动画插值曲线,仅支持以下可选值:<br/>"linear":动画线性变化。<br/>"ease":动画开始和结束时的速度较慢,cubic-bezier(0.25、0.1、0.25、1.0)。<br/>"ease-in":动画播放速度先慢后快,cubic-bezier(0.42, 0.0, 1.0, 1.0)。<br/>"ease-out":动画播放速度先快后慢,cubic-bezier(0.0, 0.0, 0.58, 1.0)。<br/>"ease-in-out":动画播放速度先加速后减速,cubic-bezier(0.42, 0.0, 0.58, 1.0)。<br/>"fast-out-slow-in":标准曲线,cubic-bezier(0.4,0.0,0.2,1.0)。<br/>"linear-out-slow-in":减速曲线,cubic-bezier(0.0,0.0,0.2,1.0)。<br/>"friction":阻尼曲线,cubic-bezier(0.2, 0.0, 0.2, 1.0)。<br/>"extreme-deceleration":急缓曲线,cubic-bezier(0.0, 0.0, 0.0, 1.0)。<br/>"rhythm":节奏曲线,cubic-bezier(0.7, 0.0, 0.2, 1.0)。<br/>"sharp":锐利曲线,cubic-bezier(0.33, 0.0, 0.67, 1.0)。<br/>"smooth":平滑曲线,cubic-bezier(0.4, 0.0, 0.4, 1.0)。<br/>cubic-bezier(x1, y1, x2, y2):在三次贝塞尔函数中定义动画变化过程,入参的值必须处于0-1之间。<br/>steps(number, step-position):阶梯曲线。number必须设置,支持的类型为int。step-position参数可选,支持设置start或end,默认值为end。 |
254| delay      | number                                                      | 是   | 动画延时播放时长,单位毫秒,设置为0时,表示不延时。          |
255| fill       | "none" \| "forwards" \| "backwards" \| "both"               | 是   | 动画执行后是否恢复到初始状态,动画执行后,动画结束时的状态(在最后一个关键帧中定义)将保留。<br/>"none":在动画执行之前和之后都不会应用任何样式到目标上。<br/>"forwards":在动画结束后,目标将保留动画结束时的状态(在最后一个关键帧中定义)。<br/>"backwards":动画将在animation-delay期间应用第一个关键帧中定义的值。当animation-direction为"normal"或"alternate"时应用from关键帧中的值,当animation-direction为"reverse"或"alternate-reverse"时应用to关键帧中的值。<br/>"both":动画将遵循forwards和backwards的规则,从而在两个方向上扩展动画属性。 |
256| direction  | "normal" \| "reverse" \| "alternate" \| "alternate-reverse" | 是   | 动画播放模式。<br/>"normal": 动画正向循环播放。<br/>"reverse": 动画反向循环播放。<br/>"alternate":动画交替循环播放,奇数次正向播放,偶数次反向播放。<br/>"alternate-reverse":动画反向交替循环播放,奇数次反向播放,偶数次正向播放。 |
257| iterations | number                                                      | 是   | 动画播放次数。设置为0时不播放,设置为-1时无限次播放。<br/>**说明:** 设置为除-1外其他负数视为无效取值,无效取值动画默认播放1次。 |
258| begin      | number                                                      | 是   | 动画插值起点。                                               |
259| end        | number                                                      | 是   | 动画插值终点。                                               |
260
261
262## 完整示例
263### 基于JS扩展的类Web开发范式
264
265```html
266<!-- hml -->
267<div class="container">
268  <div class="Animation" style="height: {{divHeight}}px; width: {{divWidth}}px; background-color: red;" onclick="Show">
269  </div>
270</div>
271```
272
273```js
274export default {
275  data: {
276    divWidth: 200,
277    divHeight: 200,
278    animator: null
279  },
280  onInit() {
281    let options = {
282      duration: 1500,
283      easing: "friction",
284      delay: 0,
285      fill: "forwards",
286      direction: "normal",
287      iterations: 2,
288      begin: 200.0,
289      end: 400.0
290    };
291    this.animator = animator.create(options);
292  },
293  Show() {
294    let options1 = {
295      duration: 1500,
296      easing: "friction",
297      delay: 0,
298      fill: "forwards",
299      direction: "normal",
300      iterations: 2,
301      begin: 0,
302      end: 400.0
303    };
304    try {
305      this.animator.reset(options1);
306    } catch(error) {
307      console.error(`Animator reset failed, error code: ${error.code}, message: ${error.message}.`);
308    }
309    let _this = this;
310    this.animator.onframe = function(value) {
311      _this.divWidth = value;
312      _this.divHeight = value;
313    };
314    this.animator.play();
315  }
316}
317```
318
319  ![zh-cn_image_00007](figures/zh-cn_image_00007.gif)
320
321### 基于TS扩展的声明式开发范式
322
323```ts
324import animator from '@ohos.animator';
325
326@Entry
327@Component
328struct AnimatorTest {
329  private TAG: string = '[AnimatorTest]'
330  private backAnimator: any = undefined
331  private flag: boolean = false
332  @State wid: number = 100
333  @State hei: number = 100
334
335  create() {
336    let _this = this
337    this.backAnimator = animator.create({
338      duration: 2000,
339      easing: "ease",
340      delay: 0,
341      fill: "none",
342      direction: "normal",
343      iterations: 1,
344      begin: 100,
345      end: 200
346    })
347    this.backAnimator.onfinish = function () {
348      _this.flag = true
349      console.info(_this.TAG, 'backAnimator onfinish')
350    }
351    this.backAnimator.onrepeat = function () {
352      console.info(_this.TAG, 'backAnimator repeat')
353    }
354    this.backAnimator.oncancel = function () {
355      console.info(_this.TAG, 'backAnimator cancel')
356    }
357    this.backAnimator.onframe = function (value) {
358      _this.wid = value
359      _this.hei = value
360    }
361  }
362
363  build() {
364    Column() {
365      Column() {
366        Column()
367          .width(this.wid)
368          .height(this.hei)
369          .backgroundColor(Color.Red)
370      }
371      .width('100%')
372      .height(300)
373
374      Column() {
375        Row() {
376          Button('create')
377            .fontSize(30)
378            .fontColor(Color.Black)
379            .onClick(() => {
380              this.create()
381            })
382        }
383        .padding(10)
384
385        Row() {
386          Button('play')
387            .fontSize(30)
388            .fontColor(Color.Black)
389            .onClick(() => {
390              this.flag = false
391              this.backAnimator.play()
392            })
393        }
394        .padding(10)
395
396        Row() {
397          Button('pause')
398            .fontSize(30)
399            .fontColor(Color.Black)
400            .onClick(() => {
401              this.backAnimator.pause()
402            })
403        }
404        .padding(10)
405
406        Row() {
407          Button('finish')
408            .fontSize(30)
409            .fontColor(Color.Black)
410            .onClick(() => {
411              this.flag = true
412              this.backAnimator.finish()
413            })
414        }
415        .padding(10)
416
417        Row() {
418          Button('reverse')
419            .fontSize(30)
420            .fontColor(Color.Black)
421            .onClick(() => {
422              this.flag = false
423              this.backAnimator.reverse()
424            })
425        }
426        .padding(10)
427
428        Row() {
429          Button('cancel')
430            .fontSize(30)
431            .fontColor(Color.Black)
432            .onClick(() => {
433              this.backAnimator.cancel()
434            })
435        }
436        .padding(10)
437
438        Row() {
439          Button('reset')
440            .fontSize(30)
441            .fontColor(Color.Black)
442            .onClick(() => {
443              if (this.flag) {
444                this.flag = false
445                this.backAnimator.reset({
446                  duration: 5000,
447                  easing: "ease-in",
448                  delay: 0,
449                  fill: "none",
450                  direction: "normal",
451                  iterations: 4,
452                  begin: 100,
453                  end: 300
454                })
455              } else {
456                console.info(this.TAG, 'Animation not ended')
457              }
458            })
459        }
460        .padding(10)
461      }
462    }
463  }
464}
465```
466
467## update<sup>(deprecated)</sup>
468
469update(options: AnimatorOptions): void
470
471更新当前动画器。
472
473从API version9开始不再维护,建议使用[reset<sup>9+</sup>](#reset9)
474
475**系统能力:**  SystemCapability.ArkUI.ArkUI.Full
476
477**参数:**
478
479| 参数名     | 类型                                  | 必填   | 说明      |
480| ------- | ----------------------------------- | ---- | ------- |
481| options | [AnimatorOptions](#animatoroptions) | 是    | 定义动画选项。 |
482
483**示例:**
484
485```js
486animator.update(options);
487```
488
489## createAnimator<sup>(deprecated)</sup>
490
491createAnimator(options: AnimatorOptions): AnimatorResult
492
493定义Animator类。
494
495从API version9开始不再维护,建议使用[create<sup>9+</sup>](#create9)
496
497**系统能力:**  SystemCapability.ArkUI.ArkUI.Full
498
499**参数:**
500
501| 参数名     | 类型                                  | 必填   | 说明      |
502| ------- | ----------------------------------- | ---- | ------- |
503| options | [AnimatorOptions](#animatoroptions) | 是    | 定义动画选项。 |
504
505**返回值:**
506
507| 类型                                | 说明            |
508| --------------------------------- | ------------- |
509| [AnimatorResult](#animatorresult) | Animator结果接口。 |
510
511**示例:**
512
513```js
514let options = {
515  duration: 1500,
516  easing: "friction",
517  delay: 0,
518  fill: "forwards",
519  direction: "normal",
520  iterations: 3,
521  begin: 200.0,
522  end: 400.0
523};
524this.animator = animator.createAnimator(options);
525```