js-apis-curve.md 13.0 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

Z
zengyawen 已提交
38

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

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


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

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

Z
zengyawen 已提交
51 52 53

构造阶梯曲线对象。

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

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

T
explain  
tianyu 已提交
58 59 60 61
| 参数名 | 类型    | 必填 | 说明                                                         |
| ------ | ------- | ----| ------------------------------------------------------------ |
| count  | number  | 是   | 阶梯的数量,需要为正整数。                                   |
| end    | boolean | 是   | 在每个间隔的起点或是终点发生阶跃变化。<br>-true:在终点发生阶跃变化。<br>-false:在起点发生阶跃变化。 |
Z
zengyawen 已提交
62

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

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


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

```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 已提交
81

Z
zengyawen 已提交
82 83 84

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

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

L
lanyill 已提交
87
**参数:**
T
explain  
tianyu 已提交
88 89 90 91 92 93
| 参数名  | 类型     | 必填   | 说明             |
| ---- | ------ | ---- | -------------- |
| x1   | number | 是    | 确定贝塞尔曲线第一点横坐标。 |
| y1   | number | 是    | 确定贝塞尔曲线第一点纵坐标。 |
| x2   | number | 是    | 确定贝塞尔曲线第二点横坐标。 |
| y2   | number | 是    | 确定贝塞尔曲线第二点纵坐标。 |
Z
zengyawen 已提交
94

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

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


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

```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 已提交
113

Z
zengyawen 已提交
114 115 116

构造弹簧曲线对象。

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

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


**返回值:**

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


**示例:**

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


H
hehongyang9 已提交
143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204
##  Curves.springMotion<sup>9+</sup>

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

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

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

**参数:**
| 参数名       | 类型     | 必填   | 说明    |
| --------- | ------ | ---- | ----- |
| response  | number | 否    | 弹簧自然振动周期,决定弹簧复位的速度。单位:秒,默认值:0.55。 |
| dampingFraction      | number | 否    | 阻尼系数。<br>0表示无阻尼,一直处于震荡状态;<br>大于0小于1的值为欠阻尼,运动过程中会超出目标值;<br>等于1为临界阻尼;<br>大于1为过阻尼,运动过程中逐渐趋于目标值。<br>默认值:0.825。 |
| overlapDuration | number | 否    | 弹性动画衔接时长。发生动画继承时,如果前后两个弹性动画response不一致,response参数会在overlapDuration时间内平滑过渡。单位:秒,默认值:0。 |


**返回值:**

| 类型                           | 说明             |
| ---------------------------------- | ---------------- |
|  [ICurve](#icurve)| 曲线对象。<br>**说明:** 弹性动画曲线为物理曲线,animation、animateTo中的duration参数不生效,动画持续时间取决于springMotion动画曲线参数和之前的速度。时间不能归一,故不能通过该曲线的[interpolate](#interpolate)函数获得插值。 |

**示例:**

```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

**参数:**
| 参数名       | 类型     | 必填   | 说明    |
| --------- | ------ | ---- | ----- |
| response  | number | 否    | 解释同springMotion中的response。单位:秒,默认值:0.15。 |
| dampingFraction      | number | 否    | 解释同springMotion中的dampingFraction。默认值:0.86。 |
| overlapDuration | number | 否    | 解释同springMotion中的overlapDuration。单位:秒,默认值:0.25。 |

**返回值:**

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

**示例:**

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


L
lanyill 已提交
205 206 207 208 209 210 211
## ICurve


### interpolate

interpolate(fraction:&nbsp;number): number

Z
zengyawen 已提交
212

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

Z
zhaoxinyu 已提交
215 216
**系统能力:**  SystemCapability.ArkUI.ArkUI.Full

L
lanyill 已提交
217
**参数:**
Z
zengyawen 已提交
218

L
lanyill 已提交
219 220 221 222 223 224 225 226 227 228 229
| 参数名   | 类型   | 必填 | 说明                                         |
| -------- | ------ | ---- | -------------------------------------------- |
| fraction | number | 是   | &nbsp;当前的归一化时间参数,有效值范围0到1。 |

**返回值:**

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

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

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

Z
zengyawen 已提交
237

L
lanyill 已提交
238 239 240 241 242 243 244
## Curves.init<sup>(deprecated)</sup>

init(curve?: Curve): string


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

Z
zhaoxinyu 已提交
245 246
**系统能力:**  SystemCapability.ArkUI.ArkUI.Full

L
lanyill 已提交
247 248 249 250
**参数:**

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


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

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

L
lanyill 已提交
258 259 260

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

Z
zhaoxinyu 已提交
261 262
**系统能力:**  SystemCapability.ArkUI.ArkUI.Full

L
lanyill 已提交
263 264
**参数:**

T
explain  
tianyu 已提交
265 266 267 268
| 参数名 | 类型    | 必填 | 说明                                                         |
| ------ | ------- | ----| ------------------------------------------------------------ |
| count  | number  | 是   | 阶梯的数量,需要为正整数。                                   |
| end    | boolean | 是   | 在每个间隔的起点或是终点发生阶跃变化。<br>-true:在终点发生阶跃变化。<br>-false:在起点发生阶跃变化。 |
L
lanyill 已提交
269 270 271 272 273 274 275 276 277


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

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


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

Z
zhaoxinyu 已提交
278
**系统能力:**  SystemCapability.ArkUI.ArkUI.Full
L
lanyill 已提交
279 280

**参数:**
T
explain  
tianyu 已提交
281 282 283 284 285 286
| 参数名  | 类型     | 必填   | 说明             |
| ---- | ------ | ---- | -------------- |
| x1   | number | 是    | 确定贝塞尔曲线第一点横坐标。 |
| y1   | number | 是    | 确定贝塞尔曲线第一点纵坐标。 |
| x2   | number | 是    | 确定贝塞尔曲线第二点横坐标。 |
| y2   | number | 是    | 确定贝塞尔曲线第二点纵坐标。 |
L
lanyill 已提交
287 288 289 290 291 292 293 294 295


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

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


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

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

L
lanyill 已提交
298 299 300 301 302 303 304 305 306
**参数:**

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

Z
zengyawen 已提交
307
## 整体示例
Z
zengyawen 已提交
308

H
geshi  
HelloCrease 已提交
309 310
```ts
// xxx.ets
Z
zengyawen 已提交
311 312 313 314 315 316
import Curves from '@ohos.curves'
@Entry
@Component
struct ImageComponent {
  @State widthSize: number = 200
  @State heightSize: number = 200
317

Z
zengyawen 已提交
318 319 320 321 322 323 324 325
  build() {
    Column() {
      Text()
        .margin({top:100})
        .width(this.widthSize)
        .height(this.heightSize)
        .backgroundColor(Color.Red)
        .onClick(()=> {
L
lanyill 已提交
326
          let curve = Curves.cubicBezierCurve(0.25, 0.1, 0.25, 1.0);
Z
zengyawen 已提交
327 328 329
          this.widthSize = curve.interpolate(0.5) * this.widthSize;
          this.heightSize = curve.interpolate(0.5) * this.heightSize;
        })
L
lanyill 已提交
330
        .animation({duration: 2000 , curve: Curves.stepsCurve(9, true)})
Z
zengyawen 已提交
331 332 333 334
    }.width("100%").height("100%")
  }
}
```
335

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