ts-container-scroll.md 11.3 KB
Newer Older
Z
zengyawen 已提交
1 2
# Scroll

G
gmy 已提交
3 4
可滚动的容器组件,当子组件的布局尺寸超过父组件的尺寸时,内容可以滚动。

H
geshi  
HelloCrease 已提交
5
>  **说明:**
G
gmy 已提交
6 7
>  - 该组件从API version 7开始支持。后续版本如有新增内容,则采用上角标单独标记该内容的起始版本。
>  - 该组件嵌套List子组件滚动时,若List不设置宽高,则默认全部加载,在对性能有要求的场景下建议指定List的宽高。
8
>  - 该组件滚动的前提是主轴方向大小小于内容大小。
G
gmy 已提交
9
>  - 该组件回弹的前提是要有滚动。内容小于一屏时,没有回弹效果。
Z
zengyawen 已提交
10

Z
zengyawen 已提交
11

Z
zengyawen 已提交
12
## 子组件
Z
zengyawen 已提交
13 14 15

支持单个子组件。

Z
zengyawen 已提交
16 17 18 19 20 21 22

## 接口

Scroll(scroller?: Scroller)

## 属性

G
gmy 已提交
23 24 25 26
除支持[通用属性](ts-universal-attributes-size.md)外,还支持以下属性:

| 名称             | 参数类型                                     | 描述        |
| -------------- | ---------------------------------------- | --------- |
S
sienna1128 已提交
27
| scrollable     | [ScrollDirection](#scrolldirection枚举说明)                        | 设置滚动方向。<br/>默认值:ScrollDirection.Vertical |
S
sienna1128 已提交
28
| scrollBar      | [BarState](ts-appendix-enums.md#barstate) | 设置滚动条状态。<br/>默认值:BarState.Auto |
S
sienna1128 已提交
29
| scrollBarColor | string&nbsp;\|&nbsp;number&nbsp;\|&nbsp;[Color](ts-appendix-enums.md#color)   | 设置滚动条的颜色。 |
G
gmy 已提交
30
| scrollBarWidth | string&nbsp;\|&nbsp;number         | 设置滚动条的宽度。 |
W
wangshuainan 已提交
31
| edgeEffect     | [EdgeEffect](ts-appendix-enums.md#edgeeffect)            | 设置滑动效果,目前支持的滑动效果参见EdgeEffect的枚举说明。<br/>默认值:EdgeEffect.None |
Z
zengyawen 已提交
32

K
kangchongtao 已提交
33
## ScrollDirection枚举说明
G
gmy 已提交
34 35 36 37 38
| 名称       | 描述                     |
| ---------- | ------------------------ |
| Horizontal | 仅支持水平方向滚动。     |
| Vertical   | 仅支持竖直方向滚动。     |
| None       | 不可滚动。               |
39
| Free<sup>(deprecated) </sup> | 支持竖直或水平方向滚动<br/> 从API version 9开始废弃|
K
kangchongtao 已提交
40

41 42
## 事件

G
gmy 已提交
43 44
| 名称                                                         | 功能描述                                                     |
| ------------------------------------------------------------ | ------------------------------------------------------------ |
45
| onScrollFrameBegin<sup>9+</sup>(event: (offset: number, state: ScrollState) => { offsetRemain }) | 每帧开始滚动时触发,事件参数传入即将发生的滚动量,事件处理函数中可根据应用场景计算实际需要的滚动量并作为事件处理函数的返回值返回,Scroll将按照返回值的实际滚动量进行滚动。<br/>\- offset:即将发生的滚动量。<br/>\- state:当前滚动状态。<br/>- offsetRemain:水平方向实际滚动量。 |
G
gmy 已提交
46 47
| onScroll(event: (xOffset: number, yOffset: number) => void)  | 滚动事件回调,&nbsp;返回滚动时水平、竖直方向偏移量。          |
| onScrollEdge(event: (side: Edge) => void)                    | 滚动到边缘事件回调。                                         |
48 49 50
| onScrollEnd(event: () => void)                               | 滚动停止事件回调。<br>该事件从API9开始废弃,使用onScrollStop事件替代。     |
| onScrollStart<sup>9+</sup>(event: () => void) | 滚动开始时触发。手指拖动Scroll或拖动Scroll的滚动条触发的滚动开始时,会触发该事件。使用[Scroller](#scroller)滚动控制器触发的滚动,不会触发该事件。 |
| onScrollStop<sup>9+</sup>(event: () => void) | 滚动停止时触发。手拖动Scroll或拖动Scroll的滚动条触发的滚动,手离开屏幕并且滚动停止时会触发该事件;使用[Scroller](#scroller)滚动控制器触发的滚动,不会触发该事件。 |
Z
zengyawen 已提交
51

C
caocan 已提交
52
>  **说明:**
G
gmy 已提交
53
>
54
>  若通过onScrollFrameBegin事件和scrollBy方法实现容器嵌套滚动,需设置子滚动节点的EdgeEffect为None。如Scroll嵌套List滚动时,List组件的edgeEffect属性需设置为EdgeEffect.None。
C
caocan 已提交
55

Z
zengyawen 已提交
56
## Scroller
Z
zengyawen 已提交
57

L
lijuan124 已提交
58
可滚动容器组件的控制器,可以将此组件绑定至容器组件,然后通过它控制容器组件的滚动,同一个控制器不可以控制多个容器组件,目前支持绑定到List、Scroll、ScrollBar上。
Z
zengyawen 已提交
59

Z
zengyawen 已提交
60 61

### 导入对象
Z
zengyawen 已提交
62 63 64 65 66 67

```
scroller: Scroller = new Scroller()
```


68
### scrollTo
Z
zengyawen 已提交
69 70 71

scrollTo(value: { xOffset: number | string, yOffset: number | string, animation?: { duration: number, curve: Curve } }): void

Z
zengyawen 已提交
72 73 74

滑动到指定位置。

G
gmy 已提交
75
**参数:**
Z
zengyawen 已提交
76

G
gmy 已提交
77 78 79 80
| 参数名    | 参数类型                                                     | 必填 | 参数描述                                                     |
| --------- | ------------------------------------------------------------ | ---- | ------------------------------------------------------------ |
| xOffset   | Length                                                       | 是   | 水平滑动偏移。                                               |
| yOffset   | Length                                                       | 是   | 竖直滑动偏移。                                               |
81
| animation | {<br/>duration:&nbsp;number,<br/>curve:&nbsp;[Curve](ts-appendix-enums.md#curve)<br/>} | 否   | 动画配置:<br/>-&nbsp;duration:&nbsp;滚动时长设置。<br/>-&nbsp;curve:&nbsp;滚动曲线设置。 |
Z
zengyawen 已提交
82 83


84
### scrollEdge
Z
zengyawen 已提交
85 86 87

scrollEdge(value: Edge): void

Z
zengyawen 已提交
88 89 90

滚动到容器边缘。

G
gmy 已提交
91
**参数:**
Z
zengyawen 已提交
92

G
gmy 已提交
93 94 95
| 参数名   | 参数类型 | 必填   | 参数描述      |
| ----- | ---- | ---- | --------- |
| value | [Edge](ts-appendix-enums.md#edge) | 是    | 滚动到的边缘位置。 |
G
gmy 已提交
96

Z
zengyawen 已提交
97

98
### scrollPage
Z
zengyawen 已提交
99 100

scrollPage(value: { next: boolean, direction?: Axis }): void
Z
zengyawen 已提交
101 102

滚动到下一页或者上一页。
Z
zengyawen 已提交
103

G
gmy 已提交
104 105 106 107 108
**参数:**

| 参数名       | 参数类型    | 必填   | 参数描述                           |
| --------- | ------- | ---- | ------------------------------ |
| next      | boolean | 是    | 是否向下翻页。true表示向下翻页,false表示向上翻页。 |
109
| direction<sup>(deprecated) </sup> | [Axis](ts-appendix-enums.md#axis)    | 否    | 设置滚动方向为水平或竖直方向。<br/> 从API version 9开始废弃                |
Z
zengyawen 已提交
110 111


112
### currentOffset
Z
zengyawen 已提交
113

G
gmy 已提交
114
currentOffset()
Z
zengyawen 已提交
115

Z
zengyawen 已提交
116 117 118

返回当前的滚动偏移量。

G
gmy 已提交
119
**返回值**
Z
zengyawen 已提交
120

G
gmy 已提交
121 122 123
| 类型                                       | 描述                                       |
| ---------------------------------------- | ---------------------------------------- |
| {<br/>xOffset:&nbsp;number,<br/>yOffset:&nbsp;number<br/>} | xOffset:&nbsp;水平滑动偏移;<br/>yOffset:&nbsp;竖直滑动偏移。 |
Z
zengyawen 已提交
124

Z
zengyawen 已提交
125

126
### scrollToIndex
Z
zengyawen 已提交
127

C
caocan 已提交
128
scrollToIndex(value: number): void
Z
zengyawen 已提交
129 130 131 132


滑动到指定Index。

Z
zengyawen 已提交
133

H
geshi  
HelloCrease 已提交
134
>  **说明:**
G
gmy 已提交
135
>
Y
yamila 已提交
136
>  仅支持Grid、list组件。
Z
zengyawen 已提交
137

G
gmy 已提交
138
**参数:**
Z
zengyawen 已提交
139

G
gmy 已提交
140 141 142
| 参数名 | 参数类型 | 必填 | 参数描述                           |
| ------ | -------- | ---- | ---------------------------------- |
| value  | number   | 是   | 要滑动到的列表项在列表中的索引值。 |
Z
zengyawen 已提交
143 144


T
tianyu 已提交
145
### scrollBy<sup>9+</sup>
C
caocan 已提交
146 147 148 149 150 151 152 153

scrollBy(dx: Length, dy: Length): void


滑动指定距离。


>  **说明:**
G
gmy 已提交
154 155
>
>  仅支持Scroll组件。
C
caocan 已提交
156

G
gmy 已提交
157
**参数:**
C
caocan 已提交
158

G
gmy 已提交
159 160
| 参数名   | 参数类型   | 必填   | 参数描述              |
| ----- | ------ | ---- | ----------------- |
161 162
| dx | Length | 是    | 水平方向滚动距离,不支持百分比形式。 |
| dy | Length | 是    | 竖直方向滚动距离,不支持百分比形式。 |
C
caocan 已提交
163 164


Z
zengyawen 已提交
165
## 示例
S
sienna1128 已提交
166
### 示例1
Z
zengyawen 已提交
167

H
geshi  
HelloCrease 已提交
168 169
```ts
// xxx.ets
Z
zengyawen 已提交
170 171 172
@Entry
@Component
struct ScrollExample {
Y
yamila 已提交
173 174
  scroller: Scroller = new Scroller()
  private arr: number[] = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
Z
zengyawen 已提交
175 176 177 178 179 180 181

  build() {
    Stack({ alignContent: Alignment.TopStart }) {
      Scroll(this.scroller) {
        Column() {
          ForEach(this.arr, (item) => {
            Text(item.toString())
G
gmy 已提交
182 183 184 185 186 187
              .width('90%')
              .height(150)
              .backgroundColor(0xFFFFFF)
              .borderRadius(15)
              .fontSize(16)
              .textAlign(TextAlign.Center)
Z
zengyawen 已提交
188 189 190 191
              .margin({ top: 10 })
          }, item => item)
        }.width('100%')
      }
S
sienna1128 已提交
192 193 194 195 196
      .scrollable(ScrollDirection.Vertical)  // 滚动方向纵向
      .scrollBar(BarState.On)  // 滚动条常驻显示
      .scrollBarColor(Color.Gray)  // 滚动条颜色
      .scrollBarWidth(30) // 滚动条宽度
      .edgeEffect(EdgeEffect.None)
Z
zengyawen 已提交
197
      .onScroll((xOffset: number, yOffset: number) => {
Y
yamila 已提交
198
        console.info(xOffset + ' ' + yOffset)
Z
zengyawen 已提交
199 200
      })
      .onScrollEdge((side: Edge) => {
Y
yamila 已提交
201
        console.info('To the edge')
Z
zengyawen 已提交
202 203
      })
      .onScrollEnd(() => {
Y
yamila 已提交
204
        console.info('Scroll Stop')
Z
zengyawen 已提交
205
      })
S
sienna1128 已提交
206

G
gmy 已提交
207 208
      Button('scroll 150')
        .onClick(() => { // 点击后下滑指定距离150.0vp
Y
yamila 已提交
209
          this.scroller.scrollBy(0,150)
G
gmy 已提交
210 211
        })
        .margin({ top: 10, left: 20 })
Z
zengyawen 已提交
212
      Button('scroll 100')
G
gmy 已提交
213
        .onClick(() => { // 点击后滑动到指定位置,即下滑100.0vp的距离
Y
yamila 已提交
214
          this.scroller.scrollTo({ xOffset: 0, yOffset: this.scroller.currentOffset().yOffset + 100 })
Z
zengyawen 已提交
215
        })
G
gmy 已提交
216
        .margin({ top: 60, left: 20 })
Z
zengyawen 已提交
217 218
      Button('back top')
        .onClick(() => { // 点击后回到顶部
Y
yamila 已提交
219
          this.scroller.scrollEdge(Edge.Top)
Z
zengyawen 已提交
220
        })
G
gmy 已提交
221
        .margin({ top: 110, left: 20 })
Z
zengyawen 已提交
222
      Button('next page')
G
gmy 已提交
223
        .onClick(() => { // 点击后滑到下一页
Y
yamila 已提交
224
          this.scroller.scrollPage({ next: true })
Z
zengyawen 已提交
225
        })
G
gmy 已提交
226
        .margin({ top: 170, left: 20 })
Z
zengyawen 已提交
227 228 229 230 231
    }.width('100%').height('100%').backgroundColor(0xDCDCDC)
  }
}
```

Z
zengyawen 已提交
232
![zh-cn_image_0000001174104386](figures/zh-cn_image_0000001174104386.gif)
C
caocan 已提交
233

S
sienna1128 已提交
234
### 示例2
C
caocan 已提交
235 236 237 238
```ts
@Entry
@Component
struct NestedScroll {
S
sienna1128 已提交
239
  @State listPosition: number = 0; // 0代表滚动到List顶部,1代表中间值,2代表滚动到List底部。
Y
yamila 已提交
240
  private arr: number[] = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
Z
zhangrongjie 已提交
241 242
  private scrollerForScroll: Scroller = new Scroller()
  private scrollerForList: Scroller = new Scroller()
C
caocan 已提交
243 244 245

  build() {
    Flex() {
Z
zhangrongjie 已提交
246
      Scroll(this.scrollerForScroll) {
C
caocan 已提交
247 248 249 250
        Column() {
          Text("Scroll Area")
            .width("100%").height("40%").backgroundColor(0X330000FF)
            .fontSize(16).textAlign(TextAlign.Center)
Y
yamila 已提交
251
            .onClick(() => {
Z
zhangrongjie 已提交
252
              this.scrollerForList.scrollToIndex(5)
Y
yamila 已提交
253
            })
C
caocan 已提交
254

Z
zhangrongjie 已提交
255
          List({ space: 20, scroller: this.scrollerForList }) {
C
caocan 已提交
256 257 258 259 260 261 262 263
            ForEach(this.arr, (item) => {
              ListItem() {
                Text("ListItem" + item)
                  .width("100%").height("100%").borderRadius(15)
                  .fontSize(16).textAlign(TextAlign.Center).backgroundColor(Color.White)
              }.width("100%").height(100)
            }, item => item)
          }
Y
yamila 已提交
264 265 266
          .width("100%")
          .height("50%")
          .edgeEffect(EdgeEffect.None)
C
caocan 已提交
267
          .onReachStart(() => {
Y
yamila 已提交
268
            this.listPosition = 0
C
caocan 已提交
269 270
          })
          .onReachEnd(() => {
Y
yamila 已提交
271
            this.listPosition = 2
C
caocan 已提交
272
          })
273
          .onScrollFrameBegin((offset: number) => {
274 275
            if ((this.listPosition == 0 && offset <= 0) || (this.listPosition == 2 && offset >= 0)) {
              this.scrollerForScroll.scrollBy(0, offset)
276
              return { offsetRemain: 0 }
C
caocan 已提交
277
            }
Y
yamila 已提交
278
            this.listPosition = 1
279
            return { offsetRemain: offset };
C
caocan 已提交
280 281 282 283 284 285 286 287 288 289 290 291 292 293
          })

          Text("Scroll Area")
            .width("100%").height("40%").backgroundColor(0X330000FF)
            .fontSize(16).textAlign(TextAlign.Center)
        }
      }
      .width("100%").height("100%")
    }.width('100%').height('100%').backgroundColor(0xDCDCDC).padding(20)
  }
}
```

![NestedScroll](figures/NestedScroll.gif)