• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1# Scroll
2
3可滚动的容器组件,当子组件的布局尺寸超过父组件的尺寸时,内容可以滚动。
4
5>  **说明:**
6>  - 该组件从API version 7开始支持。后续版本如有新增内容,则采用上角标单独标记该内容的起始版本。
7>  - 该组件嵌套List子组件滚动时,若List不设置宽高,则默认全部加载,在对性能有要求的场景下建议指定List的宽高。
8>  - 该组件滚动的前提是主轴方向大小小于内容大小。
9>  - Scroll组件[通用属性clip](ts-universal-attributes-sharp-clipping.md)的默认值为true。
10
11
12## 子组件
13
14支持单个子组件。
15
16
17## 接口
18
19Scroll(scroller?: Scroller)
20
21创建Scroll滚动容器。
22
23**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。
24
25**系统能力:** SystemCapability.ArkUI.ArkUI.Full
26
27**参数:**
28
29| 参数名 | 类型 | 必填 | 说明 |
30| -------- | -------- | -------- | -------- |
31| scroller | [Scroller](#scroller) | 否 | 可滚动组件的控制器。用于与可滚动组件进行绑定。<br/>**说明:** <br/>不允许和其他滚动类组件,如:[ArcList](ts-container-arclist.md)、[List](ts-container-list.md)、[Grid](ts-container-grid.md)、[Scroll](ts-container-scroll.md)和[WaterFlow](ts-container-waterflow.md)绑定同一个滚动控制对象。 |
32
33## 属性
34
35除支持[通用属性](ts-component-general-attributes.md)和[滚动组件通用属性](ts-container-scrollable-common.md#属性)外,还支持以下属性:
36
37### scrollable
38
39scrollable(value: ScrollDirection)
40
41设置滚动方向。
42
43**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。
44
45**系统能力:** SystemCapability.ArkUI.ArkUI.Full
46
47**参数:**
48
49| 参数名 | 类型                                        | 必填 | 说明                                            |
50| ------ | ------------------------------------------- | ---- | ----------------------------------------------- |
51| value  | [ScrollDirection](#scrolldirection枚举说明) | 是   | 滚动方向。<br/>默认值:ScrollDirection.Vertical |
52
53### scrollBar
54
55scrollBar(barState: BarState)
56
57设置滚动条状态。如果容器组件无法滚动,则滚动条不显示。如果容器组件的子组件大小为无穷大,则滚动条不支持拖动和伴随滚动。
58
59从API version 10开始,当滚动组件存在圆角时,为避免滚动条被圆角截断,滚动条会自动计算距顶部和底部的避让距离。
60
61**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。
62
63**系统能力:** SystemCapability.ArkUI.ArkUI.Full
64
65**参数:**
66
67| 参数名   | 类型                                      | 必填 | 说明                                   |
68| -------- | ----------------------------------------- | ---- | -------------------------------------- |
69| barState | [BarState](ts-appendix-enums.md#barstate) | 是   | 滚动条状态。<br/>默认值:BarState.Auto |
70
71### scrollBarColor
72
73scrollBarColor(color: Color | number | string)
74
75设置滚动条的颜色。
76
77**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。
78
79**系统能力:** SystemCapability.ArkUI.ArkUI.Full
80
81**参数:**
82
83| 参数名 | 类型                                                         | 必填 | 说明           |
84| ------ | ------------------------------------------------------------ | ---- | -------------- |
85| color  | [Color](ts-appendix-enums.md#color)&nbsp;\|&nbsp;number&nbsp;\|&nbsp;string | 是   | 滚动条的颜色。<br/>默认值:'\#182431'(40%不透明度)<br/>number为HEX格式颜色,支持rgb或者argb,示例:0xffffff。string为rgb或者argb格式颜色,示例:'#ffffff'。   |
86
87### scrollBarWidth
88
89scrollBarWidth(value: number | string)
90
91设置滚动条的宽度,不支持百分比设置。宽度设置后,滚动条正常状态和按压状态宽度均为滚动条的宽度值。如果滚动条的宽度超过Scroll组件主轴方向的高度,则滚动条的宽度会变为默认值。
92
93**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。
94
95**系统能力:** SystemCapability.ArkUI.ArkUI.Full
96
97**参数:**
98
99| 参数名 | 类型                       | 必填 | 说明                                      |
100| ------ | -------------------------- | ---- | ----------------------------------------- |
101| value  | number&nbsp;\|&nbsp;string | 是   | 滚动条的宽度。<br/>默认值:4<br/>单位:vp <br/>取值范围:设置为小于0的值时,按默认值处理。设置为0时,不显示滚动条。|
102
103### scrollSnap<sup>10+</sup>
104
105scrollSnap(value: ScrollSnapOptions)
106
107设置Scroll组件的限位滚动模式。
108
109限位动画期间onWillScroll事件上报的滚动操作来源类型为ScrollSource.FLING110
111**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。
112
113**系统能力:** SystemCapability.ArkUI.ArkUI.Full
114
115**参数:**
116
117| 参数名 | 类型                                      | 必填 | 说明                       |
118| ------ | ----------------------------------------- | ---- | -------------------------- |
119| value  | [ScrollSnapOptions](#scrollsnapoptions10对象说明) | 是   | Scroll组件的限位滚动模式。 |
120
121### edgeEffect
122
123edgeEffect(edgeEffect: EdgeEffect, options?: EdgeEffectOptions)
124
125设置边缘滑动效果。
126
127**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。
128
129**系统能力:** SystemCapability.ArkUI.ArkUI.Full
130
131**参数:**
132
133| 参数名                | 类型                                              | 必填 | 说明                                                         |
134| --------------------- | ------------------------------------------------- | ---- | ------------------------------------------------------------ |
135| edgeEffect            | [EdgeEffect](ts-appendix-enums.md#edgeeffect)     | 是   | Scroll组件的边缘滑动效果,支持弹簧效果和阴影效果。<br/>默认值:EdgeEffect.None |
136| options<sup>11+</sup> | [EdgeEffectOptions](ts-container-scrollable-common.md#edgeeffectoptions11对象说明) | 否   | 组件内容大小小于组件自身时,是否开启滑动效果。设置为{ alwaysEnabled: true }会开启滑动效果,{ alwaysEnabled: false }不开启。<br/>默认值:{ alwaysEnabled: true } |
137
138### enableScrollInteraction<sup>10+</sup>
139
140enableScrollInteraction(value: boolean)
141
142设置是否支持滚动手势。
143
144**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。
145
146**系统能力:** SystemCapability.ArkUI.ArkUI.Full
147
148**参数:**
149
150| 参数名 | 类型    | 必填 | 说明                                |
151| ------ | ------- | ---- | ----------------------------------- |
152| value  | boolean | 是   | 是否支持滚动手势。设置为true时可以通过手指或者鼠标滚动,设置为false时无法通过手指或者鼠标滚动,但不影响控制器[Scroller](ts-container-scroll.md#scroller)的滚动接口。<br/>默认值:true |
153
154### nestedScroll<sup>10+</sup>
155
156nestedScroll(value: NestedScrollOptions)
157
158设置前后两个方向的嵌套滚动模式,实现与父组件的滚动联动。
159
160**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。
161
162**系统能力:** SystemCapability.ArkUI.ArkUI.Full
163
164**参数:**
165
166| 参数名 | 类型                                                  | 必填 | 说明           |
167| ------ | ----------------------------------------------------- | ---- | -------------- |
168| value  | [NestedScrollOptions](ts-container-scrollable-common.md#nestedscrolloptions10对象说明) | 是   | 嵌套滚动选项。<br/>默认值:{ scrollForward: NestedScrollMode.SELF_ONLY, scrollBackward: NestedScrollMode.SELF_ONLY }|
169
170### friction<sup>10+</sup>
171
172friction(value: number | Resource)
173
174设置摩擦系数,手动划动滚动区域时生效,仅影响惯性滚动过程,对惯性滚动过程中的链式效果有间接影响。
175
176**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。
177
178**系统能力:** SystemCapability.ArkUI.ArkUI.Full
179
180**参数:**
181
182| 参数名 | 类型                                                 | 必填 | 说明                                                      |
183| ------ | ---------------------------------------------------- | ---- | --------------------------------------------------------- |
184| value  | number&nbsp;\|&nbsp;[Resource](ts-types.md#resource) | 是   | 摩擦系数。<br/>默认值:非可穿戴设备为0.6,可穿戴设备为0.9。<br/>从API version 11开始,非可穿戴设备默认值为0.7。<br/>从API version 12开始,非可穿戴设备默认值为0.75。<br/>取值范围:(0, +∞),设置为小于等于0的值时,按默认值处理。 |
185
186### enablePaging<sup>11+</sup>
187
188enablePaging(value: boolean)
189
190设置是否支持划动翻页。如果同时设置了划动翻页enablePaging和限位滚动scrollSnap,则scrollSnap优先生效,enablePaging不生效。
191
192**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
193
194**系统能力:** SystemCapability.ArkUI.ArkUI.Full
195
196**参数:**
197
198| 参数名 | 类型    | 必填 | 说明                                  |
199| ------ | ------- | ---- | ------------------------------------- |
200| value  | boolean | 是   | 是否支持划动翻页。设置为true支持滑动翻页,false不支持。 <br/>默认值:false |
201
202### initialOffset<sup>12+</sup>
203
204initialOffset(value: OffsetOptions)
205
206设置初始滚动偏移量。只在首次布局时生效,后续动态修改该属性值不生效。
207
208**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
209
210**系统能力:** SystemCapability.ArkUI.ArkUI.Full
211
212**参数:**
213
214| 参数名 | 类型    | 必填 | 说明                                  |
215| ------ | ------- | ---- | ------------------------------------- |
216| value  | [OffsetOptions](#offsetoptions12对象说明)  | 是   |当输入的大小为百分比时,初始滚动偏移量为Scroll组件主轴方向大小与百分比数值之积。|
217
218## ScrollDirection枚举说明
219
220滚动方向枚举。
221
222**系统能力:** SystemCapability.ArkUI.ArkUI.Full
223
224| 名称       | 说明                   |
225| ---------- | ------------------------ |
226| Horizontal | 仅支持水平方向滚动。<br/>**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。|
227| Vertical   | 仅支持竖直方向滚动。<br/>**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。|
228| None       | 不可滚动。<br/>**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。|
229| Free<sup>(deprecated) </sup> | 支持竖直或水平方向滚动<br/> 从API version 9开始废弃。|
230
231## ScrollSnapOptions<sup>10+</sup>对象说明
232
233限位滚动模式对象。
234
235**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。
236
237**系统能力:** SystemCapability.ArkUI.ArkUI.Full
238
239| 名称       | 类型    | 必填   | 说明       |
240| ---------- | --------------------|-------------------- | -------- |
241| snapAlign  | [ScrollSnapAlign](ts-container-list.md#scrollsnapalign10枚举说明)   | 是 | 设置Scroll组件限位滚动时的对齐方式。<br/>**说明:** <br/>1.该属性默认值为ScrollSnapAlign.NONE。 |
242| snapPagination | [Dimension](ts-types.md#dimension10)&nbsp;\|&nbsp;Array\<Dimension\> | 否 | 设置Scroll组件限位滚动时的分页点。<br/>**说明:** <br/>1.当属性为Dimension时,Dimension表示每页的大小,系统按照该大小进行分页。<br/>2.当属性为Array\<Dimension\>时,每个Dimension表示分页点,系统按照分页点进行分页。每个Dimension的范围为[0,可滑动距离]。<br/>3.当该属性不填或者Dimension为小于等于0的输入时,按异常值,无限位滚动处理。当该属性值为Array\<Dimension\>数组时,数组中的数值必须为单调递增。<br/>4.当输入为百分比时,实际的大小为Scroll组件的视口与百分比数值之积。 |
243| enableSnapToStart | boolean   | 否 | 在Scroll组件限位滚动模式下,该属性设置为true后,不允许Scroll在开头和第一页间自由滑动,该属性设置为false后,允许Scroll在开头和第一页间自由滑动。<br/>**说明:** <br/>1.该属性值默认为true。<br/>2.该属性仅当snapPagination属性为Array\<Dimension\>时生效,不支持Dimension。 |
244| enableSnapToEnd | boolean   | 否 | 在Scroll组件限位滚动模式下,该属性设置为true后,不允许Scroll在最后一页和末尾间自由滑动,该属性设置为false后,允许Scroll在最后一页和末尾间自由滑动。<br/>**说明:** <br/>1.该属性值默认为true。<br/>2.该属性仅当snapPagination属性为Array\<Dimension\>时生效,不支持Dimension。 |
245
246## 事件
247
248除支持[通用事件](ts-component-general-events.md)和[滚动组件通用事件](ts-container-scrollable-common.md#事件)外,还支持以下事件:
249>  **说明:**
250>
251>  不支持滚动组件通用事件中的[onWillScroll](ts-container-scrollable-common.md#onwillscroll12)、[onDidScroll](ts-container-scrollable-common.md#ondidscroll12)事件。
252
253### onScrollFrameBegin<sup>9+</sup>
254
255onScrollFrameBegin(event: OnScrollFrameBeginCallback)
256
257每帧开始滚动时触发,事件参数传入即将发生的滚动量,事件处理函数中可根据应用场景计算实际需要的滚动量并作为事件处理函数的返回值返回,Scroll将按照返回值的实际滚动量进行滚动。
258
259支持offsetRemain为负值。
260
261若通过onScrollFrameBegin事件和scrollBy方法实现容器嵌套滚动,需设置子滚动节点的EdgeEffect为None。如Scroll嵌套List滚动时,List组件的edgeEffect属性需设置为EdgeEffect.None262
263触发该事件的条件:
264
2651、滚动组件触发滚动时触发,包括键鼠操作等其他触发滚动的输入设置。<br/>2、调用控制器接口时不触发。<br/>3、越界回弹不触发。<br/>4、拖动滚动条不触发。
266
267**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。
268
269**系统能力:** SystemCapability.ArkUI.ArkUI.Full
270
271**参数:**
272
273| 参数名 | 类型                              | 必填 | 说明               |
274| ------ | --------------------------------- | ---- | ------------------ |
275| event   | [OnScrollFrameBeginCallback](#onscrollframebegincallback18) | 是   | 每帧滚动开始回调函数。 |
276
277### onScroll<sup>(deprecated)</sup>
278
279onScroll(event: (xOffset: number, yOffset: number) => void)
280
281滚动事件回调,返回滚动时水平、竖直方向偏移量,单位vp。
282
283触发该事件的条件:
284
2851、滚动组件触发滚动时触发,支持键鼠操作等其他触发滚动的输入设置。
286
2872、通过滚动控制器API接口调用。
288
2893、越界回弹。
290
291从API version12开始废弃不再使用,推荐使用[onWillScroll](#onwillscroll12)事件替代。
292
293**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。
294
295**系统能力:** SystemCapability.ArkUI.ArkUI.Full
296
297**参数:**
298
299| 参数名  | 类型                                                      | 必填 | 说明                   |
300| ------- | --------------------------------------------------------- | ---- | ---------------------- |
301| xOffset     | number                                                  | 是   | 每帧滚动时水平方向的偏移量,Scroll的内容向左滚动时偏移量为正,向右滚动时偏移量为负。<br/>单位vp。 |
302| yOffset     | number                                                  | 是   | 每帧滚动时竖直方向的偏移量,Scroll的内容向上滚动时偏移量为正,向下滚动时偏移量为负。<br/>单位vp。 |
303
304### onWillScroll<sup>12+</sup>
305
306onWillScroll(handler: ScrollOnWillScrollCallback)
307
308滚动事件回调,Scroll滚动前触发。
309
310回调当前帧将要滚动的偏移量和当前滚动状态和滚动操作来源,其中回调的偏移量为计算得到的将要滚动的偏移量值,并非最终实际滚动偏移。可以通过该回调返回值指定Scroll将要滚动的偏移。
311
312触发该事件的条件:
313
3141、滚动组件触发滚动时触发,支持键鼠操作等其他触发滚动的输入设置。
315
3162、通过滚动控制器API接口调用。
317
3183、越界回弹。
319
320**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
321
322**系统能力:** SystemCapability.ArkUI.ArkUI.Full
323
324**参数:**
325
326| 参数名  | 类型                                                      | 必填 | 说明                   |
327| ------- | --------------------------------------------------------- | ---- | ---------------------- |
328| handler | [ScrollOnWillScrollCallback](#scrollonwillscrollcallback12) | 是   | Scroll滚动前触发的回调。 |
329
330### onDidScroll<sup>12+</sup>
331
332onDidScroll(handler: ScrollOnScrollCallback)
333
334滚动事件回调,Scroll滚动时触发。
335
336返回当前帧滚动的偏移量和当前滚动状态。
337
338触发该事件的条件:
339
3401、滚动组件触发滚动时触发,支持键鼠操作等其他触发滚动的输入设置。
341
3422、通过滚动控制器API接口调用。
343
3443、越界回弹。
345
346**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
347
348**系统能力:** SystemCapability.ArkUI.ArkUI.Full
349
350**参数:**
351
352| 参数名  | 类型                                                      | 必填 | 说明                   |
353| ------- | --------------------------------------------------------- | ---- | ---------------------- |
354| handler | [ScrollOnScrollCallback](#scrollonscrollcallback12) | 是   | Scroll滚动时触发的回调。 |
355
356### onScrollEdge
357
358onScrollEdge(event: OnScrollEdgeCallback)
359
360滚动到边缘事件回调。
361
362触发该事件的条件:
363
3641、滚动组件滚动到边缘时触发,支持键鼠操作等其他触发滚动的输入设置。<br/>2、通过滚动控制器API接口调用。<br/>3、越界回弹。
365
366**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。
367
368**系统能力:** SystemCapability.ArkUI.ArkUI.Full
369
370**参数:**
371
372| 参数名 | 类型                              | 必填 | 说明               |
373| ------ | --------------------------------- | ---- | ------------------ |
374| event   | [OnScrollEdgeCallback](#onscrolledgecallback18) | 是   | 滚动到的边缘位置。 |
375
376### onScrollEnd<sup>(deprecated) </sup>
377
378onScrollEnd(event: () => void)
379
380滚动停止事件回调。
381
382触发该事件的条件:
383
3841、滚动组件触发滚动后停止,支持键鼠操作等其他触发滚动的输入设置。<br/>2、通过滚动控制器API接口调用后停止,带过渡动效。
385
386该事件从API version 9开始废弃,使用onScrollStop事件替代。
387
388**系统能力:** SystemCapability.ArkUI.ArkUI.Full
389
390### onScrollStart<sup>9+</sup>
391
392onScrollStart(event: VoidCallback)
393
394滚动开始时触发。手指拖动Scroll或拖动Scroll的滚动条触发的滚动开始时,会触发该事件。使用[Scroller](#scroller)滚动控制器触发的带动画的滚动,动画开始时会触发该事件。
395
396触发该事件的条件:
397
3981、滚动组件开始滚动时触发,支持键鼠操作等其他触发滚动的输入设置。<br/>2、通过滚动控制器API接口调用后开始,带过渡动效。
399
400**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。
401
402**系统能力:** SystemCapability.ArkUI.ArkUI.Full
403
404**参数:**
405
406| 参数名 | 类型                              | 必填 | 说明               |
407| ------ | --------------------------------- | ---- | ------------------ |
408| event   | [VoidCallback](ts-types.md#voidcallback12) | 是   | 滚动开始回调。 |
409
410### onScrollStop<sup>9+</sup>
411
412onScrollStop(event: VoidCallback)
413
414滚动停止时触发。手拖动Scroll或拖动Scroll的滚动条触发的滚动,手离开屏幕并且滚动停止时会触发该事件。使用[Scroller](#scroller)滚动控制器触发的带动画的滚动,动画停止时会触发该事件。
415
416触发该事件的条件:
417
4181、滚动组件触发滚动后停止,支持键鼠操作等其他触发滚动的输入设置。<br/>2、通过滚动控制器API接口调用后开始,带过渡动效。
419
420**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。
421
422**系统能力:** SystemCapability.ArkUI.ArkUI.Full
423
424**参数:**
425
426| 参数名 | 类型                              | 必填 | 说明               |
427| ------ | --------------------------------- | ---- | ------------------ |
428| event   | [VoidCallback](ts-types.md#voidcallback12) | 是   | 滚动停止回调。 |
429
430## ScrollOnScrollCallback<sup>12+</sup>
431
432type ScrollOnScrollCallback = (xOffset: number, yOffset: number, scrollState: ScrollState) => void
433
434Scroll滚动时触发的回调。
435
436**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
437
438**系统能力:** SystemCapability.ArkUI.ArkUI.Full
439
440| 参数名      | 类型                                                    | 必填 | 说明                                                         |
441| ----------- | ------------------------------------------------------- | ---- | ------------------------------------------------------------ |
442| xOffset     | number                                                  | 是   | 每帧滚动时水平方向的偏移量,Scroll中的内容向左滚动时偏移量为正,向右滚动时偏移量为负。<br/>单位vp。 |
443| yOffset     | number                                                  | 是   | 每帧滚动时竖直方向的偏移量,Scroll中的内容向上滚动时偏移量为正,向下滚动时偏移量为负。<br/>单位vp。 |
444| scrollState | [ScrollState](ts-container-list.md#scrollstate枚举说明) | 是  | 当前滚动状态。                                               |
445
446>  **说明:**
447>
448>  若通过onScrollFrameBegin事件和scrollBy方法实现容器嵌套滚动,需设置子滚动节点的EdgeEffect为None。如Scroll嵌套List滚动时,List组件的edgeEffect属性需设置为EdgeEffect.None449
450## ScrollOnWillScrollCallback<sup>12+</sup>
451
452type ScrollOnWillScrollCallback = (xOffset: number, yOffset: number, scrollState: ScrollState, scrollSource: ScrollSource) => void | OffsetResult
453
454Scroll滚动前触发的回调。
455
456**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
457
458**系统能力:** SystemCapability.ArkUI.ArkUI.Full
459
460| 参数名      | 类型                                                    | 必填 | 说明                                                         |
461| ----------- | ------------------------------------------------------- | ---- | ------------------------------------------------------------ |
462| xOffset     | number                                                  | 是   | 每帧滚动时水平方向的偏移量,Scroll中的内容向左滚动时偏移量为正,向右滚动时偏移量为负。<br/>单位vp。 |
463| yOffset     | number                                                  | 是   | 每帧滚动时竖直方向的偏移量,Scroll中的内容向上滚动时偏移量为正,向下滚动时偏移量为负。<br/>单位vp。 |
464| scrollState | [ScrollState](ts-container-list.md#scrollstate枚举说明) | 是  | 当前滚动状态。                                               |
465| scrollSource | [ScrollSource](ts-appendix-enums.md#scrollsource12) | 是 | 当前滚动操作的来源。 |
466
467**返回值:**
468
469| 类型                                                         | 说明                                                         |
470| ------------------------------------------------------------ | ------------------------------------------------------------ |
471| void \| [OffsetResult](#offsetresult11对象说明) |  返回OffsetResult时按照开发者指定的偏移量滚动;不返回时按回调参数(xOffset,yOffset)滚动。 |
472
473## OnScrollEdgeCallback<sup>18+</sup>
474
475type OnScrollEdgeCallback = (side: Edge) => void
476
477滚动到边缘时触发的回调。
478
479**原子化服务API:** 从API version 18开始,该接口支持在原子化服务中使用。
480
481**系统能力:** SystemCapability.ArkUI.ArkUI.Full
482
483| 参数名  | 类型   | 必填 | 说明    |
484| ------- | ----- | ---- | ------ |
485| side    | [Edge](ts-appendix-enums.md#edge)  | 是   | 滚动到的边缘位置。 |
486
487## OnScrollFrameBeginCallback<sup>18+</sup>
488
489type OnScrollFrameBeginCallback = (offset: number, state: ScrollState) => OnScrollFrameBeginHandlerResult;
490
491Scroll每帧滚动前触发的回调。
492
493**原子化服务API:** 从API version 18开始,该接口支持在原子化服务中使用。
494
495**系统能力:** SystemCapability.ArkUI.ArkUI.Full
496
497**参数:**
498
499| 参数名 | 类型                                                    | 必填 | 说明                       |
500| ------ | ------------------------------------------------------- | ---- | -------------------------- |
501| offset | number                                                  | 是   | 即将发生的滑动量,单位vp。 |
502| state  | [ScrollState](ts-container-list.md#scrollstate枚举说明) | 是   | 当前滑动状态。             |
503
504**返回值:**
505
506| 类型                     | 说明                 |
507| ------------------------ | -------------------- |
508| [OnScrollFrameBeginHandlerResult](#onscrollframebeginhandlerresult18对象说明) | 返回实际滑动量。 |
509
510## OnScrollFrameBeginHandlerResult<sup>18+</sup>对象说明
511
512[OnScrollFrameBeginCallback](#onscrollframebegincallback18)返回的实际滚动偏移量。
513
514**原子化服务API:** 从API version 18开始,该接口支持在原子化服务中使用。
515
516**系统能力:** SystemCapability.ArkUI.ArkUI.Full
517
518| 名称  | 类型  | 必填 | 说明  |
519| ----- | ------ | ---- | ----- |
520| offsetRemain<sup>9+</sup>     | number | 是   | 实际滚动偏移量。<br/>单位vp。<br/>**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。 |
521
522## Scroller
523
524可滚动容器组件的控制器,可以将此组件绑定至容器组件,然后通过它控制容器组件的滚动。同一个控制器不可以控制多个容器组件,目前支持绑定到ArcList、ArcScrollBar、List、Scroll、ScrollBar、Grid、WaterFlow上。
525
526>**说明:**
527>
528>1、Scroller控制器与滚动容器组件的绑定发生在组件创建阶段。<br/>
529>2、Scroller控制器与滚动容器组件绑定后才可以正常调用Scroller方法,否则根据调用接口不同会不生效或者抛异常。<br/>
530>3、以[aboutToAppear](ts-custom-component-lifecycle.md#abouttoappear)为例,aboutToAppear在创建自定义组件的新实例后,在执行其build()方法之前执行。因此如果滚动组件在自定义组件build内,在该自定义组件aboutToAppear执行时,内部滚动组件还没有创建,是不能正常调用上述Scroller方法的。<br/>
531>4、以[onAppear](ts-universal-events-show-hide.md#onappear)为例,组件挂载显示后触发此回调。因此在滚动组件的onAppear回调执行时,滚动组件已经创建并已经和Scroller绑定成功,是可以正常调用Scroller方法的。
532
533### 导入对象
534
535```
536scroller: Scroller = new Scroller()
537```
538
539### constructor
540
541constructor()
542
543Scroller的构造函数。
544
545**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。
546
547**系统能力:** SystemCapability.ArkUI.ArkUI.Full
548
549### scrollTo
550
551scrollTo(options: [ScrollOptions](#scrolloptions18对象说明))
552
553
554滑动到指定位置。
555
556**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。
557
558**系统能力:** SystemCapability.ArkUI.ArkUI.Full
559
560**参数:**
561
562| 参数名   | 类型 | 必填   | 说明      |
563| ----- | ---- | ---- | --------- |
564| options | [ScrollOptions](#scrolloptions18对象说明) | 是    | 滑动到指定位置的参数。
565
566### scrollEdge
567
568scrollEdge(value: Edge, options?: ScrollEdgeOptions)
569
570滚动到容器边缘,不区分滚动轴方向,Edge.TopEdge.Start表现相同,Edge.BottomEdge.End表现相同。
571Scroll组件默认有动画,Grid、List、WaterFlow组件默认无动画。
572
573**系统能力:** SystemCapability.ArkUI.ArkUI.Full
574
575**参数:**
576
577| 参数名   | 类型 | 必填   | 说明      |
578| ----- | ---- | ---- | --------- |
579| value | [Edge](ts-appendix-enums.md#edge) | 是    | 滚动到的边缘位置。 <br/>**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。|
580| options<sup>12+</sup>&nbsp; | [ScrollEdgeOptions](#scrolledgeoptions12对象说明) | 否    | 设置滚动到边缘位置的模式。 <br/>**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。|
581
582### fling<sup>12+</sup>
583
584fling(velocity: number): void
585
586
587滚动类组件开启按传入的初始速度进行惯性滚动。
588
589**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
590
591**系统能力:** SystemCapability.ArkUI.ArkUI.Full
592
593**参数:**
594
595| 参数名   | 类型 | 必填 | 说明                                                     |
596| -------- | -------- | ---- | ------------------------------------------------------------ |
597| velocity | number   | 是   | 惯性滚动的初始速度值。单位:vp/s<br/>**说明:**<br/>velocity值设置为0,视为异常值,本次滚动不生效。如果值为正数,则向顶部滚动;如果值为负数,则向底部滚动。 <br/>取值范围:(-∞, +∞)|
598
599**错误码**:
600
601以下错误码详细介绍请参考[通用错误码](../../errorcode-universal.md)和[滚动类组件错误码](../errorcode-scroll.md)。
602
603| 错误码ID | 错误信息 |
604| ------- | -------- |
605| 401      | Parameter error. Possible causes: 1. Mandatory parameters are left unspecified; 2.Incorrect parameters types; 3. Parameter verification failed.   |
606| 100004   | Controller not bound to component.                               |
607
608### scrollPage<sup>9+</sup>
609
610scrollPage(value:   ScrollPageOptions)
611
612滚动到下一页或者上一页。
613
614**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。
615
616**系统能力:** SystemCapability.ArkUI.ArkUI.Full
617
618**参数:**
619
620| 参数名 | 类型                                           | 必填 | 说明       |
621| ------ | -------------------------------------------------- | ---- | -------------- |
622| value  | [ScrollPageOptions](#scrollpageoptions14对象说明) | 是   | 设置翻页模式。 |
623
624### scrollPage<sup>(deprecated)</sup>
625
626scrollPage(value: { next: boolean, direction?: Axis })
627
628滚动到下一页或者上一页。从API version 9开始,该接口不再维护,推荐使用[scrollPage<sup>9+</sup>](#scrollpage9)。
629
630**系统能力:** SystemCapability.ArkUI.ArkUI.Full
631
632**参数:**
633
634| 参数名       | 类型    | 必填   | 说明                           |
635| --------- | ------- | ---- | ------------------------------ |
636| next      | boolean | 是    | 是否向下翻页。true表示向下翻页,false表示向上翻页。 |
637| direction | [Axis](ts-appendix-enums.md#axis)    | 否    | 设置滚动方向为水平或竖直方向。               |
638
639### currentOffset
640
641currentOffset(): OffsetResult
642
643获取当前的滚动偏移量。
644
645**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。
646
647**系统能力:** SystemCapability.ArkUI.ArkUI.Full
648
649| 类型  | 描述 |
650| -------- | -------- |
651|  [OffsetResult<sup>11+</sup>](#offsetresult11对象说明) | 返回当前的滚动偏移量。<br/>**说明:**<br/>当scroller控制器未绑定容器组件或者容器组件被异常释放时,currentOffset的返回值为空。|
652
653### scrollToIndex
654
655scrollToIndex(value: number, smooth?: boolean, align?: ScrollAlign, options?: ScrollToIndexOptions)
656
657滑动到指定Index,支持设置滑动额外偏移量。
658
659开启smooth动效时,会对经过的所有item进行加载和布局计算,当大量加载item时会导致性能问题,建议先调用scrollToIndex不带动画跳转到目标附近位置,再调用scrollToIndex带动画滚动到目标位置。
660
661
662>  **说明:**
663>
664>  仅支持ArcList、Grid、List、WaterFlow组件。
665
666**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。
667
668**系统能力:** SystemCapability.ArkUI.ArkUI.Full
669
670**参数:**
671
672| 参数名                | 类型 | 必填 | 说明                                                     |
673| --------------------- | -------- | ---- | ------------------------------------------------------------ |
674| value | number   | 是   | 要滑动到的目标元素在当前容器中的索引值。      <br/>**说明:** <br/>value值设置成负值或者大于当前容器子组件的最大索引值,视为异常值,本次跳转不生效。                     |
675| smooth | boolean  | 否   | 设置滑动到列表项在列表中的索引值时是否有动效,true表示有动效,false表示没有动效。<br/>默认值:false。|
676| align | [ScrollAlign](#scrollalign10枚举说明)  | 否   | 指定滑动到的元素与当前容器的对齐方式。<br/>List中的默认值为:ScrollAlign.START。Grid中默认值为:ScrollAlign.AUTO。WaterFlow中的默认值为:ScrollAlign.START。<br/>**说明:** <br/>仅List、Grid、WaterFlow组件支持该参数。 |
677| options<sup>12+</sup> | [ScrollToIndexOptions](#scrolltoindexoptions12对象说明)  | 否   | 设置滑动到指定Index的选项,如额外偏移量。<br/>默认值:0,单位:vp。 |
678
679### scrollBy<sup>9+</sup>
680
681scrollBy(dx: Length, dy: Length)
682
683
684滑动指定距离。
685
686
687>  **说明:**
688>
689>  支持ArcList、Scroll、List、Grid、WaterFlow组件。
690
691**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。
692
693**系统能力:** SystemCapability.ArkUI.ArkUI.Full
694
695**参数:**
696
697| 参数名   | 类型   | 必填   | 说明              |
698| ----- | ------ | ---- | ----------------- |
699| dx |  [Length](ts-types.md#length) | 是    | 水平方向滚动距离,不支持百分比形式。 <br/>取值范围:(-∞, +∞) |
700| dy |  [Length](ts-types.md#length) | 是    | 竖直方向滚动距离,不支持百分比形式。 <br/>取值范围:(-∞, +∞) |
701
702### isAtEnd<sup>10+</sup>
703
704isAtEnd(): boolean
705
706查询组件是否滚动到底部。
707
708>  **说明:**
709>
710>  支持ArcList、Scroll、List、Grid、WaterFlow组件。
711
712**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。
713
714**系统能力:** SystemCapability.ArkUI.ArkUI.Full
715
716**返回值**
717
718| 类型         | 描述          |
719| ------- | -------- |
720| boolean | true表示组件已经滚动到底部,false表示组件还没滚动到底部。 |
721
722### getItemRect<sup>11+</sup>
723
724getItemRect(index: number): RectResult
725
726获取子组件的大小及相对容器组件的位置。
727
728>  **说明:**
729>
730>  支持ArcList、Scroll、List、Grid、WaterFlow组件。
731
732**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
733
734**系统能力:** SystemCapability.ArkUI.ArkUI.Full
735
736**参数:**
737
738| 参数名   | 类型   | 必填   | 说明              |
739| ----- | ------ | ---- | ----------------- |
740| index | number | 是    | 子组件的索引值。 |
741
742> **说明:**
743>
744> - index必须是当前显示区域显示的子组件的索引值,否则视为非法值。
745> - 非法值返回的大小和位置均为0。
746
747**返回值:**
748
749| 类型       | 说明       |
750| -------------------  | -------- |
751| [RectResult](ts-types.md#rectresult10) | 子组件的大小和相对于组件的位置。<br/>单位:vp。 |
752
753**错误码**:
754
755以下错误码详细介绍请参考[通用错误码](../../errorcode-universal.md)和[滚动类组件错误码](../errorcode-scroll.md)。
756
757| 错误码ID | 错误信息 |
758| ------- | -------- |
759| 401      | Parameter error. Possible causes: 1. Mandatory parameters are left unspecified; 2.Incorrect parameters types; 3. Parameter verification failed.   |
760| 100004   | Controller not bound to component.                               |
761### getItemIndex<sup>14+</sup>
762
763getItemIndex(x: number, y: number): number
764
765通过坐标获取子组件的索引。
766
767>  **说明:**
768>
769>  支持List、Grid、WaterFlow组件。
770
771**原子化服务API:** 从API version 14开始,该接口支持在原子化服务中使用。
772
773**系统能力:** SystemCapability.ArkUI.ArkUI.Full
774
775**参数:**
776
777| 参数名   | 类型   | 必填   | 说明              |
778| ----- | ------ | ---- | ----------------- |
779| x | number | 是    | x轴坐标,单位为vp。 |
780| y | number | 是 | y轴坐标,单位为vp。 |
781
782> **说明:**
783>
784> 非法值返回的索引为-1。
785
786**返回值:**
787
788| 类型       | 说明       |
789| -------------------  | -------- |
790| number | 返回子组件的索引,单位:vp。 |
791
792**错误码**:
793
794以下错误码详细介绍请参考[通用错误码](../../errorcode-universal.md)和[滚动类组件错误码](../errorcode-scroll.md)。
795
796| 错误码ID | 错误信息 |
797| ------- | -------- |
798| 401      | Parameter error. Possible causes: 1. Mandatory parameters are left unspecified; 2.Incorrect parameters types; 3. Parameter verification failed.   |
799| 100004   |The controller not bound to component.                              |
800
801## OffsetResult<sup>11+</sup>对象说明
802
803滑动偏移量对象。
804
805**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。
806
807**系统能力:** SystemCapability.ArkUI.ArkUI.Full
808
809| 名称     | 类型   | 只读 | 可选 | 说明                             |
810| ------- |------- | ---- | ---- | -------------------------------- |
811| xOffset | number |  否  |  否  | 水平滑动偏移。<br/>返回值单位为vp。 |
812| yOffset | number |  否  |  否  | 竖直滑动偏移。<br/>返回值单位为vp。 |
813
814## ScrollAnimationOptions<sup>12+</sup>对象说明
815
816自定义滚动动效的参数选项。
817
818**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
819
820**系统能力:** SystemCapability.ArkUI.ArkUI.Full
821
822| 名称   | 类型   | 必填   | 说明              |
823| ----- | ------ | ------ | ----------------- |
824| duration | number | 否 | 设置滚动时长。<br/>默认值:1000<br/>**说明:** <br/>设置为小于0的值时,按默认值显示。 |
825| curve | [Curve](ts-appendix-enums.md#curve) \| [ICurve](../js-apis-curve.md#icurve9) | 否 | 设置滚动曲线。<br/>默认值:Curve.Ease |
826| canOverScroll | boolean | 否 | 设置滚动是否可越界。<br/>默认值:false<br/>**说明:** <br/> 仅在设置为true,且组件的edgeEffect设置为[EdgeEffect.Spring](ts-appendix-enums.md#edgeeffect)时,滚动能够越界,并在越界时启动回弹动画,设置为false时不可越界。 |
827
828## ScrollAlign<sup>10+</sup>枚举说明
829
830对齐方式枚举。
831
832**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。
833
834**系统能力:** SystemCapability.ArkUI.ArkUI.Full
835
836| 名称     | 说明                           |
837| ------ | ------------------------------ |
838| START   | 首部对齐。指定item首部与List首部对齐。  |
839| CENTER | 居中对齐。指定item主轴方向居中对齐于List。        |
840| END  | 尾部对齐。指定item尾部与List尾部对齐。 |
841| AUTO  | 自动对齐。<br/>若指定item完全处于显示区,不做调整。否则依照滑动距离最短的原则,将指定item首部对齐或尾部对齐于List,使指定item完全处于显示区。|
842
843## ScrollToIndexOptions<sup>12+</sup>对象说明
844
845滑动到指定Index的参数选项。
846
847**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
848
849**系统能力:** SystemCapability.ArkUI.ArkUI.Full
850
851| 名称   | 类型  | 必填 | 说明              |
852| ----- | ------ | ------ | ----------------- |
853| extraOffset | [LengthMetrics](../js-apis-arkui-graphics.md#lengthmetrics12) | 否 | 滑动到指定Index的额外偏移量。 |
854
855## ScrollPageOptions<sup>14+</sup>对象说明
856
857翻页模式的参数选项。
858
859**原子化服务API:** 从API version 14开始,该接口支持在原子化服务中使用。
860
861**系统能力:** SystemCapability.ArkUI.ArkUI.Full
862
863| 名称    | 类型 | 必填 | 说明                                                     |
864| --------- | -------- | ---- | ------------------------------------------------------------ |
865| next      | boolean  | 是   | 是否向下翻页。true表示向下翻页,false表示向上翻页。          |
866| animation | boolean  | 否   | 是否开启翻页动画效果。true有动画,false无动画。<br />默认值:false。 |
867
868## OffsetOptions<sup>12+</sup>对象说明
869
870初始滚动偏移量的参数选项。
871
872**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
873
874**系统能力:** SystemCapability.ArkUI.ArkUI.Full
875
876| 名称   | 类型  | 必填 | 说明              |
877| ----- | ------| ------- | ----------------- |
878| xOffset | [Dimension](ts-types.md#dimension10) | 否 |水平滚动偏移。<br/>默认值:0 |
879| yOffset | [Dimension](ts-types.md#dimension10) | 否 |垂直滚动偏移。<br/>默认值:0|
880
881## ScrollEdgeOptions<sup>12+</sup>对象说明
882
883滚动到边缘位置的参数选项。
884
885**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
886
887**系统能力:** SystemCapability.ArkUI.ArkUI.Full
888
889| 名称    | 类型 | 必填 | 说明                                                   |
890| --------- | -------- | ---- | ------------------------------------------------------------ |
891| velocity      | number  | 否   | 设置滚动到容器边缘的固定速度。如果设置小于等于0的值,参数不生效。<br/>默认值:0<br/>  单位: vp/s          |
892
893## ScrollOptions<sup>18+</sup>对象说明
894
895滚动到指定位置的参数选项。
896
897**原子化服务API:** 从API version 18开始,该接口支持在原子化服务中使用。
898
899**系统能力:** SystemCapability.ArkUI.ArkUI.Full
900
901| 名称    | 类型                                                     | 必填 | 说明                                                     |
902| --------- | ------------------------------------------------------------ | ---- | ------------------------------------------------------------ |
903| xOffset<sup>10+</sup>   | number&nbsp;\|&nbsp;string                                   | 是   | 水平滚动偏移。<br/>**说明:** <br/>该参数值不支持设置百分比。<br/>仅滚动轴为x轴时生效。<br/>取值范围:当值小于0时,不带动画的滚动,按0处理。带动画的滚动,默认滚动到起始位置后停止,可通过设置animation参数,使滚动在越界时启动回弹动画。<br/>**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。|
904| yOffset<sup>10+</sup>   | number&nbsp;\|&nbsp;string                                   | 是   | 垂直滚动偏移。<br/>**说明:** <br/>该参数值不支持设置百分比。<br/>仅滚动轴为y轴时生效。<br/>取值范围:当值小于0时,不带动画的滚动,按0处理。带动画的滚动,默认滚动到起始位置后停止,可通过设置animation参数,使滚动在越界时启动回弹动画。<br/>**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。|
905| animation<sup>10+</sup> | [ScrollAnimationOptions](#scrollanimationoptions12对象说明)&nbsp;\|&nbsp;boolean | 否   | 动画配置。<br/>- ScrollAnimationOptions:&nbsp; 自定义滚动动效。 <br/>- boolean:&nbsp;使能默认弹簧动效。<br/>默认值:<br/>ScrollAnimationOptions: { duration: 1000, curve: Curve.Ease, canOverScroll: false } <br/>boolean:&nbsp;false<br/>**说明:** <br/>当前List、Scroll、Grid、WaterFlow均支持boolean类型和ICurve曲线。<br/>**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。 |
906
907## 示例
908### 示例1(设置scroller控制器)
909该示例展示了Scroll组件部分属性和scroller控制器的使用。
910
911```ts
912// xxx.ets
913import { curves } from '@kit.ArkUI'
914
915@Entry
916@Component
917struct ScrollExample {
918  scroller: Scroller = new Scroller()
919  private arr: number[] = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
920
921  build() {
922    Stack({ alignContent: Alignment.TopStart }) {
923      Scroll(this.scroller) {
924        Column() {
925          ForEach(this.arr, (item: number) => {
926            Text(item.toString())
927              .width('90%')
928              .height(150)
929              .backgroundColor(0xFFFFFF)
930              .borderRadius(15)
931              .fontSize(16)
932              .textAlign(TextAlign.Center)
933              .margin({ top: 10 })
934          }, (item: string) => item)
935        }.width('100%')
936      }
937      .scrollable(ScrollDirection.Vertical) // 滚动方向纵向
938      .scrollBar(BarState.On) // 滚动条常驻显示
939      .scrollBarColor(Color.Gray) // 滚动条颜色
940      .scrollBarWidth(10) // 滚动条宽度
941      .friction(0.6)
942      .edgeEffect(EdgeEffect.None)
943      .onWillScroll((xOffset: number, yOffset: number, scrollState: ScrollState) => {
944        console.info(xOffset + ' ' + yOffset)
945      })
946      .onScrollEdge((side: Edge) => {
947        console.info('To the edge')
948      })
949      .onScrollStop(() => {
950        console.info('Scroll Stop')
951      })
952
953      Button('scroll 150')
954        .height('5%')
955        .onClick(() => { // 点击后下滑指定距离150.0vp
956          this.scroller.scrollBy(0, 150)
957        })
958        .margin({ top: 10, left: 20 })
959      Button('scroll 100')
960        .height('5%')
961        .onClick(() => { // 点击后滑动到指定位置,即下滑100.0vp的距离
962          const yOffset: number = this.scroller.currentOffset().yOffset;
963          this.scroller.scrollTo({ xOffset: 0, yOffset: yOffset + 100 })
964        })
965        .margin({ top: 60, left: 20 })
966      Button('scroll 100')
967        .height('5%')
968        .onClick(() => { // 点击后滑动到指定位置,即下滑100.0vp的距离,滑动过程配置有动画
969          let curve = curves.interpolatingSpring(10, 1, 228, 30) //创建一个阶梯曲线
970          const yOffset: number = this.scroller.currentOffset().yOffset;
971          this.scroller.scrollTo({ xOffset: 0, yOffset: yOffset + 100, animation: { duration: 1000, curve: curve } })
972        })
973        .margin({ top: 110, left: 20 })
974      Button('back top')
975        .height('5%')
976        .onClick(() => { // 点击后回到顶部
977          this.scroller.scrollEdge(Edge.Top)
978        })
979        .margin({ top: 160, left: 20 })
980      Button('next page')
981        .height('5%')
982        .onClick(() => { // 点击后滑到下一页
983          this.scroller.scrollPage({ next: true ,animation: true })
984        })
985        .margin({ top: 210, left: 20 })
986      Button('fling -3000')
987        .height('5%')
988        .onClick(() => { // 点击后触发初始速度为-3000vp/s的惯性滚动
989          this.scroller.fling(-3000)
990        })
991        .margin({ top: 260, left: 20 })
992      Button('scroll to bottom 700')
993        .height('5%')
994        .onClick(() => { // 点击后滑到下边缘,速度值是700vp/s
995          this.scroller.scrollEdge(Edge.Bottom, { velocity: 700 })
996        })
997        .margin({ top: 310, left: 20 })
998    }.width('100%').height('100%').backgroundColor(0xDCDCDC)
999  }
1000}
1001```
1002
1003![zh-cn_image_0000001174104386](figures/scroll_scroller.gif)
1004
1005### 示例2(嵌套滚动实现方式一)
1006该示例使用onScrollFrameBegin事件实现了内层List组件和外层Scroll组件的嵌套滚动。
1007```ts
1008import { LengthMetrics } from '@kit.ArkUI'
1009
1010@Entry
1011@Component
1012struct NestedScroll {
1013  @State listPosition: number = 0; // 0代表滚动到List顶部,1代表中间值,2代表滚动到List底部。
1014  private arr: number[] = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
1015  private scrollerForScroll: Scroller = new Scroller()
1016  private scrollerForList: Scroller = new Scroller()
1017
1018  build() {
1019    Flex() {
1020      Scroll(this.scrollerForScroll) {
1021        Column() {
1022          Text("Scroll Area")
1023            .width("100%")
1024            .height("40%")
1025            .backgroundColor(0X330000FF)
1026            .fontSize(16)
1027            .textAlign(TextAlign.Center)
1028            .onClick(() => {
1029              this.scrollerForList.scrollToIndex(5, false, ScrollAlign.START, { extraOffset: LengthMetrics.vp(5) })
1030            })
1031
1032          List({ space: 20, scroller: this.scrollerForList }) {
1033            ForEach(this.arr, (item: number) => {
1034              ListItem() {
1035                Text("ListItem" + item)
1036                  .width("100%")
1037                  .height("100%")
1038                  .borderRadius(15)
1039                  .fontSize(16)
1040                  .textAlign(TextAlign.Center)
1041                  .backgroundColor(Color.White)
1042              }.width("100%").height(100)
1043            }, (item: string) => item)
1044          }
1045          .width("100%")
1046          .height("50%")
1047          .edgeEffect(EdgeEffect.None)
1048          .friction(0.6)
1049          .onReachStart(() => {
1050            this.listPosition = 0
1051          })
1052          .onReachEnd(() => {
1053            this.listPosition = 2
1054          })
1055          .onScrollFrameBegin((offset: number) => {
1056            if ((this.listPosition == 0 && offset <= 0) || (this.listPosition == 2 && offset >= 0)) {
1057              this.scrollerForScroll.scrollBy(0, offset)
1058              return { offsetRemain: 0 }
1059            }
1060            this.listPosition = 1
1061            return { offsetRemain: offset };
1062          })
1063
1064          Text("Scroll Area")
1065            .width("100%")
1066            .height("40%")
1067            .backgroundColor(0X330000FF)
1068            .fontSize(16)
1069            .textAlign(TextAlign.Center)
1070        }
1071      }
1072      .width("100%").height("100%")
1073    }.width('100%').height('100%').backgroundColor(0xDCDCDC).padding(20)
1074  }
1075}
1076```
1077
1078![NestedScroll](figures/NestedScroll.gif)
1079
1080### 示例3(嵌套滚动实现方式二)
1081该示例使用nestedScroll属性实现了内层List组件和外层Scroll组件的嵌套滚动。
1082```ts
1083@Entry
1084@Component
1085struct StickyNestedScroll {
1086  @State arr: number[] = []
1087
1088  @Styles
1089  listCard() {
1090    .backgroundColor(Color.White)
1091    .height(72)
1092    .width("100%")
1093    .borderRadius(12)
1094  }
1095
1096  build() {
1097    Scroll() {
1098      Column() {
1099        Text("Scroll Area")
1100          .width("100%")
1101          .height("40%")
1102          .backgroundColor('#0080DC')
1103          .textAlign(TextAlign.Center)
1104        Tabs({ barPosition: BarPosition.Start }) {
1105          TabContent() {
1106            List({ space: 10 }) {
1107              ForEach(this.arr, (item: number) => {
1108                ListItem() {
1109                  Text("item" + item)
1110                    .fontSize(16)
1111                }.listCard()
1112              }, (item: string) => item)
1113            }.width("100%")
1114            .edgeEffect(EdgeEffect.Spring)
1115            .nestedScroll({
1116              scrollForward: NestedScrollMode.PARENT_FIRST,
1117              scrollBackward: NestedScrollMode.SELF_FIRST
1118            })
1119          }.tabBar("Tab1")
1120
1121          TabContent() {
1122          }.tabBar("Tab2")
1123        }
1124        .vertical(false)
1125        .height("100%")
1126      }.width("100%")
1127    }
1128    .edgeEffect(EdgeEffect.Spring)
1129    .friction(0.6)
1130    .backgroundColor('#DCDCDC')
1131    .scrollBar(BarState.Off)
1132    .width('100%')
1133    .height('100%')
1134  }
1135
1136  aboutToAppear() {
1137    for (let i = 0; i < 30; i++) {
1138      this.arr.push(i)
1139    }
1140  }
1141}
1142```
1143![NestedScroll2](figures/NestedScroll2.gif)
1144### 示例4(嵌套滚动父组件向子组件传递滚动)
1145该示例使用enableScrollInteraction属性和onScrollFrameBegin事件实现了父组件向子组件传递滚动。
1146```ts
1147@Entry
1148@Component
1149struct NestedScroll {
1150  private headerHeight: number = 0;
1151  private arr: number[] = []
1152  private scrollerForParent: Scroller = new Scroller()
1153  private scrollerForChild: Scroller = new Scroller()
1154
1155  aboutToAppear(): void {
1156    for (let i = 0; i < 10; i++) {
1157      this.arr.push(i)
1158    }
1159  }
1160
1161  build() {
1162    Scroll(this.scrollerForParent) {
1163      Column() {
1164        Text("Scroll Area")
1165          .width("100%")
1166          .height("40%")
1167          .backgroundColor(0X330000FF)
1168          .fontSize(16)
1169          .textAlign(TextAlign.Center)
1170          .onClick(() => {
1171            this.scrollerForChild.scrollToIndex(5)
1172          })
1173          .onSizeChange((oldValue: SizeOptions, newValue: SizeOptions) => {
1174            this.headerHeight = newValue.height! as number
1175          })
1176        List({ space: 20, scroller: this.scrollerForChild }) {
1177          ForEach(this.arr, (item: number) => {
1178            ListItem() {
1179              Text("ListItem" + item)
1180                .width("100%")
1181                .height("100%")
1182                .borderRadius(15)
1183                .fontSize(16)
1184                .textAlign(TextAlign.Center)
1185                .backgroundColor(Color.White)
1186            }.width("100%").height(100)
1187          }, (item: string) => item)
1188        }
1189        .width("100%")
1190        .height("100%")
1191        .edgeEffect(EdgeEffect.None)
1192        .scrollBar(BarState.Off)
1193        .enableScrollInteraction(false)
1194
1195        Text("Scroll Area")
1196          .width("100%")
1197          .height("40%")
1198          .backgroundColor(0X330000FF)
1199          .fontSize(16)
1200          .textAlign(TextAlign.Center)
1201      }
1202    }
1203    .scrollBar(BarState.Off)
1204    .edgeEffect(EdgeEffect.Spring)
1205    .onScrollFrameBegin((offset: number, state: ScrollState) => {
1206      let retOffset = offset;
1207      let currOffset = this.scrollerForParent.currentOffset().yOffset;
1208      let newOffset = currOffset + offset;
1209      if (offset > 0) {
1210        if (this.scrollerForChild.isAtEnd()) {
1211          return { offsetRemain: offset }
1212        }
1213        if (newOffset > this.headerHeight) {
1214          retOffset = this.headerHeight - currOffset
1215        }
1216        this.scrollerForChild.scrollBy(0, offset - retOffset)
1217      } else {
1218        if (this.scrollerForChild.currentOffset().yOffset <= 0) {
1219          return { offsetRemain: offset }
1220        }
1221        if (newOffset < this.headerHeight) {
1222          retOffset = this.headerHeight - currOffset
1223        }
1224        this.scrollerForChild.scrollBy(0, offset - retOffset)
1225      }
1226      return { offsetRemain: retOffset }
1227    })
1228    .width("100%")
1229    .height("100%")
1230    .backgroundColor(0xDCDCDC)
1231  }
1232}
1233```
1234![NestedScroll3](figures/NestedScroll3.gif)
1235### 示例5(设置限位滚动)
1236该示例实现了Scroll组件的限位滚动。
1237```ts
1238@Entry
1239@Component
1240struct Index {
1241  scroller: Scroller = new Scroller;
1242  private arr: number[] = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15]
1243  build() {
1244    Scroll(this.scroller) {
1245      Column() {
1246        ForEach(this.arr, (item: number) => {
1247          Text(item.toString())
1248            .width('90%')
1249            .height(200)
1250            .backgroundColor(0xFFFFFF)
1251            .borderWidth(1)
1252            .borderColor(Color.Black)
1253            .borderRadius(15)
1254            .fontSize(16)
1255            .textAlign(TextAlign.Center)
1256        }, (item: string) => item)
1257      }.width('100%').backgroundColor(0xDCDCDC)
1258    }
1259    .backgroundColor(Color.Yellow)
1260    .height('100%')
1261    .edgeEffect(EdgeEffect.Spring)
1262    .scrollSnap({snapAlign:ScrollSnapAlign.START, snapPagination:400, enableSnapToStart:true, enableSnapToEnd:true})
1263  }
1264}
1265```
1266![NestedScrollSnap](figures/NestedScrollSnap.gif)
1267
1268### 示例6(获取子组件索引)
1269该示例展示了如何获得List组件的子组件索引。
1270
1271```ts
1272// xxx.ets
1273@Entry
1274@Component
1275struct ListExample {
1276  private arr: number[] = []
1277  private scroller: ListScroller = new ListScroller()
1278  @State listSpace: number = 10
1279  @State listChildrenSize: ChildrenMainSize = new ChildrenMainSize(100)
1280  @State listIndex: number = -1
1281  @State mess:string = "null"
1282  @State itemBackgroundColorArr: boolean[] = [false]
1283  aboutToAppear(){
1284    // 初始化数据源。
1285    for (let i = 0; i < 10; i++) {
1286      this.arr.push(i)
1287    }
1288    this.listChildrenSize.splice(0, 5, [100, 100, 100, 100, 100])
1289  }
1290  build() {
1291    Column() {
1292      List({ space: this.listSpace, initialIndex: 4, scroller: this.scroller }) {
1293        ForEach(this.arr, (item: number) => {
1294          ListItem() {
1295            Text('item-' + item)
1296              .height( item < 5 ? 100 : this.listChildrenSize.childDefaultSize)
1297              .width('90%')
1298              .fontSize(16)
1299              .textAlign(TextAlign.Center)
1300              .borderRadius(10)
1301              .backgroundColor( this.itemBackgroundColorArr[item] ? 0x68B4FF: 0xFFFFFF)
1302          }
1303        }, (item: string) => item)
1304      }
1305      .backgroundColor(Color.Gray)
1306      .layoutWeight(1)
1307      .scrollBar(BarState.On)
1308      .childrenMainSize(this.listChildrenSize)
1309      .alignListItem(ListItemAlign.Center)
1310      .gesture(
1311        PanGesture()
1312          .onActionUpdate((event: GestureEvent) => {
1313            if (event.fingerList[0] != undefined && event.fingerList[0].localX != undefined && event.fingerList[0].localY != undefined) {
1314              this.listIndex = this.scroller.getItemIndex(event.fingerList[0].localX, event.fingerList[0].localY)
1315              this.itemBackgroundColorArr[this.listIndex] = true;
1316            }
1317          })
1318      )
1319      .gesture(
1320        TapGesture({ count: 1 })
1321          .onAction((event: GestureEvent) => {
1322            if (event) {
1323              this.itemBackgroundColorArr.splice(0,this.itemBackgroundColorArr.length);
1324            }
1325          })
1326      )
1327
1328      Text('您当前位置Item索引为:'+ this.listIndex)
1329        .fontColor(Color.Red)
1330        .height(50)
1331    }
1332  }
1333}
1334```
1335
1336![ScrollEdgeAtVelocity](figures/getItemIndex_list.gif)
1337
1338### 示例7(设置边缘渐隐)
1339该示例实现了Scroll组件开启边缘渐隐效果并设置边缘渐隐长度。
1340
1341```ts
1342// xxx.ets
1343import { LengthMetrics } from '@kit.ArkUI'
1344@Entry
1345@Component
1346struct ScrollExample {
1347  scroller: Scroller = new Scroller()
1348  private arr: number[] = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]
1349
1350  build() {
1351    Stack({ alignContent: Alignment.TopStart }) {
1352      Scroll(this.scroller) {
1353        Column() {
1354          ForEach(this.arr, (item: number) => {
1355            Text(item.toString())
1356              .width('90%')
1357              .height(150)
1358              .backgroundColor(0xFFFFFF)
1359              .borderRadius(15)
1360              .fontSize(16)
1361              .textAlign(TextAlign.Center)
1362              .margin({ top: 10 })
1363          }, (item: string) => item)
1364        }.width('100%')
1365      }
1366      .fadingEdge(true,{fadingEdgeLength:LengthMetrics.vp(80)})
1367
1368
1369
1370    }.width('100%').height('100%').backgroundColor(0xDCDCDC)
1371  }
1372}
1373```
1374
1375![fadingEdge_scroll](figures/fadingEdge_scroll.gif)
1376
1377### 示例8(单边边缘效果)
1378
1379该示例通过edgeEffect接口,实现了Scroll组件设置单边边缘效果。
1380
1381```ts
1382// xxx.ets
1383@Entry
1384@Component
1385struct ScrollExample {
1386  scroller: Scroller = new Scroller()
1387  private arr: number[] = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]
1388
1389  build() {
1390    Stack({ alignContent: Alignment.TopStart }) {
1391      Scroll(this.scroller) {
1392        Column() {
1393          ForEach(this.arr, (item: number) => {
1394            Text(item.toString())
1395              .width('90%')
1396              .height(150)
1397              .backgroundColor(0xFFFFFF)
1398              .borderRadius(15)
1399              .fontSize(16)
1400              .textAlign(TextAlign.Center)
1401              .margin({ top: 10 })
1402          }, (item: string) => item)
1403        }.width('100%')
1404      }
1405      .edgeEffect(EdgeEffect.Spring,{alwaysEnabled:true,effectEdge:EffectEdge.START})
1406    }.width('100%').height('100%').backgroundColor(0xDCDCDC)
1407  }
1408}
1409```
1410
1411![edgeEffect_scroll](figures/edgeEffect_scroll.gif)