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

E
ester.zhou 已提交
3 4 5
>  **NOTE**
> - This component is supported since API version 7. Updates will be marked with a superscript to indicate their earliest API version.
> - When a **\<List>** is nested in this component, you are advised to specify the width and height of the **\<List>** under scenarios where consistently high performance is required. If the width and height are not specified, this component will load all content of the **\<List>**.
Z
zengyawen 已提交
6

Z
zengyawen 已提交
7

E
ester.zhou 已提交
8
The **\<Scroll>** component scrolls the content when the layout size of a component exceeds the viewport of its parent component.
Z
zengyawen 已提交
9 10 11


## Required Permissions
Z
zengyawen 已提交
12

E
ester.zhou 已提交
13
None.
Z
zengyawen 已提交
14

Z
zengyawen 已提交
15 16

## Child Components
Z
zengyawen 已提交
17 18 19

This component supports only one child component.

Z
zengyawen 已提交
20 21 22 23 24 25 26 27

## APIs

Scroll(scroller?: Scroller)


## Attributes

E
ester.zhou 已提交
28 29 30 31 32 33
| Name            | Type                                    | Default Value                     | Description       |
| -------------- | ---------------------------------------- | ------------------------ | --------- |
| scrollable     | ScrollDirection                          | ScrollDirection.Vertical | Scroll method.  |
| scrollBar      | [BarState](ts-appendix-enums.md#barstate-enums)| ScrollDirection.Auto     | Scrollbar status. |
| scrollBarColor | Color                                    | -                        | Color of the scrollbar.|
| scrollBarWidth | Length                                   | -                        | Width of the scrollbar.|
Z
zengyawen 已提交
34

E
ester.zhou 已提交
35 36 37 38 39 40
- ScrollDirection enums
  | Name        | Description        |
  | ---------- | ---------- |
  | Horizontal | Only horizontal scrolling is supported.|
  | Vertical   | Only vertical scrolling is supported.|
  | None       | Scrolling is disabled.     |
Z
zengyawen 已提交
41

42 43
## Events

E
ester.zhou 已提交
44 45 46 47 48 49
| Name                                      | Description                         |
| ---------------------------------------- | ----------------------------- |
| onScrollBegin<sup>9+</sup>(dx: number, dy: number)&nbsp;=&gt;&nbsp;{ dxRemain: number, dyRemain: number } | Invoked when scrolling starts.<br>Parameters:<br>- **dx**: amount to scroll by in the horizontal direction.<br>- **dy**: amount to scroll by in the vertical direction.<br>Return value:<br>- **dxRemain**: remaining amount to scroll by in the horizontal direction.<br>- **dyRemain**: remaining amount to scroll by in the vertical direction.|
| onScroll(xOffset:&nbsp;number,&nbsp;yOffset:&nbsp;number)&nbsp;=&gt;&nbsp;void | Invoked to return the horizontal and vertical offsets during scrolling when the specified scroll event occurs.|
| onScrollEdge(side:&nbsp;Edge)&nbsp;=&gt;&nbsp;void | Invoked when scrolling reaches the edge.                   |
| onScrollEnd()&nbsp;=&gt;&nbsp;void       | Invoked when scrolling stops.                    |
50 51

>  **NOTE**
E
ester.zhou 已提交
52
> If the **onScrollBegin** event and **scrollBy** API are used to implement nested scrolling, you must set **edgeEffect** of the scrolling child node to **None**. For example, if a **\<List>** is nested in the **\<Scroll>** component, the **edgeEffect** attribute of the **\<List>** must be set to **EdgeEffect.None**.
Z
zengyawen 已提交
53 54 55

## Scroller

E
ester.zhou 已提交
56
Controller of the scrollable container component. You can bind this component to a container component and use it to control the scrolling of that component. Currently, this component can be bound to the **\<List>** and **\<Scroll>** components.
Z
zengyawen 已提交
57 58 59 60


### Objects to Import

Z
zengyawen 已提交
61 62 63 64 65
```
scroller: Scroller = new Scroller()
```


66
### scrollTo
Z
zengyawen 已提交
67 68 69

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

Z
zengyawen 已提交
70 71 72

Scrolls to the specified position.

Z
zengyawen 已提交
73 74

- Parameters
E
ester.zhou 已提交
75 76 77 78 79
  | Name      | Type                                    | Mandatory  | Default Value | Description                                    |
  | --------- | ---------------------------------------- | ---- | ---- | ---------------------------------------- |
  | xOffset   | Length                                   | Yes   | -    | Horizontal scrolling offset.                                 |
  | yOffset   | Length                                   | Yes   | -    | Vertical scrolling offset.                                 |
  | animation | {<br>duration:&nbsp;number,<br>curve:&nbsp;[Curve](ts-animatorproperty.md)&nbsp;\|<br>CubicBezier&nbsp;\|<br>SpringCurve<br>} | No   |      | Animation configuration, which includes the following:<br>- **duration**: scrolling duration.<br>- **curve**: scrolling curve.|
Z
zengyawen 已提交
80 81


82
### scrollEdge
Z
zengyawen 已提交
83 84 85

scrollEdge(value: Edge): void

Z
zengyawen 已提交
86 87 88

Scrolls to the edge of the container.

Z
zengyawen 已提交
89 90

- Parameters
E
ester.zhou 已提交
91 92 93 94 95 96 97 98 99 100
  | Name  | Type| Mandatory  | Default Value | Description     |
  | ----- | ---- | ---- | ---- | --------- |
  | value | Edge | Yes   | -    | Edge position to scroll to.|

- Edge enums

  | Name  | Value  | Description      |
  | ------ | ---- | ---------- |
  | Top    | 0    | Top edge.|
  | Bottom | 2    | Bottom edge.|
Z
zengyawen 已提交
101

E
ester.zhou 已提交
102
  
Z
zengyawen 已提交
103

104
### scrollPage
Z
zengyawen 已提交
105 106

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

Scrolls to the next or previous page.
Z
zengyawen 已提交
109

Z
zengyawen 已提交
110
- Parameters
E
ester.zhou 已提交
111 112 113
  | Name      | Type   | Mandatory  | Default Value | Description                          |
  | --------- | ------- | ---- | ---- | ------------------------------ |
  | next      | boolean | Yes   | -    | Whether to turn to the next page. The value **true** means to scroll to the next page, and **false** means to scroll to the previous page.|
114
  | direction | Axis    | No   | -    | Scrolling direction: horizontal or vertical.               |
Z
zengyawen 已提交
115 116


117
### currentOffset
Z
zengyawen 已提交
118

E
ester.zhou 已提交
119
currentOffset(): Object
Z
zengyawen 已提交
120

Z
zengyawen 已提交
121 122 123 124

Obtains the scrolling offset.


E
ester.zhou 已提交
125
- Return value
E
ester.zhou 已提交
126 127 128
  | Type                                                    | Description                                                  |
  | ------------------------------------------------------- | ------------------------------------------------------------ |
  | {<br>xOffset:&nbsp;number,<br>yOffset:&nbsp;number<br>} | **xOffset**: horizontal scrolling offset.<br>**yOffset**: vertical scrolling offset. |
Z
zengyawen 已提交
129

Z
zengyawen 已提交
130

E
ester.zhou 已提交
131
### scrollToIndex
Z
zengyawen 已提交
132

E
ester.zhou 已提交
133
scrollToIndex(value: number): void
Z
zengyawen 已提交
134 135


E
ester.zhou 已提交
136
Scrolls to the item with the specified index.
Z
zengyawen 已提交
137

Z
zengyawen 已提交
138

E
ester.zhou 已提交
139
>  **NOTE**
140
> Only the **\<List>** component is supported.
Z
zengyawen 已提交
141 142 143


- Parameters
E
ester.zhou 已提交
144 145 146
  | Name  | Type  | Mandatory  | Default Value | Description             |
  | ----- | ------ | ---- | ---- | ----------------- |
  | value | number | Yes   | -    | Index of the item to be scrolled to in the list.|
Z
zengyawen 已提交
147 148


149
### scrollBy
Z
zengyawen 已提交
150

151
scrollBy(dx: Length, dy: Length): void
Z
zengyawen 已提交
152 153


154
Scrolls by the specified amount.
Z
zengyawen 已提交
155

Z
zengyawen 已提交
156

157
>  **NOTE**
E
ester.zhou 已提交
158
> Only the **\<Scroll>** component is supported.
159 160 161 162 163 164 165 166 167 168 169 170 171


- Parameters
  | Name  | Type  | Mandatory  | Default Value | Description             |
  | ----- | ------ | ---- | ---- | ----------------- |
  | dx | Length | Yes   | -    | Amount to scroll by in the horizontal direction.|
  | dy | Length | Yes   | -    | Amount to scroll by in the vertical direction.|


## Example

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

  build() {
    Stack({ alignContent: Alignment.TopStart }) {
      Scroll(this.scroller) {
        Column() {
          ForEach(this.arr, (item) => {
            Text(item.toString())
184 185 186 187 188 189
              .width('90%')
              .height(150)
              .backgroundColor(0xFFFFFF)
              .borderRadius(15)
              .fontSize(16)
              .textAlign(TextAlign.Center)
Z
zengyawen 已提交
190 191 192 193
              .margin({ top: 10 })
          }, item => item)
        }.width('100%')
      }
194 195 196 197
      .scrollable(ScrollDirection.Vertical)
      .scrollBar(BarState.On)
      .scrollBarColor(Color.Gray)
      .scrollBarWidth(30)
Z
zengyawen 已提交
198 199 200 201 202 203 204 205 206 207 208
      .onScroll((xOffset: number, yOffset: number) => {
        console.info(xOffset + ' ' + yOffset)
      })
      .onScrollEdge((side: Edge) => {
        console.info('To the edge')
      })
      .onScrollEnd(() => {
        console.info('Scroll Stop')
      })

      Button('scroll 100')
E
ester.zhou 已提交
209
        .onClick(() => { // Click to scroll down 100.0.
Z
zengyawen 已提交
210 211 212 213
          this.scroller.scrollTo({ xOffset: 0, yOffset: this.scroller.currentOffset().yOffset + 100 })
        })
        .margin({ top: 10, left: 20 })
      Button('back top')
E
ester.zhou 已提交
214
        .onClick(() => { // Click to go back to the top.
Z
zengyawen 已提交
215 216 217 218
          this.scroller.scrollEdge(Edge.Top)
        })
        .margin({ top: 60, left: 20 })
      Button('next page')
E
ester.zhou 已提交
219
        .onClick(() => { // Click to scroll down to the bottom.
Z
zengyawen 已提交
220 221 222 223 224 225 226 227
          this.scroller.scrollPage({ next: true })
        })
        .margin({ top: 110, left: 20 })
    }.width('100%').height('100%').backgroundColor(0xDCDCDC)
  }
}
```

Z
zengyawen 已提交
228
![en-us_image_0000001256978363](figures/en-us_image_0000001256978363.gif)
E
ester.zhou 已提交
229 230


231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283
```ts
@Entry
@Component
struct NestedScroll {
  @State listPosition: number = 0 // 0 indicates scrolling to the top of the list, 1 indicates scrolling to the center of the list, and 2 indicates scrolling to the bottom of the list.
  private arr: number[] = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
  private scroller: Scroller = new Scroller()

  build() {
    Flex() {
      Scroll(this.scroller) {
        Column() {
          Text("Scroll Area")
            .width("100%").height("40%").backgroundColor(0X330000FF)
            .fontSize(16).textAlign(TextAlign.Center)

          List({ space: 20 }) {
            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)
          }
          .width("100%").height("50%").edgeEffect(EdgeEffect.None)
          .onReachStart(() => {
            this.listPosition = 0
          })
          .onReachEnd(() => {
            this.listPosition = 2
          })
          .onScrollBegin((dx: number, dy: number) => {
            if ((this.listPosition == 0 && dy >= 0) || (this.listPosition == 2 && dy <= 0)) {
              this.scroller.scrollBy(0, -dy)
              return { dxRemain: dx, dyRemain: 0 }
            }
            this.listPosition = 1;
            return { dxRemain: dx, dyRemain: dy }
          })

          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)