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