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```