# ImageAnimator æ供帧动画组件æ¥å®žçŽ°é€å¸§æ’放图片的能力,å¯ä»¥é…置需è¦æ’放的图片列表,æ¯å¼ 图片å¯ä»¥é…置时长。 > **说明:** > > 该组件从API Version 7开始支æŒã€‚åŽç»ç‰ˆæœ¬å¦‚æœ‰æ–°å¢žå†…å®¹ï¼Œåˆ™é‡‡ç”¨ä¸Šè§’æ ‡å•ç‹¬æ ‡è®°è¯¥å†…容的起始版本。 ## å组件 æ— ## æŽ¥å£ ImageAnimator() **å¡ç‰‡èƒ½åŠ›ï¼š** 从API version 10开始,该接å£æ”¯æŒåœ¨ArkTSå¡ç‰‡ä¸ä½¿ç”¨ã€‚ **原å化æœåŠ¡API:** 从API version 11开始,该接å£æ”¯æŒåœ¨åŽŸå化æœåŠ¡ä¸ä½¿ç”¨ã€‚ **系统能力:** SystemCapability.ArkUI.ArkUI.Full ## 属性 除支æŒ[通用属性](ts-universal-attributes-size.md)外,还支æŒä»¥ä¸‹å±žæ€§ï¼š ### images images(value: Array<ImageFrameInfo>) 设置图片帧信æ¯é›†åˆã€‚ä¸æ”¯æŒåŠ¨æ€æ›´æ–°ã€‚ **å¡ç‰‡èƒ½åŠ›ï¼š** 从API version 10开始,该接å£æ”¯æŒåœ¨ArkTSå¡ç‰‡ä¸ä½¿ç”¨ã€‚ **原å化æœåŠ¡API:** 从API version 11开始,该接å£æ”¯æŒåœ¨åŽŸå化æœåŠ¡ä¸ä½¿ç”¨ã€‚ **系统能力:** SystemCapability.ArkUI.ArkUI.Full **å‚数:** | å‚æ•°å | 类型 | å¿…å¡« | 说明 | | ------ | ------------------------------------------------------ | ---- | ------------------------------------------------------------ | | value | Array<[ImageFrameInfo](#imageframeinfo对象说明)> | 是 | 设置图片帧信æ¯é›†åˆã€‚æ¯ä¸€å¸§çš„帧信æ¯(ImageFrameInfo)包å«å›¾ç‰‡è·¯å¾„ã€å›¾ç‰‡å¤§å°ã€å›¾ç‰‡ä½ç½®å’Œå›¾ç‰‡æ’放时长信æ¯ï¼Œè¯¦è§ImageFrameInfo属性说明。<br/>默认值:[] | ### state state(value: AnimationStatus) 控制æ’放状æ€ã€‚ **å¡ç‰‡èƒ½åŠ›ï¼š** 从API version 10开始,该接å£æ”¯æŒåœ¨ArkTSå¡ç‰‡ä¸ä½¿ç”¨ã€‚ **原å化æœåŠ¡API:** 从API version 11开始,该接å£æ”¯æŒåœ¨åŽŸå化æœåŠ¡ä¸ä½¿ç”¨ã€‚ **系统能力:** SystemCapability.ArkUI.ArkUI.Full **å‚数:** | å‚æ•°å | 类型 | å¿…å¡« | 说明 | | ------ | ------------------------------------------------------- | ---- | ------------------------------------------------------------ | | value | [AnimationStatus](ts-appendix-enums.md#animationstatus) | 是 | 默认为åˆå§‹çŠ¶æ€ï¼Œç”¨äºŽæŽ§åˆ¶æ’放状æ€ã€‚<br/>默认值:AnimationStatus.Initial | ### duration duration(value: number) 设置æ’放时长。当Imagesä¸ä»»æ„一帧图片设置了å•ç‹¬çš„durationåŽï¼Œè¯¥å±žæ€§è®¾ç½®æ— 效。 **å¡ç‰‡èƒ½åŠ›ï¼š** 从API version 10开始,该接å£æ”¯æŒåœ¨ArkTSå¡ç‰‡ä¸ä½¿ç”¨ã€‚ **原å化æœåŠ¡API:** 从API version 11开始,该接å£æ”¯æŒåœ¨åŽŸå化æœåŠ¡ä¸ä½¿ç”¨ã€‚ **系统能力:** SystemCapability.ArkUI.ArkUI.Full **å‚数:** | å‚æ•°å | 类型 | å¿…å¡« | 说明 | | ------ | ------ | ---- | ------------------------------------------------------------ | | value | number | 是 | æ’放时长。<br/>value为0时,ä¸æ’放图片。<br/>value的改å˜åªä¼šåœ¨ä¸‹ä¸€æ¬¡å¾ªçŽ¯å¼€å§‹æ—¶ç”Ÿæ•ˆã€‚<br/>å•ä½ï¼šæ¯«ç§’<br/>默认值:1000ms | ### reverse reverse(value: boolean) 设置æ’放方å‘。 **å¡ç‰‡èƒ½åŠ›ï¼š** 从API version 10开始,该接å£æ”¯æŒåœ¨ArkTSå¡ç‰‡ä¸ä½¿ç”¨ã€‚ **原å化æœåŠ¡API:** 从API version 11开始,该接å£æ”¯æŒåœ¨åŽŸå化æœåŠ¡ä¸ä½¿ç”¨ã€‚ **系统能力:** SystemCapability.ArkUI.ArkUI.Full **å‚数:** | å‚æ•°å | 类型 | å¿…å¡« | 说明 | | ------ | ------- | ---- | ------------------------------------------------------------ | | value | boolean | 是 | æ’放方å‘。<br/>false表示从第1å¼ å›¾ç‰‡æ’放到最åŽ1å¼ å›¾ç‰‡ï¼Œtrue表示从最åŽ1å¼ å›¾ç‰‡æ’放到第1å¼ å›¾ç‰‡ã€‚<br/>默认值:false | ### fixedSize fixedSize(value: boolean) 设置图片大å°æ˜¯å¦å›ºå®šä¸ºç»„件大å°ã€‚ **å¡ç‰‡èƒ½åŠ›ï¼š** 从API version 10开始,该接å£æ”¯æŒåœ¨ArkTSå¡ç‰‡ä¸ä½¿ç”¨ã€‚ **原å化æœåŠ¡API:** 从API version 11开始,该接å£æ”¯æŒåœ¨åŽŸå化æœåŠ¡ä¸ä½¿ç”¨ã€‚ **系统能力:** SystemCapability.ArkUI.ArkUI.Full **å‚数:** | å‚æ•°å | 类型 | å¿…å¡« | 说明 | | ------ | ------- | ---- | ------------------------------------------------------------ | | value | boolean | 是 | 设置图片大å°æ˜¯å¦å›ºå®šä¸ºç»„件大å°ã€‚ true表示图片大å°ä¸Žç»„件大å°ä¸€è‡´ï¼Œæ¤æ—¶è®¾ç½®å›¾ç‰‡çš„width ã€height ã€top å’Œleftå±žæ€§æ˜¯æ— æ•ˆçš„ã€‚false表示æ¯ä¸€å¼ 图片的width ã€height ã€topå’Œleft属性都è¦å•ç‹¬è®¾ç½®ã€‚<br/>默认值:true | ### preDecode<sup>(deprecated)</sup> preDecode(value: number) 设置预解ç 的图片数é‡ã€‚ 从API version 9开始废弃。 **系统能力:** SystemCapability.ArkUI.ArkUI.Full **å‚数:** | å‚æ•°å | 类型 | å¿…å¡« | 说明 | | ------ | ------ | ---- | ------------------------------------------------------------ | | value | number | 是 | 预解ç 的图片数é‡ã€‚例如该值设为2,则æ’放当å‰é¡µæ—¶ä¼šæå‰åŠ è½½åŽé¢ä¸¤å¼ 图片至缓å˜ä»¥æå‡æ€§èƒ½ã€‚<br/>默认值:0 | ### fillMode fillMode(value: FillMode) 设置当å‰æ’放方å‘下,动画开始å‰å’Œç»“æŸåŽçš„状æ€ã€‚动画结æŸåŽçš„状æ€ç”±fillModeå’Œreverse属性共åŒå†³å®šã€‚例如,fillMode为Forwards表示åœæ¢æ—¶ç»´æŒåŠ¨ç”»æœ€åŽä¸€ä¸ªå…³é”®å¸§çš„状æ€ï¼Œè‹¥reverse为false则维æŒæ£æ’的最åŽä¸€å¸§ï¼Œå³æœ€åŽä¸€å¼ 图,若reverse为true则维æŒé€†æ’的最åŽä¸€å¸§ï¼Œå³ç¬¬ä¸€å¼ 图。 **å¡ç‰‡èƒ½åŠ›ï¼š** 从API version 10开始,该接å£æ”¯æŒåœ¨ArkTSå¡ç‰‡ä¸ä½¿ç”¨ã€‚ **原å化æœåŠ¡API:** 从API version 11开始,该接å£æ”¯æŒåœ¨åŽŸå化æœåŠ¡ä¸ä½¿ç”¨ã€‚ **系统能力:** SystemCapability.ArkUI.ArkUI.Full **å‚数:** | å‚æ•°å | 类型 | å¿…å¡« | 说明 | | ------ | ----------------------------------------- | ---- | ------------------------------------------------------------ | | value | [FillMode](ts-appendix-enums.md#fillmode) | 是 | 当å‰æ’放方å‘下,动画开始å‰å’Œç»“æŸåŽçš„状æ€ã€‚<br/>默认值:FillMode.Forwards | ### iterations iterations(value: number) 设置æ’放次数。 **原å化æœåŠ¡API:** 从API version 11开始,该接å£æ”¯æŒåœ¨åŽŸå化æœåŠ¡ä¸ä½¿ç”¨ã€‚ **系统能力:** SystemCapability.ArkUI.ArkUI.Full **å‚数:** | å‚æ•°å | 类型 | å¿…å¡« | 说明 | | ------ | ------ | ---- | ------------------------------------------------------ | | value | number | 是 | 默认æ’放一次,设置为-1æ—¶è¡¨ç¤ºæ— é™æ¬¡æ’放。<br/>默认值:1 | ## ImageFrameInfo对象说明 **原å化æœåŠ¡API:** 从API version 11开始,该接å£æ”¯æŒåœ¨åŽŸå化æœåŠ¡ä¸ä½¿ç”¨ã€‚ **系统能力:** SystemCapability.ArkUI.ArkUI.Full | å称 | 类型 | å¿…å¡« | 说明 | | -------- | -------------- | -------- | -------- | | src | string \| [Resource](ts-types.md#resource)<sup>9+</sup> \| [PixelMap](../../apis-image-kit/js-apis-image.md#pixelmap7)<sup>12+</sup> | 是 | å›¾ç‰‡è·¯å¾„ï¼Œå›¾ç‰‡æ ¼å¼ä¸ºjpgã€jpegã€svgã€pngã€bmpã€webpã€icoå’Œheif,从API Version9开始支æŒ[Resource](ts-types.md#resource)类型的路径,从API version 12开始支æŒ[PixelMap](../../apis-image-kit/js-apis-image.md#pixelmap7)类型。 <br/>**å¡ç‰‡èƒ½åŠ›ï¼š** 从API version 10开始,该接å£æ”¯æŒåœ¨ArkTSå¡ç‰‡ä¸ä½¿ç”¨ã€‚| | width | number \| string | å¦ | 图片宽度。<br/>默认值:0 <br/>**å¡ç‰‡èƒ½åŠ›ï¼š** 从API version 10开始,该接å£æ”¯æŒåœ¨ArkTSå¡ç‰‡ä¸ä½¿ç”¨ | | height | number \| string | å¦ | 图片高度。<br/>默认值:0 <br/>**å¡ç‰‡èƒ½åŠ›ï¼š** 从API version 10开始,该接å£æ”¯æŒåœ¨ArkTSå¡ç‰‡ä¸ä½¿ç”¨ | | top | number \| string | å¦ | 图片相对于组件左上角的纵å‘åæ ‡ã€‚<br/>默认值:0 <br/>**å¡ç‰‡èƒ½åŠ›ï¼š** 从API version 10开始,该接å£æ”¯æŒåœ¨ArkTSå¡ç‰‡ä¸ä½¿ç”¨ | | left | number \| string | å¦ | 图片相对于组件左上角的横å‘åæ ‡ã€‚<br/>默认值:0 <br/>**å¡ç‰‡èƒ½åŠ›ï¼š** 从API version 10开始,该接å£æ”¯æŒåœ¨ArkTSå¡ç‰‡ä¸ä½¿ç”¨ | | duration | number | å¦ | æ¯ä¸€å¸§å›¾ç‰‡çš„æ’放时长,å•ä½æ¯«ç§’。<br/>默认值:0 | ## 事件 除支æŒ[通用事件](ts-universal-events-click.md)外,还支æŒä»¥ä¸‹äº‹ä»¶ï¼š ### onStart onStart(event: () => void) 状æ€å›žè°ƒï¼ŒåŠ¨ç”»å¼€å§‹æ’放时触å‘。 **å¡ç‰‡èƒ½åŠ›ï¼š** 从API version 10开始,该接å£æ”¯æŒåœ¨ArkTSå¡ç‰‡ä¸ä½¿ç”¨ã€‚ **原å化æœåŠ¡API:** 从API version 11开始,该接å£æ”¯æŒåœ¨åŽŸå化æœåŠ¡ä¸ä½¿ç”¨ã€‚ **系统能力:** SystemCapability.ArkUI.ArkUI.Full ### onPause onPause(event: () => void) 状æ€å›žè°ƒï¼ŒåŠ¨ç”»æš‚åœæ’放时触å‘。 **å¡ç‰‡èƒ½åŠ›ï¼š** 从API version 10开始,该接å£æ”¯æŒåœ¨ArkTSå¡ç‰‡ä¸ä½¿ç”¨ã€‚ **原å化æœåŠ¡API:** 从API version 11开始,该接å£æ”¯æŒåœ¨åŽŸå化æœåŠ¡ä¸ä½¿ç”¨ã€‚ **系统能力:** SystemCapability.ArkUI.ArkUI.Full ### onRepeat onRepeat(event: () => void) 状æ€å›žè°ƒï¼ŒåŠ¨ç”»é‡å¤æ’放时触å‘。 **原å化æœåŠ¡API:** 从API version 11开始,该接å£æ”¯æŒåœ¨åŽŸå化æœåŠ¡ä¸ä½¿ç”¨ã€‚ **系统能力:** SystemCapability.ArkUI.ArkUI.Full ### onCancel onCancel(event: () => void) 状æ€å›žè°ƒï¼ŒåŠ¨ç”»è¿”回最åˆçŠ¶æ€æ—¶è§¦å‘。 **å¡ç‰‡èƒ½åŠ›ï¼š** 从API version 10开始,该接å£æ”¯æŒåœ¨ArkTSå¡ç‰‡ä¸ä½¿ç”¨ã€‚ **原å化æœåŠ¡API:** 从API version 11开始,该接å£æ”¯æŒåœ¨åŽŸå化æœåŠ¡ä¸ä½¿ç”¨ã€‚ **系统能力:** SystemCapability.ArkUI.ArkUI.Full ### onFinish onFinish(event: () => void) 状æ€å›žè°ƒï¼ŒåŠ¨ç”»æ’放完æˆæ—¶æˆ–者åœæ¢æ’放时触å‘。 **å¡ç‰‡èƒ½åŠ›ï¼š** 从API version 10开始,该接å£æ”¯æŒåœ¨ArkTSå¡ç‰‡ä¸ä½¿ç”¨ã€‚ **原å化æœåŠ¡API:** 从API version 11开始,该接å£æ”¯æŒåœ¨åŽŸå化æœåŠ¡ä¸ä½¿ç”¨ã€‚ **系统能力:** SystemCapability.ArkUI.ArkUI.Full ## 示例 ### 示例1(æ’放Resource动画) 通过ImageAnimator组件æ’放Resource动画。 ```ts // xxx.ets @Entry @Component struct ImageAnimatorExample { @State state: AnimationStatus = AnimationStatus.Initial @State reverse: boolean = false @State iterations: number = 1 build() { Column({ space: 10 }) { ImageAnimator() .images([ { src: $r('app.media.img1') }, { src: $r('app.media.img2') }, { src: $r('app.media.img3') }, { src: $r('app.media.img4') } ]) .duration(2000) .state(this.state).reverse(this.reverse) .fillMode(FillMode.None).iterations(this.iterations).width(340).height(240) .margin({ top: 100 }) .onStart(() => { console.info('Start') }) .onPause(() => { console.info('Pause') }) .onRepeat(() => { console.info('Repeat') }) .onCancel(() => { console.info('Cancel') }) .onFinish(() => { console.info('Finish') this.state = AnimationStatus.Stopped }) Row() { Button('start').width(100).padding(5).onClick(() => { this.state = AnimationStatus.Running }).margin(5) Button('pause').width(100).padding(5).onClick(() => { this.state = AnimationStatus.Paused // 显示当å‰å¸§å›¾ç‰‡ }).margin(5) Button('stop').width(100).padding(5).onClick(() => { this.state = AnimationStatus.Stopped // 显示动画的起始帧图片 }).margin(5) } Row() { Button('reverse').width(100).padding(5).onClick(() => { this.reverse = !this.reverse }).margin(5) Button('once').width(100).padding(5).onClick(() => { this.iterations = 1 }).margin(5) Button('infinite').width(100).padding(5).onClick(() => { this.iterations = -1 // æ— é™å¾ªçŽ¯æ’放 }).margin(5) } }.width('100%').height('100%') } } ``` ### 示例2(æ’放PixelMap动画) 通过ImageAnimator组件æ’放PixelMap动画。 ```ts // xxx.ets import { image } from '@kit.ImageKit' @Entry @Component struct ImageAnimatorExample { imagePixelMap: Array<PixelMap> = [] @State state: AnimationStatus = AnimationStatus.Initial @State reverse: boolean = false @State iterations: number = 1 @State images:Array<ImageFrameInfo> = [] async aboutToAppear() { this.imagePixelMap.push(await this.getPixmapFromMedia($r('app.media.icon'))) this.images.push({src:this.imagePixelMap[0]}) } build() { Column({ space: 10 }) { ImageAnimator() .images(this.images) .duration(2000) .state(this.state).reverse(this.reverse) .fillMode(FillMode.None).iterations(this.iterations).width(340).height(240) .margin({ top: 100 }) .onStart(() => { console.info('Start') }) .onPause(() => { console.info('Pause') }) .onRepeat(() => { console.info('Repeat') }) .onCancel(() => { console.info('Cancel') }) .onFinish(() => { console.info('Finish') this.state = AnimationStatus.Stopped }) Row() { Button('start').width(100).padding(5).onClick(() => { this.state = AnimationStatus.Running }).margin(5) Button('pause').width(100).padding(5).onClick(() => { this.state = AnimationStatus.Paused // 显示当å‰å¸§å›¾ç‰‡ }).margin(5) Button('stop').width(100).padding(5).onClick(() => { this.state = AnimationStatus.Stopped // 显示动画的起始帧图片 }).margin(5) } Row() { Button('reverse').width(100).padding(5).onClick(() => { this.reverse = !this.reverse }).margin(5) Button('once').width(100).padding(5).onClick(() => { this.iterations = 1 }).margin(5) Button('infinite').width(100).padding(5).onClick(() => { this.iterations = -1 // æ— é™å¾ªçŽ¯æ’放 }).margin(5) } }.width('100%').height('100%') } private async getPixmapFromMedia(resource: Resource) { let unit8Array = await getContext(this)?.resourceManager?.getMediaContent({ bundleName: resource.bundleName, moduleName: resource.moduleName, id: resource.id }) let imageSource = image.createImageSource(unit8Array.buffer.slice(0, unit8Array.buffer.byteLength)) let createPixelMap: image.PixelMap = await imageSource.createPixelMap({ desiredPixelFormat: image.PixelMapFormat.RGBA_8888 }) await imageSource.release() return createPixelMap } } ``` 