1# ImageAnimator 2 3提供帧动画组件来实现逐帧播放图片的能力,可以配置需要播放的图片列表,每张图片可以配置时长。 4 5> **说明:** 6> 7> 该组件从API Version 7开始支持。后续版本如有新增内容,则采用上角标单独标记该内容的起始版本。 8 9 10 11## 子组件 12 13无 14 15 16## 接口 17 18ImageAnimator() 19 20从API version 10开始,该接口支持在ArkTS卡片中使用。 21 22## 属性 23 24除支持[通用属性](ts-universal-attributes-size.md)外,还支持以下属性: 25 26| 参数名称 | 参数类型 |参数描述 | 27| ---------- | ----------------------- |-------- | 28| images | Array<[ImageFrameInfo](#imageframeinfo对象说明)> | 设置图片帧信息集合。每一帧的帧信息(ImageFrameInfo)包含图片路径、图片大小、图片位置和图片播放时长信息,详见ImageFrameInfo属性说明。<br/>默认值:[]<br/>**说明:**<br>不支持动态更新。<br/>从API version 10开始,该接口支持在ArkTS卡片中使用。 | 29| state | [AnimationStatus](ts-appendix-enums.md#animationstatus) | 默认为初始状态,用于控制播放状态。<br/>默认值:AnimationStatus.Initial <br/>从API version 10开始,该接口支持在ArkTS卡片中使用。 | 30| duration | number | 单位为毫秒,默认时长为1000ms;duration为0时,不播放图片;值的改变只会在下一次循环开始时生效;当images中任意一帧图片设置了单独的duration后,该属性设置无效。<br/>默认值:1000 <br/>从API version 10开始,该接口支持在ArkTS卡片中使用。 | 31| reverse | boolean | 设置播放方向。false表示从第1张图片播放到最后1张图片; true表示从最后1张图片播放到第1张图片。<br/>默认值:false <br/>从API version 10开始,该接口支持在ArkTS卡片中使用。 | 32| fixedSize | boolean | 设置图片大小是否固定为组件大小。 true表示图片大小与组件大小一致,此时设置图片的width 、height 、top 和left属性是无效的。false表示每一张图片的width 、height 、top和left属性都要单独设置。<br/>默认值:true <br/>从API version 10开始,该接口支持在ArkTS卡片中使用。 | 33| preDecode<sup>(deprecated)</sup> | number | 预解码的图片数量。例如该值设为2,则播放当前页时会提前加载后面两张图片至缓存以提升性能。<br/>从API version 9开始废弃。<br/>默认值:0 | 34| fillMode | [FillMode](ts-appendix-enums.md#fillmode) | 设置当前播放方向下,动画开始前和结束后的状态,可选值参见FillMode说明。动画结束后的状态由fillMode和reverse属性共同决定。例如,fillMode为Forwards表示停止时维持动画最后一个关键帧的状态,若reverse为false则维持正播的最后一帧,即最后一张图,若reverse为true则维持逆播的最后一帧,即第一张图。<br/>默认值:FillMode.Forwards <br/>从API version 10开始,该接口支持在ArkTS卡片中使用。 | 35| iterations | number | 默认播放一次,设置为-1时表示无限次播放。<br/>默认值:1 | 36 37## ImageFrameInfo对象说明 38 39| 参数名称 | 参数类型 | 必填 | 参数描述 | 40| -------- | -------------- | -------- | -------- | 41| src | string \| [Resource](ts-types.md#resource)<sup>9+</sup> | 是 | 图片路径,图片格式为svg,png和jpg,从API Version9开始支持[Resource](ts-types.md#resource)类型的路径。 <br/>从API version 10开始,该接口支持在ArkTS卡片中使用。| 42| width | number \| string | 否 | 图片宽度。<br/>默认值:0 <br/>从API version 10开始,该接口支持在ArkTS卡片中使用 | 43| height | number \| string | 否 | 图片高度。<br/>默认值:0 <br/>从API version 10开始,该接口支持在ArkTS卡片中使用 | 44| top | number \| string | 否 | 图片相对于组件左上角的纵向坐标。<br/>默认值:0 <br/>从API version 10开始,该接口支持在ArkTS卡片中使用 | 45| left | number \| string | 否 | 图片相对于组件左上角的横向坐标。<br/>默认值:0 <br/>从API version 10开始,该接口支持在ArkTS卡片中使用 | 46| duration | number | 否 | 每一帧图片的播放时长,单位毫秒。<br/>默认值:0 | 47 48## 事件 49 50除支持[通用事件](ts-universal-events-click.md)外,还支持以下事件: 51 52| 名称 | 功能描述 | 53| -------- | -------- | 54| onStart(event: () => void) | 状态回调,动画开始播放时触发。 <br/>从API version 10开始,该接口支持在ArkTS卡片中使用。 | 55| onPause(event: () => void) | 状态回调,动画暂停播放时触发。 <br/>从API version 10开始,该接口支持在ArkTS卡片中使用。 | 56| onRepeat(event: () => void) | 状态回调,动画重复播放时触发。 | 57| onCancel(event: () => void) | 状态回调,动画返回最初状态时触发。 <br/>从API version 10开始,该接口支持在ArkTS卡片中使用。 | 58| onFinish(event: () => void) | 状态回调,动画播放完成时或者停止播放时触发。 <br/>从API version 10开始,该接口支持在ArkTS卡片中使用。 | 59 60 61## 示例 62 63```ts 64// xxx.ets 65@Entry 66@Component 67struct ImageAnimatorExample { 68 @State state: AnimationStatus = AnimationStatus.Initial 69 @State reverse: boolean = false 70 @State iterations: number = 1 71 72 build() { 73 Column({ space: 10 }) { 74 ImageAnimator() 75 .images([ 76 { 77 src: $r('app.media.img1') 78 }, 79 { 80 src: $r('app.media.img2') 81 }, 82 { 83 src: $r('app.media.img3') 84 }, 85 { 86 src: $r('app.media.img4') 87 } 88 ]) 89 .duration(2000) 90 .state(this.state).reverse(this.reverse) 91 .fillMode(FillMode.None).iterations(this.iterations).width(340).height(240) 92 .margin({ top: 100 }) 93 .onStart(() => { 94 console.info('Start') 95 }) 96 .onPause(() => { 97 console.info('Pause') 98 }) 99 .onRepeat(() => { 100 console.info('Repeat') 101 }) 102 .onCancel(() => { 103 console.info('Cancel') 104 }) 105 .onFinish(() => { 106 console.info('Finish') 107 this.state = AnimationStatus.Stopped 108 }) 109 Row() { 110 Button('start').width(100).padding(5).onClick(() => { 111 this.state = AnimationStatus.Running 112 }).margin(5) 113 Button('pause').width(100).padding(5).onClick(() => { 114 this.state = AnimationStatus.Paused // 显示当前帧图片 115 }).margin(5) 116 Button('stop').width(100).padding(5).onClick(() => { 117 this.state = AnimationStatus.Stopped // 显示动画的起始帧图片 118 }).margin(5) 119 } 120 121 Row() { 122 Button('reverse').width(100).padding(5).onClick(() => { 123 this.reverse = !this.reverse 124 }).margin(5) 125 Button('once').width(100).padding(5).onClick(() => { 126 this.iterations = 1 127 }).margin(5) 128 Button('infinite').width(100).padding(5).onClick(() => { 129 this.iterations = -1 // 无限循环播放 130 }).margin(5) 131 } 132 }.width('100%').height('100%') 133 } 134} 135``` 136 137