• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1# Scroll
2
3<!--Kit: ArkUI-->
4<!--Subsystem: ArkUI-->
5<!--Owner: @shengu_lancer; @yylong-->
6<!--Designer: @yylong-->
7<!--Tester: @liuzhenshuo-->
8<!--Adviser: @HelloCrease-->
9
10可滚动的容器组件,当子组件的布局尺寸超过父组件的尺寸时,内容可以滚动。
11
12>  **说明:**
13>  - 该组件从API version 7开始支持。后续版本如有新增内容,则采用上角标单独标记该内容的起始版本。
14>  - 该组件嵌套List子组件滚动时,若List不设置宽高,则默认全部加载,在对性能有要求的场景下建议指定List的宽高,最佳实践请参考[懒加载优化性能-Scroll嵌套List导致按需加载失效](https://developer.huawei.com/consumer/cn/doc/best-practices/bpta-lazyforeach-optimization#section6296154115367)15>  - 该组件滚动的前提是主轴方向大小小于内容大小。
16>  - Scroll组件[通用属性clip](ts-universal-attributes-sharp-clipping.md)的默认值为true。
17>  - Scroll组件的高度超出屏幕显示范围时,可以通过设置通用属性[layoutWeight](ts-universal-attributes-size.md#layoutweight)让Scroll高度适应主轴的剩余空间。
18>  - 手指触摸屏幕时,会停止当前触摸范围内所有滚动组件的滚动动画([scrollTo](#scrollto)和[scrollToIndex](#scrolltoindex)接口触发的滚动动画除外),包括边缘回弹动画。
19>  - 组件内部已绑定手势实现跟手滚动等功能,需要增加自定义手势操作时请参考[手势拦截增强](ts-gesture-blocking-enhancement.md)进行处理。
20
21## 子组件
22
23支持单个子组件。
24
25
26## 接口
27
28Scroll(scroller?: Scroller)
29
30创建Scroll滚动容器。
31
32**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。
33
34**系统能力:** SystemCapability.ArkUI.ArkUI.Full
35
36**参数:**
37
38| 参数名 | 类型 | 必填 | 说明 |
39| -------- | -------- | -------- | -------- |
40| 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)绑定同一个滚动控制对象。 |
41
42## 属性
43
44除支持[通用属性](ts-component-general-attributes.md)和[滚动组件通用属性](ts-container-scrollable-common.md#属性)外,还支持以下属性:
45
46### scrollable
47
48scrollable(value: ScrollDirection)
49
50设置滚动方向。
51
52**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。
53
54**系统能力:** SystemCapability.ArkUI.ArkUI.Full
55
56**参数:**
57
58| 参数名 | 类型                                        | 必填 | 说明                                            |
59| ------ | ------------------------------------------- | ---- | ----------------------------------------------- |
60| value  | [ScrollDirection](#scrolldirection枚举说明) | 是   | 滚动方向。<br/>默认值:ScrollDirection.Vertical |
61
62当滚动方向设置为[ScrollDirection.FREE](#scrolldirection枚举说明)时,Scroll组件仅支持部分能力,见[自由滚动模式下支持的能力](#scrolldirection枚举说明)。
63
64### scrollBar
65
66scrollBar(barState: BarState)
67
68设置滚动条状态。如果容器组件无法滚动,则滚动条不显示。如果容器组件的子组件大小为无穷大,则滚动条不支持拖动和伴随滚动。
69
70从API version 10开始,当滚动组件存在圆角时,为避免滚动条被圆角截断,滚动条会自动计算距顶部和底部的避让距离。
71
72**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。
73
74**系统能力:** SystemCapability.ArkUI.ArkUI.Full
75
76**参数:**
77
78| 参数名   | 类型                                      | 必填 | 说明                                   |
79| -------- | ----------------------------------------- | ---- | -------------------------------------- |
80| barState | [BarState](ts-appendix-enums.md#barstate) | 是   | 滚动条状态。<br/>默认值:BarState.Auto |
81
82### scrollBarColor
83
84scrollBarColor(color: Color | number | string)
85
86设置滚动条的颜色。
87
88**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。
89
90**系统能力:** SystemCapability.ArkUI.ArkUI.Full
91
92**参数:**
93
94| 参数名 | 类型                                                         | 必填 | 说明           |
95| ------ | ------------------------------------------------------------ | ---- | -------------- |
96| color  | [Color](ts-appendix-enums.md#color)&nbsp;\|&nbsp;number&nbsp;\|&nbsp;string | 是   | 滚动条的颜色。<br/>默认值:'\#66182431'<br/>number为HEX格式颜色,支持rgb或者argb,示例:0xffffff。string为rgb或者argb格式颜色,示例:'#ffffff'。   |
97
98### scrollBarWidth
99
100scrollBarWidth(value: number | string)
101
102设置滚动条的宽度,不支持百分比设置。宽度设置后,滚动条正常状态和按压状态宽度均为滚动条的宽度值。如果滚动条的宽度超过Scroll组件主轴方向的高度,则滚动条的宽度会变为默认值。
103
104**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。
105
106**系统能力:** SystemCapability.ArkUI.ArkUI.Full
107
108**参数:**
109
110| 参数名 | 类型                       | 必填 | 说明                                      |
111| ------ | -------------------------- | ---- | ----------------------------------------- |
112| value  | number&nbsp;\|&nbsp;string | 是   | 滚动条的宽度。<br/>默认值:4<br/>单位:vp <br/>取值范围:设置为小于0的值时,按默认值处理。设置为0时,不显示滚动条。|
113
114### scrollSnap<sup>10+</sup>
115
116scrollSnap(value: ScrollSnapOptions)
117
118设置Scroll组件的限位滚动模式。
119
120限位动画期间onWillScroll事件上报的滚动操作来源类型为ScrollSource.FLING121
122**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。
123
124**系统能力:** SystemCapability.ArkUI.ArkUI.Full
125
126**参数:**
127
128| 参数名 | 类型                                      | 必填 | 说明                       |
129| ------ | ----------------------------------------- | ---- | -------------------------- |
130| value  | [ScrollSnapOptions](#scrollsnapoptions10对象说明) | 是   | Scroll组件的限位滚动模式。 |
131
132### edgeEffect
133
134edgeEffect(edgeEffect: EdgeEffect, options?: EdgeEffectOptions)
135
136设置边缘滑动效果。
137
138**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。
139
140**系统能力:** SystemCapability.ArkUI.ArkUI.Full
141
142**参数:**
143
144| 参数名                | 类型                                              | 必填 | 说明                                                         |
145| --------------------- | ------------------------------------------------- | ---- | ------------------------------------------------------------ |
146| edgeEffect            | [EdgeEffect](ts-appendix-enums.md#edgeeffect)     | 是   | Scroll组件的边缘滑动效果,支持弹簧效果和阴影效果。<br/>默认值:EdgeEffect.None |
147| options<sup>11+</sup> | [EdgeEffectOptions](ts-container-scrollable-common.md#edgeeffectoptions11对象说明) | 否   | 组件内容大小小于组件自身时,是否开启滑动效果。设置为{ alwaysEnabled: true }会开启滑动效果,{ alwaysEnabled: false }不开启。<br/>默认值:{ alwaysEnabled: true } |
148
149### enableScrollInteraction<sup>10+</sup>
150
151enableScrollInteraction(value: boolean)
152
153设置是否支持滚动手势。
154
155**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。
156
157**系统能力:** SystemCapability.ArkUI.ArkUI.Full
158
159**参数:**
160
161| 参数名 | 类型    | 必填 | 说明                                |
162| ------ | ------- | ---- | ----------------------------------- |
163| value  | boolean | 是   | 是否支持滚动手势。设置为true时可以通过手指或者鼠标滚动,设置为false时无法通过手指或者鼠标滚动,但不影响控制器[Scroller](ts-container-scroll.md#scroller)的滚动接口。<br/>默认值:true |
164
165> **说明:**
166>
167> 组件无法通过鼠标按下拖动操作进行滚动。
168
169### nestedScroll<sup>10+</sup>
170
171nestedScroll(value: NestedScrollOptions)
172
173设置前后两个方向的嵌套滚动模式,实现与父组件的滚动联动。
174
175**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。
176
177**系统能力:** SystemCapability.ArkUI.ArkUI.Full
178
179**参数:**
180
181| 参数名 | 类型                                                  | 必填 | 说明           |
182| ------ | ----------------------------------------------------- | ---- | -------------- |
183| value  | [NestedScrollOptions](ts-container-scrollable-common.md#nestedscrolloptions10对象说明) | 是   | 嵌套滚动选项。<br/>默认值:{ scrollForward: NestedScrollMode.SELF_ONLY, scrollBackward: NestedScrollMode.SELF_ONLY }<br/>Scroll设置[enablePaging](#enablepaging11)或者[scrollSnap](#scrollsnap10),并同时设置父组件优先的嵌套滚动时,嵌套滚动不生效。|
184
185### friction<sup>10+</sup>
186
187friction(value: number | Resource)
188
189设置摩擦系数,手动划动滚动区域时生效,仅影响惯性滚动过程,对惯性滚动过程中的链式效果有间接影响。
190
191**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。
192
193**系统能力:** SystemCapability.ArkUI.ArkUI.Full
194
195**参数:**
196
197| 参数名 | 类型                                                 | 必填 | 说明                                                      |
198| ------ | ---------------------------------------------------- | ---- | --------------------------------------------------------- |
199| 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的值时,按默认值处理。 |
200
201### enablePaging<sup>11+</sup>
202
203enablePaging(value: boolean)
204
205设置是否支持划动翻页。如果同时设置了划动翻页enablePaging和限位滚动scrollSnap,则scrollSnap优先生效,enablePaging不生效。
206
207**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
208
209**系统能力:** SystemCapability.ArkUI.ArkUI.Full
210
211**参数:**
212
213| 参数名 | 类型    | 必填 | 说明                                  |
214| ------ | ------- | ---- | ------------------------------------- |
215| value  | boolean | 是   | 是否支持划动翻页。设置为true支持滑动翻页,false不支持。 <br/>默认值:false |
216
217### initialOffset<sup>12+</sup>
218
219initialOffset(value: OffsetOptions)
220
221设置初始滚动偏移量。只在首次布局时生效,后续动态修改该属性值不生效。
222
223**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
224
225**系统能力:** SystemCapability.ArkUI.ArkUI.Full
226
227**参数:**
228
229| 参数名 | 类型    | 必填 | 说明                                  |
230| ------ | ------- | ---- | ------------------------------------- |
231| value  | [OffsetOptions](#offsetoptions12对象说明)  | 是   |当输入的大小为百分比时,初始滚动偏移量为Scroll组件主轴方向大小与百分比数值之积。|
232
233### maxZoomScale<sup>20+</sup>
234
235maxZoomScale(scale: number)
236
237设置Scroll组件内容的最大手势缩放比例。
238
239**原子化服务API:** 从API version 20开始,该接口支持在原子化服务中使用。
240
241**系统能力:** SystemCapability.ArkUI.ArkUI.Full
242
243**参数:**
244
245| 参数名 | 类型    | 必填 | 说明                                  |
246| ------ | ------- | ---- | ------------------------------------- |
247| scale  | number  | 是   |Scroll组件内容的最大手势缩放比例。<br>默认值:1<br>取值范围:(0, +∞),小于或等于0时按默认值1处理。|
248
249### minZoomScale<sup>20+</sup>
250
251minZoomScale(scale: number)
252
253设置Scroll组件内容的最小手势缩放比例。
254
255**原子化服务API:** 从API version 20开始,该接口支持在原子化服务中使用。
256
257**系统能力:** SystemCapability.ArkUI.ArkUI.Full
258
259**参数:**
260
261| 参数名 | 类型    | 必填 | 说明                                  |
262| ------ | ------- | ---- | ------------------------------------- |
263| scale  | number  | 是   |Scroll组件内容的最小手势缩放比例。<br>默认值:1<br>取值范围:(0, maxZoomScale],小于或等于0时按默认值1处理,大于maxZoomScale时按maxZoomScale处理。|
264
265>  **说明:**
266>
267>  当maxZoomScale和minZoomScale不同时为1时,Scroll组件会启用缩放手势。
268
269### zoomScale<sup>20+</sup>
270
271zoomScale(scale: number)
272
273设置Scroll组件内容的缩放比例。
274
275**原子化服务API:** 从API version 20开始,该接口支持在原子化服务中使用。
276
277**系统能力:** SystemCapability.ArkUI.ArkUI.Full
278
279**参数:**
280
281| 参数名 | 类型    | 必填 | 说明                                  |
282| ------ | ------- | ---- | ------------------------------------- |
283| scale  | number  | 是   |设置Scroll组件内容的缩放比例,该参数支持[!!](../../../ui/state-management/arkts-new-binding.md)双向绑定变量。<br>默认值:1<br>取值范围:(0, +∞),小于或等于0时按默认值1处理。|
284
285### enableBouncesZoom<sup>20+</sup>
286
287enableBouncesZoom(enable: boolean)
288
289启用过缩放回弹效果。
290
291**原子化服务API:** 从API version 20开始,该接口支持在原子化服务中使用。
292
293**系统能力:** SystemCapability.ArkUI.ArkUI.Full
294
295**参数:**
296
297| 参数名 | 类型    | 必填 | 说明                                  |
298| ------ | ------- | ---- | ------------------------------------- |
299| enable  | boolean  | 是   |启用过缩放回弹效果。设置为true表示启用该效果,设置为false表示禁用该效果。<br>默认值:true |
300
301## ScrollDirection枚举说明
302
303滚动方向枚举。
304
305**系统能力:** SystemCapability.ArkUI.ArkUI.Full
306
307| 名称       | 值 | 说明                   |
308| ---------- | -- | ------------------------ |
309| Vertical   | 0  | 仅支持竖直方向滚动。<br/>**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。|
310| Horizontal | 1  | 仅支持水平方向滚动。<br/>**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。|
311| Free<sup>(deprecated) </sup> | 2 | 支持竖直或水平方向滚动。<br/> 从API version 9开始废弃,从API version 20开始推荐使用FREE。|
312| None       | 3 | 不可滚动。<br/>**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。|
313| FREE<sup>20+</sup>   | 4 | 自由滚动。<br/>**原子化服务API:** 从API version 20开始,该接口支持在原子化服务中使用。|
314
315FREE(自由滚动)模式下支持的能力:
316
317| **支持的属性** | **支持的事件** | **支持的[Scroller](#scroller)接口** |
318| :--- | :--- | :--- |
319| [scrollBar](#scrollbar) | [onWillScroll](#onwillscroll12) | [scrollTo](#scrollto) |
320| [scrollBarColor](#scrollbarcolor) | [onDidScroll](#ondidscroll12) | [scrollEdge](#scrolledge) |
321| [scrollBarWidth](#scrollbarwidth) | [onScrollEdge](#onscrolledge) | [scrollPage](#scrollpage9) |
322| [scrollBarMargin](./ts-container-scrollable-common.md#scrollbarmargin20) | [onScrollStart](#onscrollstart9) | [currentOffset](#currentoffset) |
323| [edgeEffect](#edgeeffect) | [onScrollStop](#onscrollstop9) | [scrollBy](#scrollby9) |
324| [enableScrollInteraction](#enablescrollinteraction10) | - | [getItemRect](#getitemrect11) |
325| [friction](#friction10) | - | - |
326| [clipContent](./ts-container-scrollable-common.md#clipcontent14) | - | - |
327| [initialOffset](#initialoffset12) | - | - |
328| [scrollable](#scrollable) | - | - |
329
330>  **说明:**
331>  - `edgeEffect`属性仅支持`Spring`和`None`边缘滑动效果。
332>  - `onWillScroll`回调仅支持在跟手滑动阶段重载偏移量。
333>  - `onScrollEdge`回调只在到达边缘时触发一次,回弹后不会重复触发。
334>  - 在抛滑动画过程中切换边缘模式不会打断动画。
335
336## ScrollSnapOptions<sup>10+</sup>对象说明
337
338限位滚动模式对象。
339
340**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。
341
342**系统能力:** SystemCapability.ArkUI.ArkUI.Full
343
344| 名称       | 类型    | 只读   | 可选 | 说明       |
345| ---------- | --------------------|-------------------- | -- | -------- |
346| snapAlign  | [ScrollSnapAlign](ts-container-list.md#scrollsnapalign10枚举说明)   | 否 | 否 | 设置Scroll组件限位滚动时的对齐方式。<br/>**说明:** <br/>1.该属性默认值为ScrollSnapAlign.NONE。 |
347| 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组件的视口与百分比数值之积。 |
348| enableSnapToStart | boolean   | 否 | 是 | 在Scroll组件限位滚动模式下,该属性设置为true后,不允许Scroll在开头和第一页间自由滑动,该属性设置为false后,允许Scroll在开头和第一页间自由滑动。<br/>**说明:** <br/>1.该属性值默认为true。<br/>2.该属性仅当snapPagination属性为Array\<Dimension\>时生效,不支持Dimension。 |
349| enableSnapToEnd | boolean   | 否 | 是 | 在Scroll组件限位滚动模式下,该属性设置为true后,不允许Scroll在最后一页和末尾间自由滑动,该属性设置为false后,允许Scroll在最后一页和末尾间自由滑动。<br/>**说明:** <br/>1.该属性值默认为true。<br/>2.该属性仅当snapPagination属性为Array\<Dimension\>时生效,不支持Dimension。 |
350
351## 事件
352
353除支持[通用事件](ts-component-general-events.md)和[滚动组件通用事件](ts-container-scrollable-common.md#事件)外,还支持以下事件:
354>  **说明:**
355>
356>  不支持滚动组件通用事件中的[onWillScroll](ts-container-scrollable-common.md#onwillscroll12)、[onDidScroll](ts-container-scrollable-common.md#ondidscroll12)事件。
357
358### onScrollFrameBegin<sup>9+</sup>
359
360onScrollFrameBegin(event: OnScrollFrameBeginCallback)
361
362该接口回调时,事件参数传入即将发生的滚动量,事件处理函数中可根据应用场景计算实际需要的滚动量并作为事件处理函数的返回值返回,Scroll将按照返回值的实际滚动量进行滚动。
363
364支持offsetRemain为负值。
365
366若通过onScrollFrameBegin事件和scrollBy方法实现容器嵌套滚动,需设置子滚动节点的EdgeEffect为None。如Scroll嵌套List滚动时,List组件的edgeEffect属性需设置为EdgeEffect.None367
368满足以下任一条件时触发该事件:
369
3701. 用户交互(如手指滑动、键鼠操作等)触发滚动。
3712. Scroll惯性滚动。
3723. 调用[fling](#fling12)接口触发滚动。
373
374不触发该事件的条件:
375
3761. 调用除[fling](#fling12)接口外的其他滚动控制接口。
3772. 越界回弹。
3783. 拖动滚动条。
379
380**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。
381
382**系统能力:** SystemCapability.ArkUI.ArkUI.Full
383
384**参数:**
385
386| 参数名 | 类型                              | 必填 | 说明               |
387| ------ | --------------------------------- | ---- | ------------------ |
388| event   | [OnScrollFrameBeginCallback](#onscrollframebegincallback18) | 是   | 每帧滚动开始回调函数。 |
389
390### onScroll<sup>(deprecated)</sup>
391
392onScroll(event: (xOffset: number, yOffset: number) => void)
393
394滚动事件回调,返回滚动时水平、竖直方向偏移量,单位vp。
395
396触发该事件的条件:
397
3981、滚动组件触发滚动时触发,支持键鼠操作等其他触发滚动的输入设置。
399
4002、通过滚动控制器API接口调用。
401
4023、越界回弹。
403
404从API version 12开始废弃不再使用,推荐使用[onWillScroll](#onwillscroll12)事件替代。
405
406**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。
407
408**系统能力:** SystemCapability.ArkUI.ArkUI.Full
409
410**参数:**
411
412| 参数名  | 类型                                                      | 必填 | 说明                   |
413| ------- | --------------------------------------------------------- | ---- | ---------------------- |
414| xOffset     | number                                                  | 是   | 每帧滚动时水平方向的偏移量,Scroll的内容向左滚动时偏移量为正,向右滚动时偏移量为负。<br/>单位vp。 |
415| yOffset     | number                                                  | 是   | 每帧滚动时竖直方向的偏移量,Scroll的内容向上滚动时偏移量为正,向下滚动时偏移量为负。<br/>单位vp。 |
416
417### onWillScroll<sup>12+</sup>
418
419onWillScroll(handler: ScrollOnWillScrollCallback)
420
421滚动事件回调,Scroll滚动前触发。
422
423回调当前帧将要滚动的偏移量和当前滚动状态和滚动操作来源,其中回调的偏移量为计算得到的将要滚动的偏移量值,并非最终实际滚动偏移。可以通过该回调返回值指定Scroll将要滚动的偏移。
424
425触发该事件的条件:
426
4271、滚动组件触发滚动时触发,支持键鼠操作等其他触发滚动的输入设置。
428
4292、通过滚动控制器API接口调用。
430
4313、越界回弹。
432
433>  **说明:**
434>
435>  滚动事件的回调函数在滚动过程中会被频繁触发,因此应避免在该回调函数中执行耗时操作,以防止应用出现卡顿和丢帧的问题。最佳实践请参考[主线程耗时操作优化指导-高频回调场景](https://developer.huawei.com/consumer/cn/doc/best-practices/bpta-time-optimization-of-the-main-thread#section10112623611)436
437**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
438
439**系统能力:** SystemCapability.ArkUI.ArkUI.Full
440
441**参数:**
442
443| 参数名  | 类型                                                      | 必填 | 说明                   |
444| ------- | --------------------------------------------------------- | ---- | ---------------------- |
445| handler | [ScrollOnWillScrollCallback](#scrollonwillscrollcallback12) | 是   | Scroll滚动前触发的回调。 |
446
447### onDidScroll<sup>12+</sup>
448
449onDidScroll(handler: ScrollOnScrollCallback)
450
451滚动事件回调,Scroll滚动时触发。
452
453返回当前帧滚动的偏移量和当前滚动状态。
454
455触发该事件的条件:
456
4571、滚动组件触发滚动时触发,支持键鼠操作等其他触发滚动的输入设置。
458
4592、通过滚动控制器API接口调用。
460
4613、越界回弹。
462
463**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
464
465**系统能力:** SystemCapability.ArkUI.ArkUI.Full
466
467**参数:**
468
469| 参数名  | 类型                                                      | 必填 | 说明                   |
470| ------- | --------------------------------------------------------- | ---- | ---------------------- |
471| handler | [ScrollOnScrollCallback](#scrollonscrollcallback12) | 是   | Scroll滚动时触发的回调。 |
472
473### onScrollEdge
474
475onScrollEdge(event: OnScrollEdgeCallback)
476
477滚动到边缘事件回调。
478
479触发该事件的条件:
480
4811、滚动组件滚动到边缘时触发,支持键鼠操作等其他触发滚动的输入设置。<br/>2、通过滚动控制器API接口调用。<br/>3、越界回弹。
482
483**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。
484
485**系统能力:** SystemCapability.ArkUI.ArkUI.Full
486
487**参数:**
488
489| 参数名 | 类型                              | 必填 | 说明               |
490| ------ | --------------------------------- | ---- | ------------------ |
491| event   | [OnScrollEdgeCallback](#onscrolledgecallback18) | 是   | 滚动到的边缘位置。<br/>当Scroll设置为水平方向滚动时,上报[Edge.Center](ts-appendix-enums.md#edge)表示水平方向起始位置,上报[Edge.Baseline](ts-appendix-enums.md#edge)表示水平方向末尾位置。由于[Edge.Center](ts-appendix-enums.md#edge)和[Edge.Baseline](ts-appendix-enums.md#edge)枚举值已经废弃,推荐使用[onReachStart](ts-container-scrollable-common.md#onreachstart11)、[onReachEnd](ts-container-scrollable-common.md#onreachend11)事件监听是否滚动到边界。 |
492
493### onScrollEnd<sup>(deprecated) </sup>
494
495onScrollEnd(event: () => void)
496
497滚动停止事件回调。
498
499触发该事件的条件:
500
5011、滚动组件触发滚动后停止,支持键鼠操作等其他触发滚动的输入设置。<br/>2、通过滚动控制器API接口调用后停止,带过渡动效。
502
503该事件从API version 9开始废弃,使用[onScrollStop](#onscrollstop9)事件替代。
504
505**系统能力:** SystemCapability.ArkUI.ArkUI.Full
506
507**参数:**
508
509| 参数名 | 类型                              | 必填 | 说明               |
510| ------ | --------------------------------- | ---- | ------------------ |
511| event   | () => void | 是   | 滚动停止事件回调。 |
512
513### onScrollStart<sup>9+</sup>
514
515onScrollStart(event: VoidCallback)
516
517滚动开始时触发。手指拖动Scroll或拖动Scroll的滚动条触发的滚动开始时,会触发该事件。使用[Scroller](#scroller)滚动控制器触发的带动画的滚动,动画开始时会触发该事件。
518
519触发该事件的条件:
520
5211、滚动组件开始滚动时触发,支持键鼠操作等其他触发滚动的输入设置。<br/>2、通过滚动控制器API接口调用后开始,带过渡动效。
522
523**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。
524
525**系统能力:** SystemCapability.ArkUI.ArkUI.Full
526
527**参数:**
528
529| 参数名 | 类型                              | 必填 | 说明               |
530| ------ | --------------------------------- | ---- | ------------------ |
531| event   | [VoidCallback](ts-types.md#voidcallback12) | 是   | 滚动开始回调。 |
532
533### onScrollStop<sup>9+</sup>
534
535onScrollStop(event: VoidCallback)
536
537滚动停止时触发。手拖动Scroll或拖动Scroll的滚动条触发的滚动,手离开屏幕后滚动停止时会触发该事件。使用[Scroller](#scroller)滚动控制器触发的带动画的滚动,动画停止时会触发该事件。
538
539触发该事件的条件:
540
5411、滚动组件触发滚动后停止,支持键鼠操作等其他触发滚动的输入设置。<br/>2、通过滚动控制器API接口调用后开始,带过渡动效。
542
543**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。
544
545**系统能力:** SystemCapability.ArkUI.ArkUI.Full
546
547**参数:**
548
549| 参数名 | 类型                              | 必填 | 说明               |
550| ------ | --------------------------------- | ---- | ------------------ |
551| event   | [VoidCallback](ts-types.md#voidcallback12) | 是   | 滚动停止回调。 |
552
553### onDidZoom<sup>20+</sup>
554
555onDidZoom(event: ScrollOnDidZoomCallback)
556
557每帧缩放完成时触发。
558
559**原子化服务API:** 从API version 20开始,该接口支持在原子化服务中使用。
560
561**系统能力:** SystemCapability.ArkUI.ArkUI.Full
562
563**参数:**
564
565| 参数名 | 类型                              | 必填 | 说明               |
566| ------ | --------------------------------- | ---- | ------------------ |
567| event   | [ScrollOnDidZoomCallback](#scrollondidzoomcallback20) | 是   | 每帧缩放完成时回调。 |
568
569### onZoomStart<sup>20+</sup>
570
571onZoomStart(event: VoidCallback)
572
573手势缩放开始触发。
574
575**原子化服务API:** 从API version 20开始,该接口支持在原子化服务中使用。
576
577**系统能力:** SystemCapability.ArkUI.ArkUI.Full
578
579**参数:**
580
581| 参数名 | 类型                              | 必填 | 说明               |
582| ------ | --------------------------------- | ---- | ------------------ |
583| event   | [VoidCallback](ts-types.md#voidcallback12) | 是   | 缩放开始回调。 |
584
585### onZoomStop<sup>20+</sup>
586
587onZoomStop(event: VoidCallback)
588
589手势缩放停止时触发。
590
591**原子化服务API:** 从API version 20开始,该接口支持在原子化服务中使用。
592
593**系统能力:** SystemCapability.ArkUI.ArkUI.Full
594
595**参数:**
596
597| 参数名 | 类型                              | 必填 | 说明               |
598| ------ | --------------------------------- | ---- | ------------------ |
599| event   | [VoidCallback](ts-types.md#voidcallback12) | 是   | 缩放停止回调。 |
600
601## ScrollOnScrollCallback<sup>12+</sup>
602
603type ScrollOnScrollCallback = (xOffset: number, yOffset: number, scrollState: ScrollState) => void
604
605Scroll滚动时触发的回调。
606
607**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
608
609**系统能力:** SystemCapability.ArkUI.ArkUI.Full
610
611**参数:**
612
613| 参数名      | 类型                                                    | 必填 | 说明                                                         |
614| ----------- | ------------------------------------------------------- | ---- | ------------------------------------------------------------ |
615| xOffset     | number                                                  | 是   | 每帧滚动时水平方向的偏移量,Scroll中的内容向左滚动时偏移量为正,向右滚动时偏移量为负。<br/>单位vp。 |
616| yOffset     | number                                                  | 是   | 每帧滚动时竖直方向的偏移量,Scroll中的内容向上滚动时偏移量为正,向下滚动时偏移量为负。<br/>单位vp。 |
617| scrollState | [ScrollState](ts-container-list.md#scrollstate枚举说明) | 是  | 当前滚动状态。                                               |
618
619>  **说明:**
620>
621>  若通过onScrollFrameBegin事件和scrollBy方法实现容器嵌套滚动,需设置子滚动节点的EdgeEffect为None。如Scroll嵌套List滚动时,List组件的edgeEffect属性需设置为EdgeEffect.None622
623## ScrollOnWillScrollCallback<sup>12+</sup>
624
625type ScrollOnWillScrollCallback = (xOffset: number, yOffset: number, scrollState: ScrollState, scrollSource: ScrollSource) => void | OffsetResult
626
627Scroll滚动前触发的回调。
628
629**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
630
631**系统能力:** SystemCapability.ArkUI.ArkUI.Full
632
633**参数:**
634
635| 参数名      | 类型                                                    | 必填 | 说明                                                         |
636| ----------- | ------------------------------------------------------- | ---- | ------------------------------------------------------------ |
637| xOffset     | number                                                  | 是   | 每帧滚动时水平方向的偏移量,Scroll中的内容向左滚动时偏移量为正,向右滚动时偏移量为负。<br/>单位vp。 |
638| yOffset     | number                                                  | 是   | 每帧滚动时竖直方向的偏移量,Scroll中的内容向上滚动时偏移量为正,向下滚动时偏移量为负。<br/>单位vp。 |
639| scrollState | [ScrollState](ts-container-list.md#scrollstate枚举说明) | 是  | 当前滚动状态。                                               |
640| scrollSource | [ScrollSource](ts-appendix-enums.md#scrollsource12) | 是 | 当前滚动操作的来源。 |
641
642**返回值:**
643
644| 类型                                                         | 说明                                                         |
645| ------------------------------------------------------------ | ------------------------------------------------------------ |
646| void \| [OffsetResult](#offsetresult11对象说明) |  返回OffsetResult时按照开发者指定的偏移量滚动;不返回时按回调参数(xOffset, yOffset)滚动。 |
647
648## OnScrollEdgeCallback<sup>18+</sup>
649
650type OnScrollEdgeCallback = (side: Edge) => void
651
652滚动到边缘时触发的回调。
653
654**原子化服务API:** 从API version 18开始,该接口支持在原子化服务中使用。
655
656**系统能力:** SystemCapability.ArkUI.ArkUI.Full
657
658**参数:**
659
660| 参数名  | 类型   | 必填 | 说明    |
661| ------- | ----- | ---- | ------ |
662| side    | [Edge](ts-appendix-enums.md#edge)  | 是   | 滚动到的边缘位置。 |
663
664## OnScrollFrameBeginCallback<sup>18+</sup>
665
666type OnScrollFrameBeginCallback = (offset: number, state: ScrollState) => OnScrollFrameBeginHandlerResult;
667
668Scroll每帧滚动前触发的回调。
669
670**原子化服务API:** 从API version 18开始,该接口支持在原子化服务中使用。
671
672**系统能力:** SystemCapability.ArkUI.ArkUI.Full
673
674**参数:**
675
676| 参数名 | 类型                                                    | 必填 | 说明                       |
677| ------ | ------------------------------------------------------- | ---- | -------------------------- |
678| offset | number                                                  | 是   | 即将发生的滑动量,单位vp。 |
679| state  | [ScrollState](ts-container-list.md#scrollstate枚举说明) | 是   | 当前滑动状态。             |
680
681**返回值:**
682
683| 类型                     | 说明                 |
684| ------------------------ | -------------------- |
685| [OnScrollFrameBeginHandlerResult](#onscrollframebeginhandlerresult18对象说明) | 返回实际滑动量。 |
686
687## OnScrollFrameBeginHandlerResult<sup>18+</sup>对象说明
688
689[OnScrollFrameBeginCallback](#onscrollframebegincallback18)返回的实际滚动偏移量。
690
691> **说明:**
692>
693> 为规范匿名对象的定义,API 18版本修改了此处的元素定义。其中,保留了历史匿名对象的起始版本信息,会出现外层元素@since版本号高于内层元素版本号的情况,但这不影响接口的使用。
694
695**原子化服务API:** 从API version 18开始,该接口支持在原子化服务中使用。
696
697**系统能力:** SystemCapability.ArkUI.ArkUI.Full
698
699| 名称  | 类型  | 只读 | 可选 | 说明  |
700| ----- | ------ | ---- | -- | ----- |
701| offsetRemain<sup>9+</sup>     | number | 否   | 否 | 实际滚动偏移量。<br/>单位vp。<br/>**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。 |
702
703## ScrollOnDidZoomCallback<sup>20+</sup>
704
705type ScrollOnDidZoomCallback = (scale: number) => void
706
707Scroll每帧缩放完成时触发的回调。
708
709**原子化服务API:** 从API version 20开始,该接口支持在原子化服务中使用。
710
711**系统能力:** SystemCapability.ArkUI.ArkUI.Full
712
713**参数:**
714
715| 参数名      | 类型                                                    | 必填 | 说明                                                         |
716| ----------- | ------------------------------------------------------- | ---- | ------------------------------------------------------------ |
717| scale     | number                                                  | 是   | 当前缩放倍数。 |
718
719
720## Scroller
721
722可滚动容器组件的控制器,可以将此组件绑定至容器组件,然后通过它控制容器组件的滚动。同一个控制器不可以控制多个容器组件,目前支持绑定到ArcList、ArcScrollBar、List、Scroll、ScrollBar、Grid、WaterFlow上。
723
724>**说明:**
725>
726>1、Scroller控制器与滚动容器组件的绑定发生在组件创建阶段。<br/>
727>2、Scroller控制器与滚动容器组件绑定后才可以正常调用Scroller方法,否则根据调用接口不同会不生效或者抛异常。<br/>
728>3、以[aboutToAppear](ts-custom-component-lifecycle.md#abouttoappear)为例,aboutToAppear在创建自定义组件的新实例后,在执行其build()方法之前执行。因此如果滚动组件在自定义组件build内,在该自定义组件aboutToAppear执行时,内部滚动组件还没有创建,是不能正常调用上述Scroller方法的。<br/>
729>4、以[onAppear](ts-universal-events-show-hide.md#onappear)为例,组件挂载显示后触发此回调。因此在滚动组件的onAppear回调执行时,滚动组件已经创建并已经和Scroller绑定成功,是可以正常调用Scroller方法的。
730
731### 导入对象
732
733```
734scroller: Scroller = new Scroller();
735```
736
737### constructor
738
739constructor()
740
741Scroller的构造函数。
742
743**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。
744
745**系统能力:** SystemCapability.ArkUI.ArkUI.Full
746
747### scrollTo
748
749scrollTo(options: ScrollOptions)
750
751
752滑动到指定位置。
753
754**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。
755
756**系统能力:** SystemCapability.ArkUI.ArkUI.Full
757
758**参数:**
759
760| 参数名   | 类型 | 必填   | 说明      |
761| ----- | ---- | ---- | --------- |
762| options | [ScrollOptions](#scrolloptions18对象说明) | 是    | 滑动到指定位置的参数。
763
764>  **说明:**
765>
766> ScrollTo动画速度大于200vp/s时,滚动组件区域内的组件不响应点击事件。
767>
768
769### scrollEdge
770
771scrollEdge(value: Edge, options?: ScrollEdgeOptions)
772
773滚动到容器边缘,不区分滚动轴方向,Edge.TopEdge.Start表现相同,Edge.BottomEdge.End表现相同。
774Scroll组件默认有动画,Grid、List、WaterFlow组件默认无动画。
775
776**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。
777
778**系统能力:** SystemCapability.ArkUI.ArkUI.Full
779
780**参数:**
781
782| 参数名   | 类型 | 必填   | 说明      |
783| ----- | ---- | ---- | --------- |
784| value | [Edge](ts-appendix-enums.md#edge) | 是    | 滚动到的边缘位置。|
785| options<sup>12+</sup>&nbsp; | [ScrollEdgeOptions](#scrolledgeoptions12对象说明) | 否    | 设置滚动到边缘位置的模式。 |
786
787### fling<sup>12+</sup>
788
789fling(velocity: number): void
790
791
792滚动类组件根据传入的初始速度进行惯性滚动。
793
794**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
795
796**系统能力:** SystemCapability.ArkUI.ArkUI.Full
797
798**参数:**
799
800| 参数名   | 类型 | 必填 | 说明                                                     |
801| -------- | -------- | ---- | ------------------------------------------------------------ |
802| velocity | number   | 是   | 惯性滚动的初始速度值。单位:vp/s<br/>**说明:**<br/>velocity值设置为0,视为异常值,本次滚动不生效。如果值为正数,则向顶部滚动;如果值为负数,则向底部滚动。 <br/>取值范围:(-∞, +∞)|
803
804**错误码**:
805
806以下错误码详细介绍请参考[通用错误码](../../errorcode-universal.md)和[滚动类组件错误码](../errorcode-scroll.md)。
807
808| 错误码ID | 错误信息 |
809| ------- | -------- |
810| 401      | Parameter error. Possible causes: 1. Mandatory parameters are left unspecified; 2.Incorrect parameters types; 3. Parameter verification failed.   |
811| 100004   | Controller not bound to component.                               |
812
813### scrollPage<sup>9+</sup>
814
815scrollPage(value:   ScrollPageOptions)
816
817滚动到下一页或者上一页。
818
819**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。
820
821**系统能力:** SystemCapability.ArkUI.ArkUI.Full
822
823**参数:**
824
825| 参数名 | 类型                                           | 必填 | 说明       |
826| ------ | -------------------------------------------------- | ---- | -------------- |
827| value  | [ScrollPageOptions](#scrollpageoptions14对象说明) | 是   | 设置翻页模式。 |
828
829### scrollPage<sup>(deprecated)</sup>
830
831scrollPage(value: { next: boolean, direction?: Axis })
832
833滚动到下一页或者上一页。从API version 9开始,该接口不再维护,推荐使用[scrollPage<sup>9+</sup>](#scrollpage9)。
834
835**系统能力:** SystemCapability.ArkUI.ArkUI.Full
836
837**参数:**
838
839| 参数名       | 类型    | 必填   | 说明                           |
840| --------- | ------- | ---- | ------------------------------ |
841| next      | boolean | 是    | 是否向下翻页。true表示向下翻页,false表示向上翻页。 |
842| direction | [Axis](ts-appendix-enums.md#axis)    | 否    | 设置滚动方向为水平或竖直方向。               |
843
844### currentOffset
845
846currentOffset(): OffsetResult
847
848获取当前的滚动偏移量。
849
850**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。
851
852**系统能力:** SystemCapability.ArkUI.ArkUI.Full
853
854**返回值:**
855
856| 类型  | 说明 |
857| -------- | -------- |
858|  [OffsetResult<sup>11+</sup>](#offsetresult11对象说明) | 返回当前的滚动偏移量。<br/>**说明:**<br/>当scroller控制器未绑定容器组件或者容器组件被异常释放时,currentOffset的返回值为空。|
859
860### scrollToIndex
861
862scrollToIndex(value: number, smooth?: boolean, align?: ScrollAlign, options?: ScrollToIndexOptions)
863
864滑动到指定Index,支持设置滑动额外偏移量。
865
866开启smooth动效时,会对经过的所有item进行加载和布局计算,当大量加载item时会导致性能问题,建议先调用scrollToIndex不带动画跳转到目标附近位置,再调用scrollToIndex带动画滚动到目标位置。
867
868
869>  **说明:**
870>
871> 1.仅支持ArcList、Grid、List、WaterFlow组件。
872>
873> 2.在LazyForEach、ForEach、Repeat刷新数据源时,需确保在数据刷新完成之后再调用此接口。
874
875**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。
876
877**系统能力:** SystemCapability.ArkUI.ArkUI.Full
878
879**参数:**
880
881| 参数名                | 类型 | 必填 | 说明                                                     |
882| --------------------- | -------- | ---- | ------------------------------------------------------------ |
883| value | number   | 是   | 要滑动到的目标元素在当前容器中的索引值。      <br/>**说明:** <br/>value值设置成负值或者大于当前容器子组件的最大索引值,视为异常值,本次跳转不生效。                     |
884| smooth | boolean  | 否   | 设置滑动到列表项在列表中的索引值时是否有动效,true表示有动效,false表示没有动效。<br/>默认值:false。|
885| align | [ScrollAlign](#scrollalign10枚举说明)  | 否   | 指定滑动到的元素与当前容器的对齐方式。<br/>List中的默认值为:ScrollAlign.START。Grid中默认值为:ScrollAlign.AUTO。WaterFlow中的默认值为:ScrollAlign.START。<br/>**说明:** <br/>仅List、Grid、WaterFlow组件支持该参数。 |
886| options<sup>12+</sup> | [ScrollToIndexOptions](#scrolltoindexoptions12对象说明)  | 否   | 设置滑动到指定Index的选项,如额外偏移量。<br/>默认值:0,单位:vp。 |
887
888### scrollBy<sup>9+</sup>
889
890scrollBy(dx: Length, dy: Length)
891
892
893滑动指定距离。
894
895
896>  **说明:**
897>
898>  支持ArcList、Scroll、List、Grid、WaterFlow组件。
899
900**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。
901
902**系统能力:** SystemCapability.ArkUI.ArkUI.Full
903
904**参数:**
905
906| 参数名   | 类型   | 必填   | 说明              |
907| ----- | ------ | ---- | ----------------- |
908| dx |  [Length](ts-types.md#length) | 是    | 水平方向滚动距离,不支持百分比形式。 <br/>取值范围:(-∞, +∞) |
909| dy |  [Length](ts-types.md#length) | 是    | 竖直方向滚动距离,不支持百分比形式。 <br/>取值范围:(-∞, +∞) |
910
911### isAtEnd<sup>10+</sup>
912
913isAtEnd(): boolean
914
915查询组件是否滚动到底部。
916
917>  **说明:**
918>
919>  支持ArcList、Scroll、List、Grid、WaterFlow组件。
920
921**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。
922
923**系统能力:** SystemCapability.ArkUI.ArkUI.Full
924
925**返回值:**
926
927| 类型         | 说明          |
928| ------- | -------- |
929| boolean | true表示组件已经滚动到底部,false表示组件还没滚动到底部。 |
930
931### getItemRect<sup>11+</sup>
932
933getItemRect(index: number): RectResult
934
935获取子组件的大小及相对容器组件的位置。
936
937>  **说明:**
938>
939>  支持ArcList、Scroll、List、Grid、WaterFlow组件。
940
941**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
942
943**系统能力:** SystemCapability.ArkUI.ArkUI.Full
944
945**参数:**
946
947| 参数名   | 类型   | 必填   | 说明              |
948| ----- | ------ | ---- | ----------------- |
949| index | number | 是    | 子组件的索引值。 |
950
951> **说明:**
952>
953> - index必须是当前显示区域显示的子组件的索引值,否则视为非法值。
954> - 非法值返回的大小和位置均为0。
955
956**返回值:**
957
958| 类型       | 说明       |
959| -------------------  | -------- |
960| [RectResult](ts-universal-attributes-on-child-touch-test.md#rectresult) | 子组件的大小和相对于组件的位置。<br/>单位:vp。 |
961
962**错误码**:
963
964以下错误码详细介绍请参考[通用错误码](../../errorcode-universal.md)和[滚动类组件错误码](../errorcode-scroll.md)。
965
966| 错误码ID | 错误信息 |
967| ------- | -------- |
968| 401      | Parameter error. Possible causes: 1. Mandatory parameters are left unspecified; 2.Incorrect parameters types; 3. Parameter verification failed.   |
969| 100004   | Controller not bound to component.                               |
970### getItemIndex<sup>14+</sup>
971
972getItemIndex(x: number, y: number): number
973
974通过坐标获取子组件的索引。
975
976>  **说明:**
977>
978>  支持List、Grid、WaterFlow组件。
979
980**原子化服务API:** 从API version 14开始,该接口支持在原子化服务中使用。
981
982**系统能力:** SystemCapability.ArkUI.ArkUI.Full
983
984**参数:**
985
986| 参数名   | 类型   | 必填   | 说明              |
987| ----- | ------ | ---- | ----------------- |
988| x | number | 是    | x轴坐标,单位为vp。 |
989| y | number | 是 | y轴坐标,单位为vp。 |
990
991> **说明:**
992>
993> 非法值返回的索引为-1。
994
995**返回值:**
996
997| 类型       | 说明       |
998| -------------------  | -------- |
999| number | 返回子组件的索引。 |
1000
1001**错误码**:
1002
1003以下错误码详细介绍请参考[通用错误码](../../errorcode-universal.md)和[滚动类组件错误码](../errorcode-scroll.md)。
1004
1005| 错误码ID | 错误信息 |
1006| ------- | -------- |
1007| 401      | Parameter error. Possible causes: 1. Mandatory parameters are left unspecified; 2.Incorrect parameters types; 3. Parameter verification failed.   |
1008| 100004   |The controller not bound to component.                              |
1009
1010## OffsetResult<sup>11+</sup>对象说明
1011
1012滑动偏移量对象。
1013
1014**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。
1015
1016**系统能力:** SystemCapability.ArkUI.ArkUI.Full
1017
1018| 名称     | 类型   | 只读 | 可选 | 说明                             |
1019| ------- |------- | ---- | ---- | -------------------------------- |
1020| xOffset | number |  否  |  否  | 水平滑动偏移。<br/>返回值单位为vp。 |
1021| yOffset | number |  否  |  否  | 竖直滑动偏移。<br/>返回值单位为vp。 |
1022
1023## ScrollAnimationOptions<sup>12+</sup>对象说明
1024
1025自定义滚动动效的参数选项。
1026
1027**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
1028
1029**系统能力:** SystemCapability.ArkUI.ArkUI.Full
1030
1031| 名称   | 类型   | 只读   | 可选 | 说明              |
1032| ----- | ------ | ------ | -- | ----------------- |
1033| duration | number | 否 | 是 | 设置滚动时长。<br/>默认值:1000<br/>**说明:** <br/>设置为小于0的值时,按默认值显示。 |
1034| curve | [Curve](ts-appendix-enums.md#curve) \| [ICurve](../js-apis-curve.md#icurve9) | 否 | 是 | 设置滚动曲线。<br/>默认值:Curve.Ease |
1035| canOverScroll | boolean | 否 | 是 | 设置滚动动画滚动到边界后,是否转换成越界回弹动画。<br/>默认值:false<br/>**说明:** <br/> 仅在设置为true,且组件的edgeEffect设置为[EdgeEffect.Spring](ts-appendix-enums.md#edgeeffect)时,使用动画滚动到边界会转换为越界回弹动画,设置为false时,滚动到边界会直接停止动画,不会转换为越界回弹动画。 <br>从API version 20开始,如果[ScrollOptions](#scrolloptions18对象说明)中的canOverScroll设置为true,表示滚动可以停留在过界位置,滚动动画过界后不会转换为回弹动画。|
1036
1037## ScrollAlign<sup>10+</sup>枚举说明
1038
1039对齐方式枚举。
1040
1041**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。
1042
1043**系统能力:** SystemCapability.ArkUI.ArkUI.Full
1044
1045| 名称     | 说明                           |
1046| ------ | ------------------------------ |
1047| START   | 首部对齐。指定item首部与滚动容器组件首部对齐。  |
1048| CENTER | 居中对齐。指定item主轴方向居中对齐于滚动容器组件。        |
1049| END  | 尾部对齐。指定item尾部与滚动容器组件尾部对齐。 |
1050| AUTO  | 自动对齐。<br/>若指定item完全处于显示区,不做调整。否则依照滑动距离最短的原则,将指定item首部对齐或尾部对齐于滚动容器组件,使指定item完全处于显示区。|
1051
1052## ScrollToIndexOptions<sup>12+</sup>对象说明
1053
1054滑动到指定Index的参数选项。
1055
1056**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
1057
1058**系统能力:** SystemCapability.ArkUI.ArkUI.Full
1059
1060| 名称   | 类型  | 只读 | 可选 | 说明              |
1061| ----- | ------ | ------ | -- | ----------------- |
1062| extraOffset | [LengthMetrics](../js-apis-arkui-graphics.md#lengthmetrics12) | 否 | 是 | 滑动到指定Index的额外偏移量。如果值为正数,则向底部额外偏移;如果值为负数,则向顶部额外偏移。 |
1063
1064## ScrollPageOptions<sup>14+</sup>对象说明
1065
1066翻页模式的参数选项。
1067
1068**原子化服务API:** 从API version 14开始,该接口支持在原子化服务中使用。
1069
1070**系统能力:** SystemCapability.ArkUI.ArkUI.Full
1071
1072| 名称    | 类型 | 只读 | 可选 | 说明                                                     |
1073| --------- | -------- | ---- | -- | ------------------------------------------------------------ |
1074| next      | boolean  | 否   | 否 | 是否向下翻页。true表示向下翻页,false表示向上翻页。          |
1075| animation | boolean  | 否   | 是 | 是否开启翻页动画效果。true有动画,false无动画。<br />默认值:false。 |
1076
1077## OffsetOptions<sup>12+</sup>对象说明
1078
1079初始滚动偏移量的参数选项。
1080
1081**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
1082
1083**系统能力:** SystemCapability.ArkUI.ArkUI.Full
1084
1085| 名称   | 类型  | 只读 | 可选 | 说明              |
1086| ----- | ------| ------- | -- | ----------------- |
1087| xOffset | [Dimension](ts-types.md#dimension10) | 否 | 是 |水平滚动偏移。<br/>默认值:0 |
1088| yOffset | [Dimension](ts-types.md#dimension10) | 否 | 是 |垂直滚动偏移。<br/>默认值:0|
1089
1090## ScrollEdgeOptions<sup>12+</sup>对象说明
1091
1092滚动到边缘位置的参数选项。
1093
1094**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
1095
1096**系统能力:** SystemCapability.ArkUI.ArkUI.Full
1097
1098| 名称    | 类型 | 只读 | 可选 | 说明                                                   |
1099| --------- | -------- | ---- | -- | ------------------------------------------------------------ |
1100| velocity      | number  | 否   | 是 | 设置滚动到容器边缘的固定速度。如果设置小于等于0的值,参数不生效。<br/>默认值:0<br/>  单位: vp/s          |
1101
1102## ScrollOptions<sup>18+</sup>对象说明
1103
1104滚动到指定位置的参数选项。
1105
1106> **说明:**
1107>
1108> 为规范匿名对象的定义,API 18版本修改了此处的元素定义。其中,保留了历史匿名对象的起始版本信息,会出现外层元素@since版本号高于内层元素版本号的情况,但这不影响接口的使用。
1109
1110**原子化服务API:** 从API version 18开始,该接口支持在原子化服务中使用。
1111
1112**系统能力:** SystemCapability.ArkUI.ArkUI.Full
1113
1114| 名称    | 类型                                                     | 只读 | 可选 | 说明                                                     |
1115| --------- | ------------------------------------------------------------ | ---- | -- | ------------------------------------------------------------ |
1116| xOffset<sup>10+</sup>   | number&nbsp;\|&nbsp;string                                   | 否   | 否 | 水平滚动偏移。<br/>**说明:** <br/>该参数值不支持设置百分比。<br/>仅滚动轴为x轴时生效。<br/>取值范围:当值小于0时,不带动画的滚动,按0处理。带动画的滚动,默认滚动到起始位置后停止,可通过设置animation参数,使滚动在越界时启动回弹动画。<br/>**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。|
1117| yOffset<sup>10+</sup>   | number&nbsp;\|&nbsp;string                                   | 否   | 否 | 垂直滚动偏移。<br/>**说明:** <br/>该参数值不支持设置百分比。<br/>仅滚动轴为y轴时生效。<br/>取值范围:当值小于0时,不带动画的滚动,按0处理。带动画的滚动,默认滚动到起始位置后停止,可通过设置animation参数,使滚动在越界时启动回弹动画。<br/>**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。|
1118| 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开始,该接口支持在原子化服务中使用。 |
1119| canOverScroll<sup>20+</sup>   | boolean                                   | 否   | 是 | 滚动目标位置是否可以超出边界停留。仅当组件的edgeEffect设置为EdgeEffect.Spring时,滚动能够越界停留。<br/>设置为true时滚动可以在过界后停留,设置为false时滚动无法在过界后停留。<br/>默认值:false <br/>**原子化服务API:** 从API version 20开始,该接口支持在原子化服务中使用。|
1120
1121## UIScrollEvent<sup>19+</sup>
1122frameNode中[getEvent('Scroll')](../js-apis-arkui-frameNode.md#geteventscroll19)方法的返回值,可用于给Scroll节点设置滚动事件。
1123
1124UIScrollEvent继承于[UIScrollableCommonEvent](./ts-container-scrollable-common.md#uiscrollablecommonevent19)。
1125
1126### setOnWillScroll<sup>19+</sup>
1127
1128setOnWillScroll(callback:  ScrollOnWillScrollCallback | undefined): void
1129
1130设置[onWillScroll](#onwillscroll12)事件的回调。
1131
1132方法入参为undefined时,会重置事件回调。
1133
1134**原子化服务API:** 从API version 19开始,该接口支持在原子化服务中使用。
1135
1136**系统能力:** SystemCapability.ArkUI.ArkUI.Full
1137
1138**参数:**
1139
1140| 参数名 | 类型   | 必填 | 说明                       |
1141| ------ | ------ | ---- | -------------------------- |
1142| callback  | [ScrollOnWillScrollCallback](./ts-container-scroll.md#scrollonwillscrollcallback12)&nbsp;\|&nbsp;undefined | 是   | onWillScroll事件的回调函数。 |
1143
1144### setOnDidScroll<sup>19+</sup>
1145
1146setOnDidScroll(callback: ScrollOnScrollCallback | undefined): void
1147
1148设置[onDidScroll](#ondidscroll12)事件的回调。
1149
1150方法入参为undefined时,会重置事件回调。
1151
1152**原子化服务API:** 从API version 19开始,该接口支持在原子化服务中使用。
1153
1154**系统能力:** SystemCapability.ArkUI.ArkUI.Full
1155
1156**参数:**
1157
1158| 参数名 | 类型   | 必填 | 说明                       |
1159| ------ | ------ | ---- | -------------------------- |
1160| callback  | [ScrollOnScrollCallback](./ts-container-scroll.md#scrollonscrollcallback12)&nbsp;\|&nbsp;undefined | 是   | onDidScroll事件的回调函数。 |
1161
1162## 示例
1163### 示例1(设置scroller控制器)
1164该示例展示了Scroll组件部分属性和scroller控制器的使用。
1165
1166```ts
1167// xxx.ets
1168import { curves } from '@kit.ArkUI';
1169
1170@Entry
1171@Component
1172struct ScrollExample {
1173  scroller: Scroller = new Scroller();
1174  private arr: number[] = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9];
1175
1176  build() {
1177    Stack({ alignContent: Alignment.TopStart }) {
1178      Scroll(this.scroller) {
1179        Column() {
1180          ForEach(this.arr, (item: number) => {
1181            Text(item.toString())
1182              .width('90%')
1183              .height(150)
1184              .backgroundColor(0xFFFFFF)
1185              .borderRadius(15)
1186              .fontSize(16)
1187              .textAlign(TextAlign.Center)
1188              .margin({ top: 10 })
1189          }, (item: number) => item.toString())
1190        }.width('100%')
1191      }
1192      .scrollable(ScrollDirection.Vertical) // 滚动方向纵向
1193      .scrollBar(BarState.On) // 滚动条常驻显示
1194      .scrollBarColor(Color.Gray) // 滚动条颜色
1195      .scrollBarWidth(10) // 滚动条宽度
1196      .friction(0.6)
1197      .edgeEffect(EdgeEffect.None)
1198      .onWillScroll((xOffset: number, yOffset: number, scrollState: ScrollState) => {
1199        console.info(xOffset + ' ' + yOffset);
1200      })
1201      .onScrollEdge((side: Edge) => {
1202        console.info('To the edge');
1203      })
1204      .onScrollStop(() => {
1205        console.info('Scroll Stop');
1206      })
1207
1208      Button('scroll 150')
1209        .height('5%')
1210        .onClick(() => { // 点击后下滑指定距离150.0vp
1211          this.scroller.scrollBy(0, 150);
1212        })
1213        .margin({ top: 10, left: 20 })
1214      Button('scroll 100')
1215        .height('5%')
1216        .onClick(() => { // 点击后滑动到指定位置,即下滑100.0vp的距离
1217          const yOffset: number = this.scroller.currentOffset().yOffset;
1218          this.scroller.scrollTo({ xOffset: 0, yOffset: yOffset + 100 });
1219        })
1220        .margin({ top: 60, left: 20 })
1221      Button('scroll 100')
1222        .height('5%')
1223        .onClick(() => { // 点击后滑动到指定位置,即下滑100.0vp的距离,滑动过程配置有动画
1224          let curve = curves.interpolatingSpring(10, 1, 228, 30); //创建一个弹簧曲线
1225          const yOffset: number = this.scroller.currentOffset().yOffset;
1226          this.scroller.scrollTo({ xOffset: 0, yOffset: yOffset + 100, animation: { duration: 1000, curve: curve } });
1227        })
1228        .margin({ top: 110, left: 20 })
1229      Button('back top')
1230        .height('5%')
1231        .onClick(() => { // 点击后回到顶部
1232          this.scroller.scrollEdge(Edge.Top);
1233        })
1234        .margin({ top: 160, left: 20 })
1235      Button('next page')
1236        .height('5%')
1237        .onClick(() => { // 点击后滑到下一页
1238          this.scroller.scrollPage({ next: true ,animation: true });
1239        })
1240        .margin({ top: 210, left: 20 })
1241      Button('fling -3000')
1242        .height('5%')
1243        .onClick(() => { // 点击后触发初始速度为-3000vp/s的惯性滚动
1244          this.scroller.fling(-3000);
1245        })
1246        .margin({ top: 260, left: 20 })
1247      Button('scroll to bottom 700')
1248        .height('5%')
1249        .onClick(() => { // 点击后滑到下边缘,速度值是700vp/s
1250          this.scroller.scrollEdge(Edge.Bottom, { velocity: 700 });
1251        })
1252        .margin({ top: 310, left: 20 })
1253    }.width('100%').height('100%').backgroundColor(0xDCDCDC)
1254  }
1255}
1256```
1257
1258![zh-cn_image_0000001174104386](figures/scroll_scroller.gif)
1259
1260### 示例2(嵌套滚动实现方式一)
1261该示例使用onScrollFrameBegin事件实现了内层List组件和外层Scroll组件的嵌套滚动。
1262```ts
1263import { LengthMetrics } from '@kit.ArkUI';
1264
1265@Entry
1266@Component
1267struct NestedScroll {
1268  @State listPosition: number = 0; // 0代表滚动到List顶部,1代表中间值,2代表滚动到List底部。
1269  private arr: number[] = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
1270  private scrollerForScroll: Scroller = new Scroller();
1271  private scrollerForList: Scroller = new Scroller();
1272
1273  build() {
1274    Flex() {
1275      Scroll(this.scrollerForScroll) {
1276        Column() {
1277          Text("Scroll Area")
1278            .width("100%")
1279            .height("40%")
1280            .backgroundColor(0X330000FF)
1281            .fontSize(16)
1282            .textAlign(TextAlign.Center)
1283            .onClick(() => {
1284              this.scrollerForList.scrollToIndex(5, false, ScrollAlign.START, { extraOffset: LengthMetrics.vp(5) });
1285            })
1286
1287          List({ space: 20, scroller: this.scrollerForList }) {
1288            ForEach(this.arr, (item: number) => {
1289              ListItem() {
1290                Text("ListItem" + item)
1291                  .width("100%")
1292                  .height("100%")
1293                  .borderRadius(15)
1294                  .fontSize(16)
1295                  .textAlign(TextAlign.Center)
1296                  .backgroundColor(Color.White)
1297              }.width("100%").height(100)
1298            }, (item: string) => item)
1299          }
1300          .width("100%")
1301          .height("50%")
1302          .edgeEffect(EdgeEffect.None)
1303          .friction(0.6)
1304          .onReachStart(() => {
1305            this.listPosition = 0;
1306          })
1307          .onReachEnd(() => {
1308            this.listPosition = 2;
1309          })
1310          .onScrollFrameBegin((offset: number) => {
1311            if ((this.listPosition == 0 && offset <= 0) || (this.listPosition == 2 && offset >= 0)) {
1312              this.scrollerForScroll.scrollBy(0, offset);
1313              return { offsetRemain: 0 };
1314            }
1315            this.listPosition = 1;
1316            return { offsetRemain: offset };
1317          })
1318
1319          Text("Scroll Area")
1320            .width("100%")
1321            .height("40%")
1322            .backgroundColor(0X330000FF)
1323            .fontSize(16)
1324            .textAlign(TextAlign.Center)
1325        }
1326      }
1327      .width("100%").height("100%")
1328    }.width('100%').height('100%').backgroundColor(0xDCDCDC).padding(20)
1329  }
1330}
1331```
1332
1333![NestedScroll](figures/NestedScroll.gif)
1334
1335### 示例3(嵌套滚动实现方式二)
1336该示例使用nestedScroll属性实现了内层List组件和外层Scroll组件的嵌套滚动。
1337```ts
1338@Entry
1339@Component
1340struct StickyNestedScroll {
1341  @State arr: number[] = [];
1342
1343  @Styles
1344  listCard() {
1345    .backgroundColor(Color.White)
1346    .height(72)
1347    .width("100%")
1348    .borderRadius(12)
1349  }
1350
1351  build() {
1352    Scroll() {
1353      Column() {
1354        Text("Scroll Area")
1355          .width("100%")
1356          .height("40%")
1357          .backgroundColor('#0080DC')
1358          .textAlign(TextAlign.Center)
1359        Tabs({ barPosition: BarPosition.Start }) {
1360          TabContent() {
1361            List({ space: 10 }) {
1362              ForEach(this.arr, (item: number) => {
1363                ListItem() {
1364                  Text("item" + item)
1365                    .fontSize(16)
1366                }.listCard()
1367              }, (item: number) => item.toString())
1368            }.width("100%")
1369            .edgeEffect(EdgeEffect.Spring)
1370            .nestedScroll({
1371              scrollForward: NestedScrollMode.PARENT_FIRST,
1372              scrollBackward: NestedScrollMode.SELF_FIRST
1373            })
1374          }.tabBar("Tab1")
1375
1376          TabContent() {
1377          }.tabBar("Tab2")
1378        }
1379        .vertical(false)
1380        .height("100%")
1381      }.width("100%")
1382    }
1383    .edgeEffect(EdgeEffect.Spring)
1384    .friction(0.6)
1385    .backgroundColor('#DCDCDC')
1386    .scrollBar(BarState.Off)
1387    .width('100%')
1388    .height('100%')
1389  }
1390
1391  aboutToAppear() {
1392    for (let i = 0; i < 30; i++) {
1393      this.arr.push(i);
1394    }
1395  }
1396}
1397```
1398![NestedScroll2](figures/NestedScroll2.gif)
1399### 示例4(嵌套滚动父组件向子组件传递滚动)
1400该示例使用enableScrollInteraction属性和onScrollFrameBegin事件实现了父组件向子组件传递滚动。
1401```ts
1402@Entry
1403@Component
1404struct NestedScroll {
1405  private headerHeight: number = 0;
1406  private arr: number[] = [];
1407  private scrollerForParent: Scroller = new Scroller();
1408  private scrollerForChild: Scroller = new Scroller();
1409
1410  aboutToAppear(): void {
1411    for (let i = 0; i < 10; i++) {
1412      this.arr.push(i);
1413    }
1414  }
1415
1416  build() {
1417    Scroll(this.scrollerForParent) {
1418      Column() {
1419        Text("Scroll Area")
1420          .width("100%")
1421          .height("40%")
1422          .backgroundColor(0X330000FF)
1423          .fontSize(16)
1424          .textAlign(TextAlign.Center)
1425          .onClick(() => {
1426            this.scrollerForChild.scrollToIndex(5);
1427          })
1428          .onSizeChange((oldValue: SizeOptions, newValue: SizeOptions) => {
1429            this.headerHeight = newValue.height! as number;
1430          })
1431        List({ space: 20, scroller: this.scrollerForChild }) {
1432          ForEach(this.arr, (item: number) => {
1433            ListItem() {
1434              Text("ListItem" + item)
1435                .width("100%")
1436                .height("100%")
1437                .borderRadius(15)
1438                .fontSize(16)
1439                .textAlign(TextAlign.Center)
1440                .backgroundColor(Color.White)
1441            }.width("100%").height(100)
1442          }, (item: number) => item.toString())
1443        }
1444        .width("100%")
1445        .height("100%")
1446        .edgeEffect(EdgeEffect.None)
1447        .scrollBar(BarState.Off)
1448        .enableScrollInteraction(false)
1449
1450        Text("Scroll Area")
1451          .width("100%")
1452          .height("40%")
1453          .backgroundColor(0X330000FF)
1454          .fontSize(16)
1455          .textAlign(TextAlign.Center)
1456      }
1457    }
1458    .scrollBar(BarState.Off)
1459    .edgeEffect(EdgeEffect.Spring)
1460    .onScrollFrameBegin((offset: number, state: ScrollState) => {
1461      let retOffset = offset;
1462      let currOffset = this.scrollerForParent.currentOffset().yOffset;
1463      let newOffset = currOffset + offset;
1464      if (offset > 0) {
1465        if (this.scrollerForChild.isAtEnd()) {
1466          return { offsetRemain: offset };
1467        }
1468        if (newOffset > this.headerHeight) {
1469          retOffset = this.headerHeight - currOffset;
1470        }
1471        this.scrollerForChild.scrollBy(0, offset - retOffset);
1472      } else {
1473        if (this.scrollerForChild.currentOffset().yOffset <= 0) {
1474          return { offsetRemain: offset };
1475        }
1476        if (newOffset < this.headerHeight) {
1477          retOffset = this.headerHeight - currOffset;
1478        }
1479        this.scrollerForChild.scrollBy(0, offset - retOffset);
1480      }
1481      return { offsetRemain: retOffset };
1482    })
1483    .width("100%")
1484    .height("100%")
1485    .backgroundColor(0xDCDCDC)
1486  }
1487}
1488```
1489![NestedScroll3](figures/NestedScroll3.gif)
1490### 示例5(设置限位滚动)
1491该示例实现了Scroll组件的限位滚动。
1492```ts
1493@Entry
1494@Component
1495struct Index {
1496  scroller: Scroller = new Scroller();
1497  private arr: number[] = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15];
1498  build() {
1499    Scroll(this.scroller) {
1500      Column() {
1501        ForEach(this.arr, (item: number) => {
1502          Text(item.toString())
1503            .width('90%')
1504            .height(200)
1505            .backgroundColor(0xFFFFFF)
1506            .borderWidth(1)
1507            .borderColor(Color.Black)
1508            .borderRadius(15)
1509            .fontSize(16)
1510            .textAlign(TextAlign.Center)
1511        }, (item: number) => item.toString())
1512      }.width('100%').backgroundColor(0xDCDCDC)
1513    }
1514    .backgroundColor(Color.Yellow)
1515    .height('100%')
1516    .edgeEffect(EdgeEffect.Spring)
1517    .scrollSnap({snapAlign:ScrollSnapAlign.START, snapPagination:400, enableSnapToStart:true, enableSnapToEnd:true})
1518  }
1519}
1520```
1521![NestedScrollSnap](figures/NestedScrollSnap.gif)
1522
1523### 示例6(获取子组件索引)
1524该示例展示了如何获得List组件的子组件索引。
1525
1526```ts
1527// xxx.ets
1528@Entry
1529@Component
1530struct ListExample {
1531  private arr: number[] = [];
1532  private scroller: ListScroller = new ListScroller();
1533  @State listSpace: number = 10;
1534  @State listChildrenSize: ChildrenMainSize = new ChildrenMainSize(100);
1535  @State listIndex: number = -1;
1536  @State itemBackgroundColorArr: boolean[] = [false];
1537  aboutToAppear(){
1538    // 初始化数据源。
1539    for (let i = 0; i < 10; i++) {
1540      this.arr.push(i);
1541    }
1542    this.listChildrenSize.splice(0, 5, [100, 100, 100, 100, 100]);
1543  }
1544  build() {
1545    Column() {
1546      List({ space: this.listSpace, initialIndex: 4, scroller: this.scroller }) {
1547        ForEach(this.arr, (item: number) => {
1548          ListItem() {
1549            Text('item-' + item)
1550              .height( item < 5 ? 100 : this.listChildrenSize.childDefaultSize)
1551              .width('90%')
1552              .fontSize(16)
1553              .textAlign(TextAlign.Center)
1554              .borderRadius(10)
1555              .backgroundColor( this.itemBackgroundColorArr[item] ? 0x68B4FF: 0xFFFFFF)
1556          }
1557        }, (item: number) => item.toString())
1558      }
1559      .backgroundColor(Color.Gray)
1560      .layoutWeight(1)
1561      .scrollBar(BarState.On)
1562      .childrenMainSize(this.listChildrenSize)
1563      .alignListItem(ListItemAlign.Center)
1564      .gesture(
1565        PanGesture()
1566          .onActionUpdate((event: GestureEvent) => {
1567            if (event.fingerList[0] != undefined && event.fingerList[0].localX != undefined && event.fingerList[0].localY != undefined) {
1568              this.listIndex = this.scroller.getItemIndex(event.fingerList[0].localX, event.fingerList[0].localY);
1569              this.itemBackgroundColorArr[this.listIndex] = true;
1570            }
1571          })
1572      )
1573      .gesture(
1574        TapGesture({ count: 1 })
1575          .onAction((event: GestureEvent) => {
1576            if (event) {
1577              this.itemBackgroundColorArr.splice(0,this.itemBackgroundColorArr.length);
1578            }
1579          })
1580      )
1581
1582      Text('您当前位置Item索引为:'+ this.listIndex)
1583        .fontColor(Color.Red)
1584        .height(50)
1585    }
1586  }
1587}
1588```
1589
1590![ScrollEdgeAtVelocity](figures/getItemIndex_list.gif)
1591
1592### 示例7(设置边缘渐隐)
1593该示例实现了Scroll组件开启边缘渐隐效果并设置边缘渐隐长度。
1594
1595```ts
1596// xxx.ets
1597import { LengthMetrics } from '@kit.ArkUI';
1598@Entry
1599@Component
1600struct ScrollExample {
1601  scroller: Scroller = new Scroller();
1602  private arr: number[] = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12];
1603
1604  build() {
1605    Stack({ alignContent: Alignment.TopStart }) {
1606      Scroll(this.scroller) {
1607        Column() {
1608          ForEach(this.arr, (item: number) => {
1609            Text(item.toString())
1610              .width('90%')
1611              .height(150)
1612              .backgroundColor(0xFFFFFF)
1613              .borderRadius(15)
1614              .fontSize(16)
1615              .textAlign(TextAlign.Center)
1616              .margin({ top: 10 })
1617          }, (item: string) => item)
1618        }.width('100%')
1619      }
1620      .fadingEdge(true,{fadingEdgeLength:LengthMetrics.vp(80)})
1621
1622
1623
1624    }.width('100%').height('100%').backgroundColor(0xDCDCDC)
1625  }
1626}
1627```
1628
1629![fadingEdge_scroll](figures/fadingEdge_scroll.gif)
1630
1631### 示例8(单边边缘效果)
1632
1633该示例通过edgeEffect接口,实现了Scroll组件设置单边边缘效果。
1634
1635```ts
1636// xxx.ets
1637@Entry
1638@Component
1639struct ScrollExample {
1640  scroller: Scroller = new Scroller();
1641  private arr: number[] = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12];
1642
1643  build() {
1644    Stack({ alignContent: Alignment.TopStart }) {
1645      Scroll(this.scroller) {
1646        Column() {
1647          ForEach(this.arr, (item: number) => {
1648            Text(item.toString())
1649              .width('90%')
1650              .height(150)
1651              .backgroundColor(0xFFFFFF)
1652              .borderRadius(15)
1653              .fontSize(16)
1654              .textAlign(TextAlign.Center)
1655              .margin({ top: 10 })
1656          }, (item: string) => item)
1657        }.width('100%')
1658      }
1659      .edgeEffect(EdgeEffect.Spring,{alwaysEnabled:true,effectEdge:EffectEdge.START})
1660    }.width('100%').height('100%').backgroundColor(0xDCDCDC)
1661  }
1662}
1663```
1664
1665![edgeEffect_scroll](figures/edgeEffect_scroll.gif)
1666
1667### 示例9(划动翻页效果)
1668
1669该示例通过enablePaging接口,实现了Scroll组件划动翻页效果。
1670
1671```ts
1672// xxx.ets
1673@Entry
1674@Component
1675struct EnablePagingExample {
1676  private arr: number[] = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
1677
1678  build() {
1679    Stack({ alignContent: Alignment.Center }) {
1680      Scroll() {
1681        Column() {
1682          ForEach(this.arr, (item: number) => {
1683            Text(item.toString())
1684              .width('100%')
1685              .height('100%')
1686              .borderRadius(15)
1687              .fontSize(16)
1688              .textAlign(TextAlign.Center)
1689              .backgroundColor(0xFFFFFF)
1690          }, (item: number) => item.toString())
1691        }
1692      }.width('90%').height('90%')
1693      .enablePaging(true)
1694    }.width('100%').height('100%').backgroundColor(0xDCDCDC)
1695  }
1696}
1697```
1698
1699![enablePaging](figures/enablePaging.gif)
1700
1701### 示例10(设置过界停留)
1702
1703该示例通过scrollTo接口,实现了Scroll组件设置过界停留效果。
1704
1705```ts
1706// xxx.ets
1707import { curves } from '@kit.ArkUI';
1708
1709@Entry
1710@Component
1711struct StickyNestedScroll {
1712  scroller: Scroller = new Scroller;
1713
1714  build() {
1715    Column() {
1716      Row() {
1717        Button('有动画scrollTo').onClick(() => {
1718          let curve = curves.interpolatingSpring(0.5, 5, 10, 15) //创建一个弹簧曲线
1719          const yOffset: number = this.scroller.currentOffset().yOffset;
1720          this.scroller.scrollTo({
1721            xOffset: 0,
1722            yOffset: yOffset - 100,
1723            animation: { duration: 1000, curve: curve, canOverScroll: true },
1724            canOverScroll: true
1725          })
1726        }).margin({ top: 10 })
1727        Button('无动画scrollTo').onClick(() => {
1728          const yOffset: number = this.scroller.currentOffset().yOffset;
1729          this.scroller.scrollTo({
1730            xOffset: 0,
1731            yOffset: yOffset - 100,
1732            animation: false,
1733            canOverScroll: true
1734          })
1735        }).margin({ top: 10, left: 20 })
1736      }.margin({ bottom: 20 })
1737
1738      Scroll(this.scroller) {
1739        Column() {
1740          Text('Scroll Area')
1741            .width('100%')
1742            .height('100%')
1743            .backgroundColor('#0080DC')
1744            .textAlign(TextAlign.Center)
1745        }
1746        .width('100%')
1747        .height('100%')
1748      }
1749      .scrollable(ScrollDirection.Vertical)
1750      .edgeEffect(EdgeEffect.Spring) //设置边缘效果
1751      .fadingEdge(false) //关闭边缘渐隐效果
1752      .scrollBar(BarState.Auto)
1753      .friction(undefined)
1754      .backgroundColor('#DCDCDC')
1755      .width('100%')
1756      .height('50%')
1757    }
1758  }
1759}
1760```
1761
1762![canOverScroll_scroll](figures/canOverScroll_scroll.gif)
1763
1764
1765### 示例11(自由滚动和缩放)
1766
1767该示例实现了Scroll组件自由滚动和缩放效果。
1768```ts
1769@Entry
1770@Component
1771struct ScrollZoomExample {
1772  @State currScale:number = 1;
1773  build() {
1774    Column() {
1775      Scroll() {
1776        Image($r('app.media.image1')) // 'app.media.image1'仅作示例,请替换实际图片。
1777      }
1778      .height(400)
1779      .scrollable(ScrollDirection.FREE)
1780      .minZoomScale(1)
1781      .maxZoomScale(2)
1782      .zoomScale(this.currScale!!)
1783      .enableBouncesZoom(true)
1784      .onDidZoom((scale: number) => {
1785        console.info(`onDidZoom:${scale}`);
1786      })
1787      .onZoomStart(() => {
1788        console.info('onZoomStart');
1789      })
1790      .onZoomStop(() => {
1791        console.info('onZoomStop');
1792      })
1793    }.width('100%').height('100%')
1794  }
1795}
1796```
1797![free_scroll_zoom](figures/free_scroll_zoom.gif)
1798