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 54e41f4b71Sopenharmony_ci 55e41f4b71Sopenharmony_ci 56e41f4b71Sopenharmony_ci## Setting the <image-animator> 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 137e41f4b71Sopenharmony_ci 138e41f4b71Sopenharmony_ci> **NOTE** 139e41f4b71Sopenharmony_ci> - If the **duration** attribute is set in the **images** attribute, the **duration** attribute set in the **<image-animator>** 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 **<image-animator>** 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 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 336