js-apis-curve.md 17.5 KB
Newer Older
Z
zengyawen 已提交
1
# @ohos.curves (插值计算)
Z
zengyawen 已提交
2

Z
zhaoxinyu 已提交
3
本模块提供设置动画插值曲线功能,用于构造阶梯曲线对象、构造三阶贝塞尔曲线对象和构造弹簧曲线对象。
T
explain  
tianyu 已提交
4

H
geshi  
HelloCrease 已提交
5
> **说明:**
Z
zhaoxinyu 已提交
6 7
> 
> 本模块首批接口从API Version 7开始支持。后续版本如有新增内容,则采用上角标单独标记该内容的起始版本。
Z
zengyawen 已提交
8

Z
zengyawen 已提交
9 10

## 导入模块
Z
zengyawen 已提交
11

12
```ts
L
lanyill 已提交
13
import Curves from '@ohos.curves'
Z
zengyawen 已提交
14 15
```

Z
zengyawen 已提交
16

L
lanyill 已提交
17
## Curves.initCurve<sup>9+</sup>
Z
zengyawen 已提交
18

L
lanyill 已提交
19
initCurve(curve?: Curve):ICurve
Z
zengyawen 已提交
20 21


L
lanyill 已提交
22
插值曲线的初始化函数,可以根据入参创建一个插值曲线对象。
Z
zengyawen 已提交
23

Z
zhaoxinyu 已提交
24 25
**系统能力:**  SystemCapability.ArkUI.ArkUI.Full

L
lanyill 已提交
26
**参数:**
Z
zengyawen 已提交
27

L
lanyill 已提交
28 29
| 参数名 | 类型                                                         | 必填 | 默认值       | 说明       |
| ------ | ------------------------------------------------------------ | ---- | ------------ | ---------- |
Z
zhaoxinyu 已提交
30
| curve  | [Curve](../arkui-ts/ts-appendix-enums.md#curve) | 否   | Curve.Linear | 曲线类型。 |
Z
zengyawen 已提交
31

L
lanyill 已提交
32 33 34 35 36
**返回值:**

| 类型                           | 说明             |
| ---------------------------------- | ---------------- |
|  [ICurve](#icurve) | 曲线的插值对象。 |
Z
zengyawen 已提交
37

L
lanyill 已提交
38
**示例:**
Z
zengyawen 已提交
39

L
lanyill 已提交
40 41 42 43
```ts
import Curves from '@ohos.curves'
Curves.initCurve(Curve.EaseIn) // 创建一个默认先慢后快插值曲线
```
Z
zengyawen 已提交
44 45


L
lanyill 已提交
46
##  Curves.stepsCurve<sup>9+</sup>
Z
zengyawen 已提交
47

L
lanyill 已提交
48
stepsCurve(count: number, end: boolean):ICurve
Z
zengyawen 已提交
49

Z
zengyawen 已提交
50 51 52

构造阶梯曲线对象。

Z
zhaoxinyu 已提交
53 54
**系统能力:**  SystemCapability.ArkUI.ArkUI.Full

L
lanyill 已提交
55
**参数:**
Z
zengyawen 已提交
56

T
explain  
tianyu 已提交
57 58
| 参数名 | 类型    | 必填 | 说明                                                         |
| ------ | ------- | ----| ------------------------------------------------------------ |
59
| count  | number  | 是   | 阶梯的数量,需要为正整数。<br/>取值范围:[0, +∞)<br/>**说明:** <br/>设置小于0的值时,按值为0处理。 |
Y
yamila 已提交
60
| end    | boolean | 是   | 在每个间隔的起点或是终点发生阶跃变化。<br>-true:在终点发生阶跃变化。<br>-false:在起点发生阶跃变化。 |
Z
zengyawen 已提交
61

L
lanyill 已提交
62
**返回值:**
Z
zengyawen 已提交
63

L
lanyill 已提交
64 65 66
| 类型                           | 说明             |
| ---------------------------------- | ---------------- |
|  [ICurve](#icurve) | 曲线的插值对象。 |
Z
zengyawen 已提交
67

L
lanyill 已提交
68 69 70 71 72 73 74 75 76 77 78
**示例:**

```ts
import Curves from '@ohos.curves'
Curves.stepsCurve(9, true)  //创建一个阶梯曲线
```


## Curves.cubicBezierCurve<sup>9+</sup>

cubicBezierCurve(x1: number, y1: number, x2: number, y2: number):ICurve
Z
zengyawen 已提交
79

Z
zengyawen 已提交
80 81 82

构造三阶贝塞尔曲线对象,曲线的值必须处于0-1之间。

Z
zhaoxinyu 已提交
83
**系统能力:**  SystemCapability.ArkUI.ArkUI.Full
Z
zengyawen 已提交
84

L
lanyill 已提交
85
**参数:**
Y
yamila 已提交
86 87 88

| 参数名 | 类型   | 必填 | 说明                                                         |
| ------ | ------ | ---- | ------------------------------------------------------------ |
89 90 91 92
| x1     | number | 是   | 确定贝塞尔曲线第一点横坐标。<br/>取值范围:[0, 1]<br/>**说明:** <br/>设置的值小于0时,按0处理;设置的值大于1时,按1处理。 |
| y1     | number | 是   | 确定贝塞尔曲线第一点纵坐标。<br/>取值范围:(-∞, +∞)          |
| x2     | number | 是   | 确定贝塞尔曲线第二点横坐标。<br/>取值范围:[0, 1]<br/>**说明:** <br/>设置的值小于0时,按0处理;设置的值大于1时,按1处理。 |
| y2     | number | 是   | 确定贝塞尔曲线第二点纵坐标。<br/>取值范围:(-∞, +∞)          |
Z
zengyawen 已提交
93

L
lanyill 已提交
94
**返回值:**
Z
zengyawen 已提交
95

L
lanyill 已提交
96 97 98
| 类型                           | 说明             |
| ---------------------------------- | ---------------- |
|  [ICurve](#icurve) | 曲线的插值对象。 |
Z
zengyawen 已提交
99 100


L
lanyill 已提交
101 102 103 104 105 106 107 108 109 110 111
**示例:**

```ts
import Curves from '@ohos.curves'
Curves.cubicBezierCurve(0.1, 0.0, 0.1, 1.0) // 创建一个三阶贝塞尔曲线
```


##  Curves.springCurve<sup>9+</sup>

springCurve(velocity: number, mass: number, stiffness: number, damping: number):ICurve
Z
zengyawen 已提交
112

Z
zengyawen 已提交
113

W
w00808516 已提交
114
构造弹簧曲线对象,曲线形状由弹簧参数决定,动画时长受animation、animateTo中的duration参数控制。
Z
zengyawen 已提交
115

Z
zhaoxinyu 已提交
116
**系统能力:**  SystemCapability.ArkUI.ArkUI.Full
Z
zengyawen 已提交
117

L
lanyill 已提交
118
**参数:**
Y
yamila 已提交
119 120
| 参数名    | 类型   | 必填 | 说明                                                         |
| --------- | ------ | ---- | ------------------------------------------------------------ |
121 122 123 124
| velocity  | number | 是   | 初始速度。是由外部因素对弹性动效产生的影响参数,其目的是保证对象从之前的运动状态平滑的过渡到弹性动效。<br/>取值范围:(-∞, +∞) |
| mass      | number | 是   | 质量。弹性系统的受力对象,会对弹性系统产生惯性影响。质量越大,震荡的幅度越大,恢复到平衡位置的速度越慢。<br/>取值范围:(0, +∞)<br/>**说明:** <br/>设置的值小于0时,按1处理。 |
| stiffness | number | 是   | 刚度。是物体抵抗施加的力而形变的程度。在弹性系统中,刚度越大,抵抗变形的能力越强,恢复到平衡位置的速度就越快。<br/>取值范围:(0, +∞)<br/>**说明:** <br/>设置的值小于0时,按1处理。 |
| damping   | number | 是   | 阻尼。是一个纯数,无真实的物理意义,用于描述系统在受到扰动后震荡及衰减的情形。阻尼越大,弹性运动的震荡次数越少、震荡幅度越小。<br/>取值范围:(0, +∞)<br/>**说明:** <br/>设置的值小于0时,按1处理。 |
L
lanyill 已提交
125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141


**返回值:**

| 类型                           | 说明             |
| ---------------------------------- | ---------------- |
|  [ICurve](#icurve)| 曲线的插值对象。 |


**示例:**

```ts
import Curves from '@ohos.curves'
Curves.springCurve(100, 1, 228, 30) // 创建一个弹簧插值曲线
```


H
hehongyang9 已提交
142 143 144 145 146 147 148 149 150
##  Curves.springMotion<sup>9+</sup>

springMotion(response?: number, dampingFraction?: number, overlapDuration?: number): ICurve

构造弹性动画曲线对象。如果对同一对象的同一属性进行多个弹性动画,每个动画会替换掉前一个动画,并继承之前的速度。

**系统能力:**  SystemCapability.ArkUI.ArkUI.Full

**参数:**
Y
yamila 已提交
151

H
hehongyang9 已提交
152 153
| 参数名       | 类型     | 必填   | 说明    |
| --------- | ------ | ---- | ----- |
154 155 156
| response  | number | 否    | 弹簧自然振动周期,决定弹簧复位的速度。<br>默认值:0.55<br/>单位:秒<br/>取值范围:[0, +∞)<br/>**说明:** <br/>设置小于0的值时,按默认值0.55处理。 |
| dampingFraction      | number | 否    | 阻尼系数。<br>0表示无阻尼,一直处于震荡状态;<br>大于0小于1的值为欠阻尼,运动过程中会超出目标值;<br>等于1为临界阻尼;<br>大于1为过阻尼,运动过程中逐渐趋于目标值。<br>默认值:0.825<br/>单位:秒<br/>取值范围:[0, +∞)<br/>**说明:** <br/>设置小于0的值时,按默认值0.55处理。 |
| overlapDuration | number | 否    | 弹性动画衔接时长。发生动画继承时,如果前后两个弹性动画response不一致,response参数会在overlapDuration时间内平滑过渡。<br/>默认值:0<br/>单位:秒<br/>取值范围:[0, +∞)。<br/>**说明:** <br/>设置小于0的值时,按默认值0处理。<br>弹性动画曲线为物理曲线,[animation](../arkui-ts/ts-animatorproperty.md)[animateTo](../arkui-ts/ts-explicit-animation.md)中的duration参数不生效,动画持续时间取决于springMotion动画曲线参数和之前的速度。时间不能归一,故不能通过该曲线的interpolate函数获得插值。 |
H
hehongyang9 已提交
157 158 159 160 161 162


**返回值:**

| 类型                           | 说明             |
| ---------------------------------- | ---------------- |
163
|  [ICurve](#icurve)| 曲线对象。<br>**说明:** 弹性动画曲线为物理曲线,[animation](../arkui-ts/ts-animatorproperty.md)[animateTo](../arkui-ts/ts-explicit-animation.md)中的duration参数不生效,动画持续时间取决于springMotion动画曲线参数和之前的速度。时间不能归一,故不能通过该曲线的[interpolate](#interpolate)函数获得插值。 |
H
hehongyang9 已提交
164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184

**示例:**

```ts
import Curves from '@ohos.curves'
Curves.springMotion() // 创建一个默认弹性动画曲线
Curves.springMotion(0.5) // 创建指定response、其余参数默认的弹性动画曲线
Curves.springMotion(0.5, 0.6) // 创建指定response和dampingFraction、其余参数默认的弹性动画曲线
Curves.springMotion(0.5, 0.6, 0) // 创建三个参数均自定义的弹性动画曲线
```


##  Curves.responsiveSpringMotion<sup>9+</sup>

responsiveSpringMotion(response?: number, dampingFraction?: number, overlapDuration?: number): ICurve

构造弹性跟手动画曲线对象,是[springMotion](#curvesspringmotion9)的一种特例,仅默认参数不同,可与springMotion混合使用。

**系统能力:**  SystemCapability.ArkUI.ArkUI.Full

**参数:**
Y
yamila 已提交
185

H
hehongyang9 已提交
186 187
| 参数名       | 类型     | 必填   | 说明    |
| --------- | ------ | ---- | ----- |
188 189 190
| response  | number | 否    | 解释同springMotion中的response。<br/>默认值:0.15<br/>单位:秒<br/>取值范围:[0, +∞)<br/>**说明:** <br/>设置小于0的值时,按默认值0.15处理。 |
| dampingFraction      | number | 否    | 解释同springMotion中的dampingFraction。<br/>默认值:0.86<br/>单位:秒<br/>取值范围:[0, +∞)<br/>**说明:** <br/>设置小于0的值时,按默认值0.86处理。 |
| overlapDuration | number | 否    | 解释同springMotion中的overlapDuration。<br/>默认值:0.25<br/>单位:秒<br/>取值范围:[0, +∞)<br/>**说明:** <br/>设置小于0的值时,按默认值0.25处理。<br/>弹性跟手动画曲线为springMotion的一种特例,仅默认值不同。如果使用自定义参数的弹性曲线,推荐使用springMotion构造曲线。如果使用跟手动画,推荐使用默认参数的弹性跟手动画曲线。<br/>[animation](../arkui-ts/ts-animatorproperty.md)[animateTo](../arkui-ts/ts-explicit-animation.md)中的duration参数不生效,动画持续时间取决于responsiveSpringMotion动画曲线参数和之前的速度,也不能通过该曲线的interpolate函数获得插值。 |
H
hehongyang9 已提交
191 192 193 194 195

**返回值:**

| 类型                           | 说明             |
| ---------------------------------- | ---------------- |
196
|  [ICurve](#icurve)| 曲线对象。<br>**说明:** <br>1、弹性跟手动画曲线为springMotion的一种特例,仅默认值不同。如果使用自定义参数的弹性曲线,推荐使用springMotion构造曲线;如果使用跟手动画,推荐使用默认参数的弹性跟手动画曲线。<br>2、[animation](../arkui-ts/ts-animatorproperty.md)[animateTo](../arkui-ts/ts-explicit-animation.md)中的duration参数不生效,动画持续时间取决于responsiveSpringMotion动画曲线参数和之前的速度,也不能通过该曲线的[interpolate](#interpolate)函数获得插值。 |
H
hehongyang9 已提交
197 198 199 200 201 202 203 204 205

**示例:**

```ts
import Curves from '@ohos.curves'
Curves.responsiveSpringMotion() // 创建一个默认弹性跟手动画曲线
```


206 207 208 209 210
##  Curves.interpolatingSpringCurve<sup>10+</sup>

interpolatingSpring(velocity: number, mass: number, stiffness: number, damping: number):ICurve


W
w00808516 已提交
211
构造插值器弹簧曲线对象,生成一条从0到1的动画曲线,实际动画值根据曲线进行插值计算。动画时间由曲线参数决定,不受animation、animateTo中的duration参数控制。
212 213 214 215 216 217

**系统能力:**  SystemCapability.ArkUI.ArkUI.Full

**参数:**
| 参数名       | 类型     | 必填   | 说明    |
| --------- | ------ | ---- | ----- |
218
| velocity  | number | 是    | 初始速度。外部因素对弹性动效产生的影响参数,目的是保证对象从之前的运动状态平滑的过渡到弹性动效。该速度是归一化速度,其值等于动画开始时的实际速度除以动画属性改变值。 |
219
| mass      | number | 是    | 质量。弹性系统的受力对象,会对弹性系统产生惯性影响。质量越大,震荡的幅度越大,恢复到平衡位置的速度越慢。 |
220
| stiffness | number | 是    | 刚度。表示物体抵抗施加的力而形变的程度。刚度越大,抵抗变形的能力越强,恢复到平衡位置的速度越快。 |
221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238
| damping   | number | 是    | 阻尼。是一个纯数,无真实的物理意义,用于描述系统在受到扰动后震荡及衰减的情形。阻尼越大,弹性运动的震荡次数越少、震荡幅度越小。 |


**返回值:**

| 类型                           | 说明             |
| ---------------------------------- | ---------------- |
|  [ICurve](#icurve)| 曲线的插值对象。 |


**示例:**

```ts
import Curves from '@ohos.curves'
Curves.interpolatingSpring(100, 1, 228, 30) // 创建一个时长由弹簧参数决定的弹簧插值曲线
```


L
lanyill 已提交
239 240 241 242 243 244 245 246
## ICurve


### interpolate

interpolate(fraction:&nbsp;number): number

插值曲线的插值计算函数,可以通过传入的归一化时间参数返回当前的插值
Z
zengyawen 已提交
247

248 249
从API version 9开始,该接口支持在ArkTS卡片中使用。

Z
zhaoxinyu 已提交
250 251
**系统能力:**  SystemCapability.ArkUI.ArkUI.Full

L
lanyill 已提交
252
**参数:**
Z
zengyawen 已提交
253

Y
yamila 已提交
254 255
| 参数名   | 类型   | 必填 | 说明                                                         |
| -------- | ------ | ---- | ------------------------------------------------------------ |
256
| fraction | number | 是   | 当前的归一化时间参数。<br/>取值范围:[0,1]<br/>**说明:** <br/>设置的值小于0时,按0处理;设置的值大于1时,按1处理。 |
L
lanyill 已提交
257 258 259 260 261 262 263 264

**返回值:**

| 类型   | 说明                                 |
| ------ | ------------------------------------ |
| number | 返回归一化time时间点对应的曲线插值。 |

**示例:**
Z
zengyawen 已提交
265

H
geshi  
HelloCrease 已提交
266
```ts
Z
zengyawen 已提交
267
import Curves from '@ohos.curves'
L
lanyill 已提交
268 269
let curve = Curves.initCurve(Curve.EaseIn) // 创建一个默认先慢后快插值曲线
let value: number = curve.interpolate(0.5) // 计算得到时间到一半时的插值
Z
zengyawen 已提交
270 271
```

Z
zengyawen 已提交
272

L
lanyill 已提交
273 274 275 276 277 278 279
## Curves.init<sup>(deprecated)</sup>

init(curve?: Curve): string


插值曲线的初始化函数,可以根据入参创建一个插值曲线对象,从API version9开始废弃,推荐使用[Curves.initCurve](#curvesinitcurve9)

Z
zhaoxinyu 已提交
280 281
**系统能力:**  SystemCapability.ArkUI.ArkUI.Full

L
lanyill 已提交
282 283 284 285
**参数:**

| 参数名 | 类型                                                         | 必填 | 默认值       | 说明       |
| ------ | ------------------------------------------------------------ | ---- | ------------ | ---------- |
Z
zhaoxinyu 已提交
286
| curve  |[Curve](../arkui-ts/ts-appendix-enums.md#curve) | 否   | Curve.Linear | 曲线类型。 |
L
lanyill 已提交
287 288 289


## Curves.steps<sup>(deprecated)</sup>
Z
zengyawen 已提交
290

L
lanyill 已提交
291
steps(count: number, end: boolean): string
Z
zengyawen 已提交
292

L
lanyill 已提交
293 294 295

构造阶梯曲线对象,从API version9开始废弃,推荐使用[Curves. stepsCurve](# curvesstepscurve9)

Z
zhaoxinyu 已提交
296 297
**系统能力:**  SystemCapability.ArkUI.ArkUI.Full

L
lanyill 已提交
298 299
**参数:**

T
explain  
tianyu 已提交
300 301 302
| 参数名 | 类型    | 必填 | 说明                                                         |
| ------ | ------- | ----| ------------------------------------------------------------ |
| count  | number  | 是   | 阶梯的数量,需要为正整数。                                   |
Y
yamila 已提交
303
| end    | boolean | 是   | 在每个间隔的起点或是终点发生阶跃变化。<br>-true:在终点发生阶跃变化。<br>-false:在起点发生阶跃变化。 |
L
lanyill 已提交
304 305 306 307 308 309 310 311 312


## Curves.cubicBezier<sup>(deprecated)</sup>

cubicBezier(x1: number, y1: number, x2: number, y2: number): string


构造三阶贝塞尔曲线对象,曲线的值必须处于0-1之间,API version9开始废弃,推荐使用 [Curves.cubicBezierCurve](#curvescubicbeziercurve9)

Z
zhaoxinyu 已提交
313
**系统能力:**  SystemCapability.ArkUI.ArkUI.Full
L
lanyill 已提交
314 315

**参数:**
T
explain  
tianyu 已提交
316 317 318 319 320 321
| 参数名  | 类型     | 必填   | 说明             |
| ---- | ------ | ---- | -------------- |
| x1   | number | 是    | 确定贝塞尔曲线第一点横坐标。 |
| y1   | number | 是    | 确定贝塞尔曲线第一点纵坐标。 |
| x2   | number | 是    | 确定贝塞尔曲线第二点横坐标。 |
| y2   | number | 是    | 确定贝塞尔曲线第二点纵坐标。 |
L
lanyill 已提交
322 323 324 325 326 327 328 329 330


## Curves.spring<sup>(deprecated)</sup>

spring(velocity: number, mass: number, stiffness: number, damping: number): string


构造弹簧曲线对象,从API version9开始废弃,推荐使用[Curves.springCurve](#curvesspringcurve9)

Z
zhaoxinyu 已提交
331 332
**系统能力:**  SystemCapability.ArkUI.ArkUI.Full

L
lanyill 已提交
333 334 335 336 337 338 339 340 341
**参数:**

| 参数名       | 类型     | 必填   | 说明    |
| --------- | ------ | ---- | ----- |
| velocity  | number | 是    | 初始速度。是由外部因素对弹性动效产生的影响参数,其目的是保证对象从之前的运动状态平滑的过渡到弹性动效。 |
| mass      | number | 是    | 质量。弹性系统的受力对象,会对弹性系统产生惯性影响。质量越大,震荡的幅度越大,恢复到平衡位置的速度越慢。 |
| stiffness | number | 是    | 刚度。是物体抵抗施加的力而形变的程度。在弹性系统中,刚度越大,抵抗变形的能力越强,恢复到平衡位置的速度就越快。 |
| damping   | number | 是    | 阻尼。是一个纯数,无真实的物理意义,用于描述系统在受到扰动后震荡及衰减的情形。阻尼越大,弹性运动的震荡次数越少、震荡幅度越小。 |

Z
zengyawen 已提交
342
## 整体示例
Z
zengyawen 已提交
343

H
geshi  
HelloCrease 已提交
344 345
```ts
// xxx.ets
Z
zengyawen 已提交
346
import Curves from '@ohos.curves'
Y
yamila 已提交
347

Z
zengyawen 已提交
348 349 350 351 352
@Entry
@Component
struct ImageComponent {
  @State widthSize: number = 200
  @State heightSize: number = 200
353

Z
zengyawen 已提交
354 355 356
  build() {
    Column() {
      Text()
Y
yamila 已提交
357
        .margin({ top: 100 })
Z
zengyawen 已提交
358 359 360
        .width(this.widthSize)
        .height(this.heightSize)
        .backgroundColor(Color.Red)
Y
yamila 已提交
361
        .onClick(() => {
L
lanyill 已提交
362
          let curve = Curves.cubicBezierCurve(0.25, 0.1, 0.25, 1.0);
Z
zengyawen 已提交
363 364 365
          this.widthSize = curve.interpolate(0.5) * this.widthSize;
          this.heightSize = curve.interpolate(0.5) * this.heightSize;
        })
Y
yamila 已提交
366
        .animation({ duration: 2000, curve: Curves.stepsCurve(9, true) })
Z
zengyawen 已提交
367 368 369 370
    }.width("100%").height("100%")
  }
}
```
371

Z
zengyawen 已提交
372
![zh-cn_image_0000001174104410](figures/zh-cn_image_0000001174104410.gif)