• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1# @ohos.curves (插值计算)
2
3本模块提供设置动画插值曲线功能,用于构造阶梯曲线对象、构造三阶贝塞尔曲线对象和构造弹簧曲线对象。
4
5> **说明:**
6>
7> 本模块首批接口从API Version 7开始支持。后续版本如有新增内容,则采用上角标单独标记该内容的起始版本。
8
9
10## 导入模块
11
12```ts
13import Curves from '@ohos.curves'
14```
15
16
17## Curves.initCurve<sup>9+</sup>
18
19initCurve(curve?: Curve): ICurve
20
21
22插值曲线的初始化函数,可以根据入参创建一个插值曲线对象。
23
24**系统能力:**  SystemCapability.ArkUI.ArkUI.Full
25
26**参数:**
27
28| 参数名 | 类型            | 必填 | 说明                                |
29| ------ | --------------- | ---- | ----------------------------------- |
30| curve  | [Curve](#curve) | 否   | 曲线类型。<br/>默认值:Curve.Linear |
31
32**返回值:**
33
34| 类型                           | 说明             |
35| ---------------------------------- | ---------------- |
36|  [ICurve](#icurve) | 曲线的插值对象。 |
37
38## Curve
39
40从API version 9开始,该接口支持在ArkTS卡片中使用。
41
42**系统能力:**  SystemCapability.ArkUI.ArkUI.Full
43
44| 名称                | 说明                                                         |
45| ------------------- | ------------------------------------------------------------ |
46| Linear              | 表示动画从头到尾的速度都是相同的。                           |
47| Ease                | 表示动画以低速开始,然后加快,在结束前变慢,CubicBezier(0.25, 0.1, 0.25, 1.0)。 |
48| EaseIn              | 表示动画以低速开始,CubicBezier(0.42, 0.0, 1.0, 1.0)。       |
49| EaseOut             | 表示动画以低速结束,CubicBezier(0.0, 0.0, 0.58, 1.0)。       |
50| EaseInOut           | 表示动画以低速开始和结束,CubicBezier(0.42, 0.0, 0.58, 1.0)。 |
51| FastOutSlowIn       | 标准曲线,cubic-bezier(0.4, 0.0, 0.2, 1.0)。                 |
52| LinearOutSlowIn     | 减速曲线,cubic-bezier(0.0, 0.0, 0.2, 1.0)。                 |
53| FastOutLinearIn     | 加速曲线,cubic-bezier(0.4, 0.0, 1.0, 1.0)。                 |
54| ExtremeDeceleration | 急缓曲线,cubic-bezier(0.0, 0.0, 0.0, 1.0)。                 |
55| Sharp               | 锐利曲线,cubic-bezier(0.33, 0.0, 0.67, 1.0)。               |
56| Rhythm              | 节奏曲线,cubic-bezier(0.7, 0.0, 0.2, 1.0)。                 |
57| Smooth              | 平滑曲线,cubic-bezier(0.4, 0.0, 0.4, 1.0)。                 |
58| Friction            | 阻尼曲线,CubicBezier(0.2, 0.0, 0.2, 1.0)。                  |
59
60**示例:**
61
62```ts
63import Curves from '@ohos.curves'
64Curves.initCurve(Curve.EaseIn) // 创建一个默认先慢后快插值曲线
65```
66
67
68##  Curves.stepsCurve<sup>9+</sup>
69
70stepsCurve(count: number, end: boolean): ICurve
71
72
73构造阶梯曲线对象。
74
75**系统能力:**  SystemCapability.ArkUI.ArkUI.Full
76
77**参数:**
78
79| 参数名 | 类型    | 必填 | 说明                                                         |
80| ------ | ------- | ----| ------------------------------------------------------------ |
81| count  | number  | 是   | 阶梯的数量,需要为正整数。<br/>取值范围:[1, +∞)<br/>**说明:** <br/>设置小于1的值时,按值为1处理。 |
82| end    | boolean | 是   | 在每个间隔的起点或是终点发生阶跃变化。<br>-true:在终点发生阶跃变化。<br>-false:在起点发生阶跃变化。 |
83
84**返回值:**
85
86| 类型                           | 说明             |
87| ---------------------------------- | ---------------- |
88|  [ICurve](#icurve) | 曲线的插值对象。 |
89
90**示例:**
91
92```ts
93import Curves from '@ohos.curves'
94Curves.stepsCurve(9, true)  //创建一个阶梯曲线
95```
96
97
98## Curves.cubicBezierCurve<sup>9+</sup>
99
100cubicBezierCurve(x1: number, y1: number, x2: number, y2: number): ICurve
101
102
103构造三阶贝塞尔曲线对象,曲线的值必须处于0-1之间。
104
105**系统能力:**  SystemCapability.ArkUI.ArkUI.Full
106
107**参数:**
108
109| 参数名 | 类型   | 必填 | 说明                                                         |
110| ------ | ------ | ---- | ------------------------------------------------------------ |
111| x1     | number | 是   | 确定贝塞尔曲线第一点横坐标。<br/>取值范围:[0, 1]<br/>**说明:** <br/>设置的值小于0时,按0处理;设置的值大于1时,按1处理。 |
112| y1     | number | 是   | 确定贝塞尔曲线第一点纵坐标。<br/>取值范围:(-∞, +∞)          |
113| x2     | number | 是   | 确定贝塞尔曲线第二点横坐标。<br/>取值范围:[0, 1]<br/>**说明:** <br/>设置的值小于0时,按0处理;设置的值大于1时,按1处理。 |
114| y2     | number | 是   | 确定贝塞尔曲线第二点纵坐标。<br/>取值范围:(-∞, +∞)          |
115
116**返回值:**
117
118| 类型                           | 说明             |
119| ---------------------------------- | ---------------- |
120|  [ICurve](#icurve) | 曲线的插值对象。 |
121
122
123**示例:**
124
125```ts
126import Curves from '@ohos.curves'
127Curves.cubicBezierCurve(0.1, 0.0, 0.1, 1.0) // 创建一个三阶贝塞尔曲线
128```
129
130
131##  Curves.springCurve<sup>9+</sup>
132
133springCurve(velocity: number, mass: number, stiffness: number, damping: number): ICurve
134
135
136构造弹簧曲线对象,曲线形状由弹簧参数决定,动画时长受animation、animateTo中的duration参数控制。
137
138**系统能力:**  SystemCapability.ArkUI.ArkUI.Full
139
140**参数:**
141| 参数名    | 类型   | 必填 | 说明                                                         |
142| --------- | ------ | ---- | ------------------------------------------------------------ |
143| velocity  | number | 是   | 初始速度。是由外部因素对弹性动效产生的影响参数,其目的是保证对象从之前的运动状态平滑的过渡到弹性动效。该速度是归一化速度,其值等于动画开始时的实际速度除以动画属性改变值。<br/>取值范围:(-∞, +∞) |
144| mass      | number | 是   | 质量。弹性系统的受力对象,会对弹性系统产生惯性影响。质量越大,震荡的幅度越大,恢复到平衡位置的速度越慢。<br/>取值范围:(0, +∞)<br/>**说明:** <br/>设置的值小于等于0时,按1处理。 |
145| stiffness | number | 是   | 刚度。是物体抵抗施加的力而形变的程度。在弹性系统中,刚度越大,抵抗变形的能力越强,恢复到平衡位置的速度就越快。<br/>取值范围:(0, +∞)<br/>**说明:** <br/>设置的值小于等于0时,按1处理。 |
146| damping   | number | 是   | 阻尼。用于描述系统在受到扰动后震荡及衰减的情形。阻尼越大,弹性运动的震荡次数越少、震荡幅度越小。<br/>取值范围:(0, +∞)<br/>**说明:** <br/>设置的值小于等于0时,按1处理。 |
147
148
149**返回值:**
150
151| 类型                           | 说明             |
152| ---------------------------------- | ---------------- |
153|  [ICurve](#icurve)| 曲线的插值对象。 |
154
155
156**示例:**
157
158```ts
159import Curves from '@ohos.curves'
160Curves.springCurve(10, 1, 228, 30) // 创建一个弹簧插值曲线
161```
162
163
164##  Curves.springMotion<sup>9+</sup>
165
166springMotion(response?: number, dampingFraction?: number, overlapDuration?: number): ICurve
167
168构造弹性动画曲线对象。如果对同一对象的同一属性进行多个弹性动画,每个动画会替换掉前一个动画,并继承之前的速度。
169
170**系统能力:**  SystemCapability.ArkUI.ArkUI.Full
171
172**参数:**
173
174| 参数名       | 类型     | 必填   | 说明    |
175| --------- | ------ | ---- | ----- |
176| response  | number | 否    | 弹簧自然振动周期,决定弹簧复位的速度。<br>默认值:0.55<br/>单位:秒<br/>取值范围:(0, +∞)<br/>**说明:** <br/>设置小于等于0的值时,按默认值0.55处理。 |
177| dampingFraction      | number | 否    | 阻尼系数。<br>0表示无阻尼,一直处于震荡状态;<br>大于0小于1的值为欠阻尼,运动过程中会超出目标值;<br>等于1为临界阻尼;<br>大于1为过阻尼,运动过程中逐渐趋于目标值。<br>默认值:0.825<br/>单位:秒<br/>取值范围:[0, +∞)<br/>**说明:** <br/>设置小于0的值时,按默认值0.825处理。 |
178| 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函数获得插值。 |
179
180
181**返回值:**
182
183| 类型                           | 说明             |
184| ---------------------------------- | ---------------- |
185|  [ICurve](#icurve)| 曲线对象。<br>**说明:** 弹性动画曲线为物理曲线,[animation](../arkui-ts/ts-animatorproperty.md)、[animateTo](../arkui-ts/ts-explicit-animation.md)、[pageTransition](../arkui-ts/ts-page-transition-animation.md)中的duration参数不生效,动画持续时间取决于springMotion动画曲线参数和之前的速度。时间不能归一,故不能通过该曲线的[interpolate](#interpolate9)函数获得插值。 |
186
187**示例:**
188
189```ts
190import Curves from '@ohos.curves'
191Curves.springMotion() // 创建一个默认弹性动画曲线
192Curves.springMotion(0.5) // 创建指定response、其余参数默认的弹性动画曲线
193Curves.springMotion(0.5, 0.6) // 创建指定response和dampingFraction、其余参数默认的弹性动画曲线
194Curves.springMotion(0.5, 0.6, 0) // 创建三个参数均自定义的弹性动画曲线
195```
196
197
198##  Curves.responsiveSpringMotion<sup>9+</sup>
199
200responsiveSpringMotion(response?: number, dampingFraction?: number, overlapDuration?: number): ICurve
201
202构造弹性跟手动画曲线对象,是[springMotion](#curvesspringmotion9)的一种特例,仅默认参数不同,可与springMotion混合使用。
203
204**系统能力:**  SystemCapability.ArkUI.ArkUI.Full
205
206**参数:**
207
208| 参数名       | 类型     | 必填   | 说明    |
209| --------- | ------ | ---- | ----- |
210| response  | number | 否    | 解释同springMotion中的response。<br/>默认值:0.15<br/>单位:秒<br/>取值范围:(0, +∞)<br/>**说明:** <br/>设置小于等于0的值时,按默认值0.15处理。 |
211| dampingFraction      | number | 否    | 解释同springMotion中的dampingFraction。<br/>默认值:0.86<br/>单位:秒<br/>取值范围:[0, +∞)<br/>**说明:** <br/>设置小于0的值时,按默认值0.86处理。 |
212| 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函数获得插值。 |
213
214**返回值:**
215
216| 类型                           | 说明             |
217| ---------------------------------- | ---------------- |
218|  [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](#interpolate9)函数获得插值。 |
219
220**示例:**
221
222```ts
223import Curves from '@ohos.curves'
224Curves.responsiveSpringMotion() // 创建一个默认弹性跟手动画曲线
225```
226
227
228##  Curves.interpolatingSpring<sup>10+</sup>
229
230interpolatingSpring(velocity: number, mass: number, stiffness: number, damping: number): ICurve
231
232
233构造插值器弹簧曲线对象,生成一条从0到1的动画曲线,实际动画值根据曲线进行插值计算。动画时间由曲线参数决定,不受animation、animateTo中的duration参数控制。
234
235**系统能力:**  SystemCapability.ArkUI.ArkUI.Full
236
237**参数:**
238| 参数名       | 类型     | 必填   | 说明    |
239| --------- | ------ | ---- | ----- |
240| velocity  | number | 是    | 初始速度。外部因素对弹性动效产生的影响参数,目的是保证对象从之前的运动状态平滑地过渡到弹性动效。该速度是归一化速度,其值等于动画开始时的实际速度除以动画属性改变值。<br/>取值范围:(-∞, +∞) |
241| mass      | number | 是    | 质量。弹性系统的受力对象,会对弹性系统产生惯性影响。质量越大,震荡的幅度越大,恢复到平衡位置的速度越慢。<br/>取值范围:(0, +∞)<br/>**说明:** <br/>设置的值小于等于0时,按1处理。 |
242| stiffness | number | 是    | 刚度。表示物体抵抗施加的力而形变的程度。刚度越大,抵抗变形的能力越强,恢复到平衡位置的速度越快。<br/>取值范围:(0, +∞)<br/>**说明:** <br/>设置的值小于等于0时,按1处理。 |
243| damping   | number | 是    | 阻尼。用于描述系统在受到扰动后震荡及衰减的情形。阻尼越大,弹性运动的震荡次数越少、震荡幅度越小。<br/>取值范围:(0, +∞)<br/>**说明:** <br/>设置的值小于等于0时,按1处理。 |
244
245**返回值:**
246
247| 类型                           | 说明             |
248| ---------------------------------- | ---------------- |
249|  [ICurve](#icurve)| 曲线对象。<br>**说明:** 弹性动画曲线为物理曲线,[animation](../arkui-ts/ts-animatorproperty.md)、[animateTo](../arkui-ts/ts-explicit-animation.md)中的duration参数不生效,动画持续时间取决于interpolatingSpring动画曲线参数。时间不能归一,故不能通过该曲线的[interpolate](#interpolate9)函数获得插值。 |
250
251**示例:**
252
253```ts
254import Curves from '@ohos.curves'
255Curves.interpolatingSpring(10, 1, 228, 30) // 创建一个时长由弹簧参数决定的弹簧插值曲线
256```
257
258## Curves.customCurve<sup>10+</sup>
259
260customCurve(interpolate: (fraction: number) => number): ICurve
261
262构造自定义曲线对象。
263
264**系统能力:**  SystemCapability.ArkUI.ArkUI.Full
265
266**参数:**
267
268| 参数名      | 类型                         | 必填 | 说明                                                         |
269| ----------- | ---------------------------- | ---- | ------------------------------------------------------------ |
270| interpolate | (fraction: number) => number | 是   | 用户自定义的插值回调函数。<br/>fraction为动画开始时的插值输入x值。取值范围:[0,1]<br/>返回值为曲线的y值。取值范围:[0,1]<br />**说明:**<br />fraction等于0时,返回值为0对应动画起点,返回不为0,动画在起点处有跳变效果。<br/>fraction等于1时,返回值为1对应动画终点,返回值不为1将导致动画的终值不是状态变量的值,出现大于或者小于状态变量值,再跳变到状态变量值的效果。 |
271
272**返回值:**
273
274| 类型              | 说明             |
275| ----------------- | ---------------- |
276| [ICurve](#icurve) | 曲线的插值对象。 |
277
278**示例:**
279
280```ts
281import Curves from '@ohos.curves'
282let interpolate = (fraction:number):number => {
283  return Math.sqrt(fraction)
284}
285let curve = Curves.customCurve(interpolate) // 创建一个用户自定义插值曲线
286```
287
288
289
290## ICurve
291
292
293### interpolate<sup>9+</sup>
294
295interpolate(fraction:&nbsp;number): number
296
297插值曲线的插值计算函数,可以通过传入的归一化时间参数返回当前的插值
298
299从API version 9开始,该接口支持在ArkTS卡片中使用。
300
301**系统能力:**  SystemCapability.ArkUI.ArkUI.Full
302
303**参数:**
304
305| 参数名   | 类型   | 必填 | 说明                                                         |
306| -------- | ------ | ---- | ------------------------------------------------------------ |
307| fraction | number | 是   | 当前的归一化时间参数。<br/>取值范围:[0,1]<br/>**说明:** <br/>设置的值小于0时,按0处理;设置的值大于1时,按1处理。 |
308
309**返回值:**
310
311| 类型   | 说明                                 |
312| ------ | ------------------------------------ |
313| number | 返回归一化time时间点对应的曲线插值。 |
314
315**示例:**
316
317```ts
318import Curves from '@ohos.curves'
319let curveValue = Curves.initCurve(Curve.EaseIn) // 创建一个默认先慢后快插值曲线
320let value: number = curveValue.interpolate(0.5) // 计算得到时间到一半时的插值
321```
322
323
324## Curves.init<sup>(deprecated)</sup>
325
326init(curve?: Curve): string
327
328
329插值曲线的初始化函数,可以根据入参创建一个插值曲线对象,从API version9开始废弃,推荐使用[Curves.initCurve](#curvesinitcurve9)。
330
331**系统能力:**  SystemCapability.ArkUI.ArkUI.Full
332
333**参数:**
334
335| 参数名 | 类型            | 必填 | 说明                                |
336| ------ | --------------- | ---- | ----------------------------------- |
337| curve  | [Curve](#curve) | 否   | 曲线类型。<br/>默认值:Curve.Linear |
338
339
340## Curves.steps<sup>(deprecated)</sup>
341
342steps(count: number, end: boolean): string
343
344
345构造阶梯曲线对象,从API version9开始废弃,推荐使用[Curves. stepsCurve](# curvesstepscurve9)。
346
347**系统能力:**  SystemCapability.ArkUI.ArkUI.Full
348
349**参数:**
350
351| 参数名 | 类型    | 必填 | 说明                                                         |
352| ------ | ------- | ----| ------------------------------------------------------------ |
353| count  | number  | 是   | 阶梯的数量,需要为正整数。                                   |
354| end    | boolean | 是   | 在每个间隔的起点或是终点发生阶跃变化。<br>-true:在终点发生阶跃变化。<br>-false:在起点发生阶跃变化。 |
355
356
357## Curves.cubicBezier<sup>(deprecated)</sup>
358
359cubicBezier(x1: number, y1: number, x2: number, y2: number): string
360
361
362构造三阶贝塞尔曲线对象,曲线的值必须处于0-1之间,API version9开始废弃,推荐使用 [Curves.cubicBezierCurve](#curvescubicbeziercurve9)。
363
364**系统能力:**  SystemCapability.ArkUI.ArkUI.Full
365
366**参数:**
367| 参数名  | 类型     | 必填   | 说明             |
368| ---- | ------ | ---- | -------------- |
369| x1   | number | 是    | 确定贝塞尔曲线第一点横坐标。 |
370| y1   | number | 是    | 确定贝塞尔曲线第一点纵坐标。 |
371| x2   | number | 是    | 确定贝塞尔曲线第二点横坐标。 |
372| y2   | number | 是    | 确定贝塞尔曲线第二点纵坐标。 |
373
374
375## Curves.spring<sup>(deprecated)</sup>
376
377spring(velocity: number, mass: number, stiffness: number, damping: number): string
378
379
380构造弹簧曲线对象,从API version9开始废弃,推荐使用[Curves.springCurve](#curvesspringcurve9)。
381
382**系统能力:**  SystemCapability.ArkUI.ArkUI.Full
383
384**参数:**
385
386| 参数名       | 类型     | 必填   | 说明    |
387| --------- | ------ | ---- | ----- |
388| velocity  | number | 是    | 初始速度。是由外部因素对弹性动效产生的影响参数,其目的是保证对象从之前的运动状态平滑地过渡到弹性动效。 |
389| mass      | number | 是    | 质量。弹性系统的受力对象,会对弹性系统产生惯性影响。质量越大,震荡的幅度越大,恢复到平衡位置的速度越慢。 |
390| stiffness | number | 是    | 刚度。是物体抵抗施加的力而形变的程度。在弹性系统中,刚度越大,抵抗变形的能力越强,恢复到平衡位置的速度就越快。 |
391| damping   | number | 是    | 阻尼。是一个纯数,无真实的物理意义,用于描述系统在受到扰动后震荡及衰减的情形。阻尼越大,弹性运动的震荡次数越少、震荡幅度越小。 |
392
393## 整体示例
394
395```ts
396// xxx.ets
397import Curves from '@ohos.curves'
398
399@Entry
400@Component
401struct ImageComponent {
402  @State widthSize: number = 200
403  @State heightSize: number = 200
404
405  build() {
406    Column() {
407      Text()
408        .margin({ top: 100 })
409        .width(this.widthSize)
410        .height(this.heightSize)
411        .backgroundColor(Color.Red)
412        .onClick(() => {
413          let curve = Curves.cubicBezierCurve(0.25, 0.1, 0.25, 1.0);
414          this.widthSize = curve.interpolate(0.5) * this.widthSize;
415          this.heightSize = curve.interpolate(0.5) * this.heightSize;
416        })
417        .animation({ duration: 2000, curve: Curves.stepsCurve(9, true) })
418    }.width("100%").height("100%")
419  }
420}
421```
422
423![zh-cn_image_0000001174104410](figures/zh-cn_image_0000001174104410.gif)
424