• 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## 属性
21
22除支持[通用属性](ts-universal-attributes-size.md)外,还支持以下属性:
23
24| 参数名称     | 参数类型                  |参数描述                   |
25| ---------- | ----------------------- |-------- |
26| images     | Array&lt;[ImageFrameInfo](#imageframeinfo对象说明)&gt; | 设置图片帧信息集合。每一帧的帧信息(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张图片;&nbsp;true表示从最后1张图片播放到第1张图片。<br/>默认值:false |
30| fixedSize  | boolean | 设置图片大小是否固定为组件大小。&nbsp;true表示图片大小与组件大小一致,此时设置图片的width&nbsp;、height&nbsp;、top&nbsp;和left属性是无效的。false表示每一张图片的width&nbsp;、height&nbsp;、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&nbsp;\|&nbsp;string | 否  | 图片宽度。<br/>默认值:0          |
41| height   | number&nbsp;\|&nbsp;string | 否  | 图片高度。<br/>默认值:0             |
42| top      | number&nbsp;\|&nbsp;string | 否  | 图片相对于组件左上角的纵向坐标。<br/>默认值:0    |
43| left     | number&nbsp;\|&nbsp;string | 否  | 图片相对于组件左上角的横向坐标。<br/>默认值:0    |
44| duration | number          | 否     | 每一帧图片的播放时长,单位毫秒。<br/>默认值:0               |
45
46## 事件
47
48除支持[通用事件](ts-universal-events-click.md)外,还支持以下事件:
49
50| 名称 | 功能描述 |
51| -------- | -------- |
52| onStart(event:&nbsp;()&nbsp;=&gt;&nbsp;void)  | 状态回调,动画开始播放时触发。 |
53| onPause(event:&nbsp;()&nbsp;=&gt;&nbsp;void)  | 状态回调,动画暂停播放时触发。 |
54| onRepeat(event:&nbsp;()&nbsp;=&gt;&nbsp;void) | 状态回调,动画重复播放时触发。 |
55| onCancel(event:&nbsp;()&nbsp;=&gt;&nbsp;void) | 状态回调,动画取消播放时触发。 |
56| onFinish(event:&nbsp;()&nbsp;=&gt;&nbsp;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![imageAnimator](figures/imageAnimator.gif)