• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1# ImageAnimator
2
3提供帧动画组件来实现逐帧播放图片的能力,可以配置需要播放的图片列表,每张图片可以配置时长。
4
5>  **说明:**
6>
7> 该组件从API Version 7开始支持。后续版本如有新增内容,则采用上角标单独标记该内容的起始版本。
8
9
10
11## 子组件
12
1314
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&lt;[ImageFrameInfo](#imageframeinfo对象说明)&gt; | 设置图片帧信息集合。每一帧的帧信息(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张图片;&nbsp;true表示从最后1张图片播放到第1张图片。<br/>默认值:false <br/>从API version 10开始,该接口支持在ArkTS卡片中使用。 |
32| fixedSize  | boolean | 设置图片大小是否固定为组件大小。&nbsp;true表示图片大小与组件大小一致,此时设置图片的width&nbsp;、height&nbsp;、top&nbsp;和left属性是无效的。false表示每一张图片的width&nbsp;、height&nbsp;、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&nbsp;\|&nbsp;string | 否  | 图片宽度。<br/>默认值:0   <br/>从API version 10开始,该接口支持在ArkTS卡片中使用       |
43| height   | number&nbsp;\|&nbsp;string | 否  | 图片高度。<br/>默认值:0     <br/>从API version 10开始,该接口支持在ArkTS卡片中使用        |
44| top      | number&nbsp;\|&nbsp;string | 否  | 图片相对于组件左上角的纵向坐标。<br/>默认值:0  <br/>从API version 10开始,该接口支持在ArkTS卡片中使用  |
45| left     | number&nbsp;\|&nbsp;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:&nbsp;()&nbsp;=&gt;&nbsp;void)  | 状态回调,动画开始播放时触发。 <br/>从API version 10开始,该接口支持在ArkTS卡片中使用。 |
55| onPause(event:&nbsp;()&nbsp;=&gt;&nbsp;void)  | 状态回调,动画暂停播放时触发。 <br/>从API version 10开始,该接口支持在ArkTS卡片中使用。 |
56| onRepeat(event:&nbsp;()&nbsp;=&gt;&nbsp;void) | 状态回调,动画重复播放时触发。  |
57| onCancel(event:&nbsp;()&nbsp;=&gt;&nbsp;void) | 状态回调,动画返回最初状态时触发。 <br/>从API version 10开始,该接口支持在ArkTS卡片中使用。 |
58| onFinish(event:&nbsp;()&nbsp;=&gt;&nbsp;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![imageAnimator](figures/imageAnimator.gif)