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