1e41f4b71Sopenharmony_ci# <image-animator> Development
2e41f4b71Sopenharmony_ci
3e41f4b71Sopenharmony_ci
4e41f4b71Sopenharmony_ciThe **<image-animator>** component applies an animation to images. For details, see [image-animator](../reference/apis-arkui/arkui-js/js-components-basic-image-animator.md).
5e41f4b71Sopenharmony_ci
6e41f4b71Sopenharmony_ci
7e41f4b71Sopenharmony_ci## Creating an <image-animator> Component
8e41f4b71Sopenharmony_ci
9e41f4b71Sopenharmony_ciIn the **pages/index** directory, create an **<image-animator>** component in the .hml file, define the component style in the .css file, and reference an image in the .js file.
10e41f4b71Sopenharmony_ci
11e41f4b71Sopenharmony_ci
12e41f4b71Sopenharmony_ci```html
13e41f4b71Sopenharmony_ci<!-- xxx.hml -->
14e41f4b71Sopenharmony_ci<div class="container">
15e41f4b71Sopenharmony_ci  <image-animator class="animator" images="{{frames}}" duration="3s"/>
16e41f4b71Sopenharmony_ci</div>
17e41f4b71Sopenharmony_ci```
18e41f4b71Sopenharmony_ci
19e41f4b71Sopenharmony_ci
20e41f4b71Sopenharmony_ci```css
21e41f4b71Sopenharmony_ci/* xxx.css */
22e41f4b71Sopenharmony_ci.container {
23e41f4b71Sopenharmony_ci  width: 100%;
24e41f4b71Sopenharmony_ci  height: 100%;
25e41f4b71Sopenharmony_ci  flex-direction: column;
26e41f4b71Sopenharmony_ci  justify-content: center;
27e41f4b71Sopenharmony_ci  align-items: center;
28e41f4b71Sopenharmony_ci  background-color: #F1F3F5;
29e41f4b71Sopenharmony_ci}
30e41f4b71Sopenharmony_ci.animator {
31e41f4b71Sopenharmony_ci  width: 500px;
32e41f4b71Sopenharmony_ci  height: 500px;
33e41f4b71Sopenharmony_ci}
34e41f4b71Sopenharmony_ci```
35e41f4b71Sopenharmony_ci
36e41f4b71Sopenharmony_ci
37e41f4b71Sopenharmony_ci```js
38e41f4b71Sopenharmony_ci// index.js
39e41f4b71Sopenharmony_ciexport default {
40e41f4b71Sopenharmony_ci  data: {
41e41f4b71Sopenharmony_ci    frames: [
42e41f4b71Sopenharmony_ci      {
43e41f4b71Sopenharmony_ci        src: "/common/landscape1.jpg",
44e41f4b71Sopenharmony_ci      },
45e41f4b71Sopenharmony_ci      {
46e41f4b71Sopenharmony_ci        src: "/common/landscape2.jpg",
47e41f4b71Sopenharmony_ci      }
48e41f4b71Sopenharmony_ci    ],
49e41f4b71Sopenharmony_ci  },
50e41f4b71Sopenharmony_ci};
51e41f4b71Sopenharmony_ci```
52e41f4b71Sopenharmony_ci
53e41f4b71Sopenharmony_ci![en-us_image_0000001275922969](figures/en-us_image_0000001275922969.gif)
54e41f4b71Sopenharmony_ci
55e41f4b71Sopenharmony_ci
56e41f4b71Sopenharmony_ci## Setting the &lt;image-animator&gt; Attributes
57e41f4b71Sopenharmony_ci
58e41f4b71Sopenharmony_ciAdd the **iteration** (number of times the animation is played), **reverse** (whether the animation plays backward), **fixedsize** (whether the image size is fixed to the component size), **duration** (duration of the animation), and **fillmode** (style of the target when the animation is not playing) attributes.
59e41f4b71Sopenharmony_ci
60e41f4b71Sopenharmony_ci
61e41f4b71Sopenharmony_ci```html
62e41f4b71Sopenharmony_ci<!-- xxx.hml -->
63e41f4b71Sopenharmony_ci<div class="container">
64e41f4b71Sopenharmony_ci  <image-animator class="animator" fixedsize="false" iteration='2' reverse="false" ref="animator" fillmode="none" images="{{frames}}"   duration="5s" />
65e41f4b71Sopenharmony_ci</div>
66e41f4b71Sopenharmony_ci```
67e41f4b71Sopenharmony_ci
68e41f4b71Sopenharmony_ci
69e41f4b71Sopenharmony_ci```css
70e41f4b71Sopenharmony_ci/* xxx.css */
71e41f4b71Sopenharmony_ci.container {
72e41f4b71Sopenharmony_ci  width: 100%;
73e41f4b71Sopenharmony_ci  height: 100%;
74e41f4b71Sopenharmony_ci  flex-direction: column;
75e41f4b71Sopenharmony_ci  background-color: #F1F3F5;
76e41f4b71Sopenharmony_ci}
77e41f4b71Sopenharmony_ci.animator {
78e41f4b71Sopenharmony_ci  width: 500px;
79e41f4b71Sopenharmony_ci  height: 500px;
80e41f4b71Sopenharmony_ci}
81e41f4b71Sopenharmony_ci```
82e41f4b71Sopenharmony_ci
83e41f4b71Sopenharmony_ci
84e41f4b71Sopenharmony_ci```js
85e41f4b71Sopenharmony_ci// index.js
86e41f4b71Sopenharmony_ciexport default {
87e41f4b71Sopenharmony_ci  data: {
88e41f4b71Sopenharmony_ci    frames: [
89e41f4b71Sopenharmony_ci      {
90e41f4b71Sopenharmony_ci        src: 'common/landscape1.jpg',
91e41f4b71Sopenharmony_ci        width: '250px',
92e41f4b71Sopenharmony_ci        height: '250px',
93e41f4b71Sopenharmony_ci        left: '150px',
94e41f4b71Sopenharmony_ci        top: '50px',
95e41f4b71Sopenharmony_ci      },
96e41f4b71Sopenharmony_ci      {
97e41f4b71Sopenharmony_ci        src: 'common/landscape2.jpg',
98e41f4b71Sopenharmony_ci        width: '300px',
99e41f4b71Sopenharmony_ci        height: '300px',
100e41f4b71Sopenharmony_ci        left: '150px',
101e41f4b71Sopenharmony_ci        top: '100px',
102e41f4b71Sopenharmony_ci      },
103e41f4b71Sopenharmony_ci      {
104e41f4b71Sopenharmony_ci        src: 'common/landscape1.jpg',
105e41f4b71Sopenharmony_ci        width: '350px',
106e41f4b71Sopenharmony_ci        height: '350px',
107e41f4b71Sopenharmony_ci        left: '150px',
108e41f4b71Sopenharmony_ci        top: '150px',
109e41f4b71Sopenharmony_ci      },
110e41f4b71Sopenharmony_ci      {
111e41f4b71Sopenharmony_ci        src: 'common/landscape2.jpg',
112e41f4b71Sopenharmony_ci        width: '400px',
113e41f4b71Sopenharmony_ci        height: '400px',
114e41f4b71Sopenharmony_ci        left: '150px',
115e41f4b71Sopenharmony_ci        top: '200px',
116e41f4b71Sopenharmony_ci      },
117e41f4b71Sopenharmony_ci      {
118e41f4b71Sopenharmony_ci        src: 'common/landscape3.jpg',
119e41f4b71Sopenharmony_ci        width: '450px',
120e41f4b71Sopenharmony_ci        height: '450px',
121e41f4b71Sopenharmony_ci        left: '150px',
122e41f4b71Sopenharmony_ci        top: '250px',
123e41f4b71Sopenharmony_ci      },
124e41f4b71Sopenharmony_ci      {
125e41f4b71Sopenharmony_ci        src: 'common/landscape4.jpg',
126e41f4b71Sopenharmony_ci        width: '500px',
127e41f4b71Sopenharmony_ci        height: '500px',
128e41f4b71Sopenharmony_ci        left: '150px',
129e41f4b71Sopenharmony_ci        top: '300px',
130e41f4b71Sopenharmony_ci      },
131e41f4b71Sopenharmony_ci    ],
132e41f4b71Sopenharmony_ci  },
133e41f4b71Sopenharmony_ci};
134e41f4b71Sopenharmony_ci```
135e41f4b71Sopenharmony_ci
136e41f4b71Sopenharmony_ci![en-us_image_0000001276003481](figures/en-us_image_0000001276003481.gif)
137e41f4b71Sopenharmony_ci
138e41f4b71Sopenharmony_ci> **NOTE**
139e41f4b71Sopenharmony_ci> - If the **duration** attribute is set in the **images** attribute, the **duration** attribute set in the **&lt;image-animator&gt;** component is invalid.
140e41f4b71Sopenharmony_ci> 
141e41f4b71Sopenharmony_ci> - If **fixedsize** is set to **true**, the **width**, **height**, **top**, and **left** settings in **images** will not take effect.
142e41f4b71Sopenharmony_ci> 
143e41f4b71Sopenharmony_ci> - Setting **reverse** to **false** indicates that images are played from the first one to the last one. Setting **reverse** to **true** indicates that images are played from the last one to the first one.
144e41f4b71Sopenharmony_ci
145e41f4b71Sopenharmony_ci
146e41f4b71Sopenharmony_ci## Binding Events
147e41f4b71Sopenharmony_ci
148e41f4b71Sopenharmony_ciAdd the start, pause, stop, and resume events to the **&lt;image-animator&gt;** component. Specifically, the start event is triggered when the image animator starts playing; the pause event is triggered when the image animator is clicked; the resume event is triggered when the image animator is pressed and held; the stop event is triggered when the image animator stops playing.
149e41f4b71Sopenharmony_ci
150e41f4b71Sopenharmony_ci
151e41f4b71Sopenharmony_ci```html
152e41f4b71Sopenharmony_ci<!-- xxx.hml -->
153e41f4b71Sopenharmony_ci<div class="doc-page">
154e41f4b71Sopenharmony_ci  <image-animator class="img" id="img" images="{{imginfo}}" iteration="1" duration="10s" onstart="popstart" onpause="poppause"   onstop="popstop" onresume="popresume" onlongpress="setresume" onclick="setpause">
155e41f4b71Sopenharmony_ci  </image-animator>
156e41f4b71Sopenharmony_ci</div>
157e41f4b71Sopenharmony_ci```
158e41f4b71Sopenharmony_ci
159e41f4b71Sopenharmony_ci
160e41f4b71Sopenharmony_ci```css
161e41f4b71Sopenharmony_ci/* xxx.css */
162e41f4b71Sopenharmony_ci.doc-page {
163e41f4b71Sopenharmony_ci  width: 100%;
164e41f4b71Sopenharmony_ci  height: 100%;
165e41f4b71Sopenharmony_ci  flex-direction: column;
166e41f4b71Sopenharmony_ci  align-items: center;
167e41f4b71Sopenharmony_ci  justify-content: center;
168e41f4b71Sopenharmony_ci   background-color: #F1F3F5;
169e41f4b71Sopenharmony_ci}
170e41f4b71Sopenharmony_ci.img {
171e41f4b71Sopenharmony_ci  width: 600px;
172e41f4b71Sopenharmony_ci  height: 600px;
173e41f4b71Sopenharmony_ci  border: 3px solid orange;
174e41f4b71Sopenharmony_ci}
175e41f4b71Sopenharmony_ci```
176e41f4b71Sopenharmony_ci
177e41f4b71Sopenharmony_ci
178e41f4b71Sopenharmony_ci```js
179e41f4b71Sopenharmony_ci// index.js
180e41f4b71Sopenharmony_ciimport promptAction from '@ohos.promptAction';
181e41f4b71Sopenharmony_ciexport default {
182e41f4b71Sopenharmony_ci  data: {
183e41f4b71Sopenharmony_ci    imginfo: [
184e41f4b71Sopenharmony_ci      {
185e41f4b71Sopenharmony_ci        src: 'common/landscape1.jpg',
186e41f4b71Sopenharmony_ci      },{
187e41f4b71Sopenharmony_ci        src: 'common/landscape2.jpg',
188e41f4b71Sopenharmony_ci      },{
189e41f4b71Sopenharmony_ci        src: 'common/landscape3.jpg',
190e41f4b71Sopenharmony_ci      },{
191e41f4b71Sopenharmony_ci        src: 'common/landscape4.jpg',
192e41f4b71Sopenharmony_ci      }
193e41f4b71Sopenharmony_ci    ],
194e41f4b71Sopenharmony_ci  },
195e41f4b71Sopenharmony_ci  onInit() {
196e41f4b71Sopenharmony_ci  },
197e41f4b71Sopenharmony_ci  setpause(e) {
198e41f4b71Sopenharmony_ci    this.$element('img').pause()
199e41f4b71Sopenharmony_ci  },
200e41f4b71Sopenharmony_ci  setresume(e) {
201e41f4b71Sopenharmony_ci    this.$element('img').resume()
202e41f4b71Sopenharmony_ci  },
203e41f4b71Sopenharmony_ci  popstart(e) {
204e41f4b71Sopenharmony_ci    promptAction.showToast({
205e41f4b71Sopenharmony_ci      message: 'Started.'
206e41f4b71Sopenharmony_ci    })
207e41f4b71Sopenharmony_ci  },
208e41f4b71Sopenharmony_ci  poppause(e) {
209e41f4b71Sopenharmony_ci    promptAction.showToast({
210e41f4b71Sopenharmony_ci      message: 'Paused.'
211e41f4b71Sopenharmony_ci    })
212e41f4b71Sopenharmony_ci  },
213e41f4b71Sopenharmony_ci  popstop(e) {
214e41f4b71Sopenharmony_ci    promptAction.showToast({
215e41f4b71Sopenharmony_ci      message: 'Stopped.'
216e41f4b71Sopenharmony_ci    })
217e41f4b71Sopenharmony_ci  },
218e41f4b71Sopenharmony_ci  popresume(e) {
219e41f4b71Sopenharmony_ci    promptAction.showToast({
220e41f4b71Sopenharmony_ci      message: 'Resumed.'
221e41f4b71Sopenharmony_ci    })
222e41f4b71Sopenharmony_ci  }
223e41f4b71Sopenharmony_ci}
224e41f4b71Sopenharmony_ci```
225e41f4b71Sopenharmony_ci
226e41f4b71Sopenharmony_ci![en-us_image_0000001231843076](figures/en-us_image_0000001231843076.gif)
227e41f4b71Sopenharmony_ci
228e41f4b71Sopenharmony_ci
229e41f4b71Sopenharmony_ci## Example Scenario
230e41f4b71Sopenharmony_ci
231e41f4b71Sopenharmony_ciYou can click the start or stop button to change the image animation status.
232e41f4b71Sopenharmony_ci
233e41f4b71Sopenharmony_ciCall the start, pause, stop, and resume methods to start, pause, stop, and resume the image animation, and call the **getState** method to check the image animation status.
234e41f4b71Sopenharmony_ci
235e41f4b71Sopenharmony_ci
236e41f4b71Sopenharmony_ci```html
237e41f4b71Sopenharmony_ci<!-- xxx.hml -->
238e41f4b71Sopenharmony_ci<div class="doc-page">
239e41f4b71Sopenharmony_ci  <image-animator class="img" id="img" images="{{imginfo}}" iteration="2" reverse="{{rev}}" duration="10s">
240e41f4b71Sopenharmony_ci  </image-animator>
241e41f4b71Sopenharmony_ci  <div style="width: 700px;height:450px;margin-top: 40px;flex-direction:column;justify-content:space-around;">
242e41f4b71Sopenharmony_ci    <div class="container">
243e41f4b71Sopenharmony_ci      <button type="capsule" value="Start" onclick="startimg"></button>
244e41f4b71Sopenharmony_ci      <button type="capsule" value="Pause" onclick="pauseimg"></button>
245e41f4b71Sopenharmony_ci    </div>
246e41f4b71Sopenharmony_ci    <div class="container">
247e41f4b71Sopenharmony_ci      <button type="capsule" value="Stop" onclick="stopimg"></button>
248e41f4b71Sopenharmony_ci      <button type="capsule" value="Resume" onclick="resumeimg"></button>
249e41f4b71Sopenharmony_ci    </div>
250e41f4b71Sopenharmony_ci    <div class="container">
251e41f4b71Sopenharmony_ci      <button type="capsule" value="Get Status" onclick="getimgstate"></button>
252e41f4b71Sopenharmony_ci      <button type="capsule" value="{{revVal}}" onclick="revimg"></button>
253e41f4b71Sopenharmony_ci    </div>
254e41f4b71Sopenharmony_ci  </div>
255e41f4b71Sopenharmony_ci</div>
256e41f4b71Sopenharmony_ci```
257e41f4b71Sopenharmony_ci
258e41f4b71Sopenharmony_ci
259e41f4b71Sopenharmony_ci```css
260e41f4b71Sopenharmony_ci/* xxx.css */
261e41f4b71Sopenharmony_ci.doc-page {
262e41f4b71Sopenharmony_ci  width: 100%;
263e41f4b71Sopenharmony_ci  height: 100%;
264e41f4b71Sopenharmony_ci  flex-direction: column;
265e41f4b71Sopenharmony_ci  align-items: center;
266e41f4b71Sopenharmony_ci  justify-content: center;
267e41f4b71Sopenharmony_ci  background-color: #F1F3F5;
268e41f4b71Sopenharmony_ci}
269e41f4b71Sopenharmony_ci.img {
270e41f4b71Sopenharmony_ci  width: 600px;
271e41f4b71Sopenharmony_ci  height: 600px;
272e41f4b71Sopenharmony_ci  border: 3px solid orange;
273e41f4b71Sopenharmony_ci}
274e41f4b71Sopenharmony_cibutton{
275e41f4b71Sopenharmony_ci  width: 260px
276e41f4b71Sopenharmony_ci}
277e41f4b71Sopenharmony_ci.container {
278e41f4b71Sopenharmony_ci  width: 100%;
279e41f4b71Sopenharmony_ci  height: 120px;
280e41f4b71Sopenharmony_ci  align-items: center;
281e41f4b71Sopenharmony_ci  justify-content: space-around;
282e41f4b71Sopenharmony_ci}
283e41f4b71Sopenharmony_ci```
284e41f4b71Sopenharmony_ci
285e41f4b71Sopenharmony_ci
286e41f4b71Sopenharmony_ci```js
287e41f4b71Sopenharmony_ci// index.js
288e41f4b71Sopenharmony_ciimport promptAction from '@ohos.promptAction';
289e41f4b71Sopenharmony_ciexport default {
290e41f4b71Sopenharmony_ci  data: {
291e41f4b71Sopenharmony_ci    rev:false,
292e41f4b71Sopenharmony_ci    imginfo: [
293e41f4b71Sopenharmony_ci      {
294e41f4b71Sopenharmony_ci        src: 'common/landscape1.jpg',
295e41f4b71Sopenharmony_ci      },{
296e41f4b71Sopenharmony_ci        src: 'common/landscape2.jpg',
297e41f4b71Sopenharmony_ci      },{
298e41f4b71Sopenharmony_ci        src: 'common/landscape3.jpg',
299e41f4b71Sopenharmony_ci      },{
300e41f4b71Sopenharmony_ci        src: 'common/landscape4.jpg',
301e41f4b71Sopenharmony_ci      }
302e41f4b71Sopenharmony_ci    ],
303e41f4b71Sopenharmony_ci    revVal:'Reverse'
304e41f4b71Sopenharmony_ci  },
305e41f4b71Sopenharmony_ci  onInit() {
306e41f4b71Sopenharmony_ci  },
307e41f4b71Sopenharmony_ci  startimg(e) {
308e41f4b71Sopenharmony_ci    this.$element('img').start()
309e41f4b71Sopenharmony_ci  },
310e41f4b71Sopenharmony_ci  pauseimg(e) {
311e41f4b71Sopenharmony_ci    this.$element('img').pause()
312e41f4b71Sopenharmony_ci  },
313e41f4b71Sopenharmony_ci  stopimg(e) {
314e41f4b71Sopenharmony_ci    this.$element('img').stop()
315e41f4b71Sopenharmony_ci  },
316e41f4b71Sopenharmony_ci  resumeimg(e) {
317e41f4b71Sopenharmony_ci    this.$element('img').resume()
318e41f4b71Sopenharmony_ci  },
319e41f4b71Sopenharmony_ci  getimgstate(e) {
320e41f4b71Sopenharmony_ci    promptAction.showToast({
321e41f4b71Sopenharmony_ci      message: 'Current state:' + this.$element('img').getState()
322e41f4b71Sopenharmony_ci    })
323e41f4b71Sopenharmony_ci  },
324e41f4b71Sopenharmony_ci  revimg(e) {
325e41f4b71Sopenharmony_ci    this.rev = !this.rev
326e41f4b71Sopenharmony_ci    if (this.rev) {
327e41f4b71Sopenharmony_ci      this.revVal ='Play Forward'
328e41f4b71Sopenharmony_ci    } else {
329e41f4b71Sopenharmony_ci      this.revVal ='Reverse'
330e41f4b71Sopenharmony_ci    }
331e41f4b71Sopenharmony_ci  }
332e41f4b71Sopenharmony_ci}
333e41f4b71Sopenharmony_ci```
334e41f4b71Sopenharmony_ci
335e41f4b71Sopenharmony_ci![en-us_image_0000001276162717](figures/en-us_image_0000001276162717.gif)
336