ui-js-building-ui-animation.md 3.7 KB
Newer Older
Z
zengyawen 已提交
1
# 动画
M
mamingshuai 已提交
2

Z
zengyawen 已提交
3
动画分为[静态动画](#静态动画)[连续动画](#连续动画)
M
mamingshuai 已提交
4

Z
zengyawen 已提交
5 6

## 静态动画
M
mamingshuai 已提交
7 8 9

静态动画的核心是transform样式,主要可以实现以下三种变换类型,一次样式设置只能实现一种类型变换。

Z
zengyawen 已提交
10 11 12 13 14
- **translate**:沿水平或垂直方向将指定组件移动所需距离。

- **scale**:横向或纵向将指定组件缩小或放大到所需比例。

- **rotate**:将指定组件沿横轴或纵轴或中心点旋转指定的角度。
M
mamingshuai 已提交
15

Z
zengyawen 已提交
16
具体的使用示例如下,更多信息请参考[组件方法](../reference/arkui-js/js-components-common-methods.md)
M
mamingshuai 已提交
17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57

```
<!-- xxx.hml -->
<div class="container">
  <text class="translate">hello</text>
  <text class="rotate">hello</text>
  <text class="scale">hello</text>
</div>
```

```
/* xxx.css */
.container {
  flex-direction: column;
  align-items: center;
}
.translate {
  height: 150px;
  width: 300px;
  font-size: 50px;
  background-color: #008000;
  transform: translate(200px);
}
.rotate {
  height: 150px;
  width: 300px;
  font-size: 50px;
  background-color: #008000;
  transform-origin: 200px 100px;
  transform: rotateX(45deg);
}
.scale {
  height: 150px;
  width: 300px;
  font-size: 50px;
  background-color: #008000;
  transform: scaleX(1.5);
}
```


Z
zengyawen 已提交
58 59
**图1** 静态动画效果图
![zh-cn_image_0000001071134933](figures/zh-cn_image_0000001071134933.png)
Z
zengyawen 已提交
60 61 62


## 连续动画
M
mamingshuai 已提交
63 64 65 66 67

静态动画只有开始状态和结束状态,没有中间状态,如果需要设置中间的过渡状态和转换效果,需要使用连续动画实现。

连续动画的核心是animation样式,它定义了动画的开始状态、结束状态以及时间和速度的变化曲线。通过animation样式可以实现的效果有:

Z
zengyawen 已提交
68 69
- **animation-name**:设置动画执行后应用到组件上的背景颜色、透明度、宽高和变换类型。

Z
zengyawen 已提交
70
- **animation-delay****animation-duration**:分别设置动画执行后元素延迟和持续的时间。
Z
zengyawen 已提交
71 72 73 74 75 76

- **animation-timing-function**:描述动画执行的速度曲线,使动画更加平滑。

- **animation-iteration-count**:定义动画播放的次数。

- **animation-fill-mode**:指定动画执行结束后是否恢复初始状态。
M
mamingshuai 已提交
77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158

animation样式需要在css文件中先定义keyframe,在keyframe中设置动画的过渡效果,并通过一个样式类型在hml文件中调用。animation-name的使用示例如下:

```
<!-- xxx.hml -->
<div class="item-container">
  <text class="header">animation-name</text>
  <div class="item {{colorParam}}">
    <text class="txt">color</text>
  </div>
  <div class="item {{opacityParam}}">
    <text class="txt">opacity</text>
  </div>
  <input class="button" type="button" name="" value="show" onclick="showAnimation"/>
</div>
```

```
/* xxx.css */
.item-container {
  margin-right: 60px;
  margin-left: 60px;
  flex-direction: column;
}
.header {
  margin-bottom: 20px;
}
.item {
  background-color: #f76160;
}
.txt {
  text-align: center;
  width: 200px;
  height: 100px;
}
.button {
  width: 200px;
  font-size: 30px;
  background-color: #09ba07;
}
.color {
  animation-name: Color;
  animation-duration: 8000ms;
}
.opacity {
  animation-name: Opacity;
  animation-duration: 8000ms;
}
@keyframes Color {
  from {
    background-color: #f76160;
  }
  to {
    background-color: #09ba07;
  }
}
@keyframes Opacity {
  from {
    opacity: 0.9;
  }
  to {
    opacity: 0.1;
  }
}
```

```
// xxx.js
export default {
  data: {
    colorParam: '',
    opacityParam: '',
  },
  showAnimation: function () {
    this.colorParam = '';
    this.opacityParam = '';
    this.colorParam = 'color';
    this.opacityParam = 'opacity';
  },
}
```

Z
zengyawen 已提交
159 160
**图2** 连续动画效果图
![zh-cn_image_0000001063148757](figures/zh-cn_image_0000001063148757.gif)