滾動(dòng)的容器組件

2024-01-22 17:57 更新

可滾動(dòng)的容器組件,當(dāng)子組件的布局尺寸超過(guò)父組件的尺寸時(shí),內(nèi)容可以滾動(dòng)。

說(shuō)明
  • 該組件從API version 7開(kāi)始支持。后續(xù)版本如有新增內(nèi)容,則采用上角標(biāo)單獨(dú)標(biāo)記該內(nèi)容的起始版本。
  • 該組件嵌套List子組件滾動(dòng)時(shí),若List不設(shè)置寬高,則默認(rèn)全部加載,在對(duì)性能有要求的場(chǎng)景下建議指定List的寬高。
  • 該組件滾動(dòng)的前提是主軸方向大小小于內(nèi)容大小。
  • 該組件回彈的前提是要有滾動(dòng)。內(nèi)容小于一屏?xí)r,沒(méi)有回彈效果。

子組件

支持單個(gè)子組件。

接口

Scroll(scroller?: Scroller)

參數(shù):

參數(shù)名

參數(shù)類型

必填

參數(shù)描述

scroller

Scroller

可滾動(dòng)組件的控制器。用于與可滾動(dòng)組件進(jìn)行綁定。

屬性

除支持通用屬性外,還支持以下屬性:

名稱

參數(shù)類型

描述

scrollable

ScrollDirection

設(shè)置滾動(dòng)方向。

默認(rèn)值:ScrollDirection.Vertical

scrollBar

BarState

設(shè)置滾動(dòng)條狀態(tài)。

默認(rèn)值:BarState.Auto

說(shuō)明:

如果容器組件無(wú)法滾動(dòng),則滾動(dòng)條不顯示。

如果容器組件的子組件大小為無(wú)窮大,則滾動(dòng)條不支持拖動(dòng)和伴隨滾動(dòng)。

scrollBarColor

string | number | Color

設(shè)置滾動(dòng)條的顏色。

scrollBarWidth

string | number

設(shè)置滾動(dòng)條的寬度,不支持百分比設(shè)置。

默認(rèn)值:4

單位:vp

說(shuō)明:

如果滾動(dòng)條的寬度超過(guò)其高度,則滾動(dòng)條的寬度會(huì)變?yōu)槟J(rèn)值。

edgeEffect

EdgeEffect

設(shè)置滑動(dòng)效果,目前支持的滑動(dòng)效果參見(jiàn)EdgeEffect的枚舉說(shuō)明。

默認(rèn)值:EdgeEffect.None

ScrollDirection枚舉說(shuō)明

名稱

描述

Horizontal

僅支持水平方向滾動(dòng)。

Vertical

僅支持豎直方向滾動(dòng)。

None

不可滾動(dòng)。

Free(deprecated)

支持豎直或水平方向滾動(dòng)。

從API version 9開(kāi)始廢棄。

事件

名稱

功能描述

onScrollFrameBegin9+(event: (offset: number, state: ScrollState) => { offsetRemain })

每幀開(kāi)始滾動(dòng)時(shí)觸發(fā),事件參數(shù)傳入即將發(fā)生的滾動(dòng)量,事件處理函數(shù)中可根據(jù)應(yīng)用場(chǎng)景計(jì)算實(shí)際需要的滾動(dòng)量并作為事件處理函數(shù)的返回值返回,Scroll將按照返回值的實(shí)際滾動(dòng)量進(jìn)行滾動(dòng)。

- offset:即將發(fā)生的滾動(dòng)量。

- state:當(dāng)前滾動(dòng)狀態(tài)。

- offsetRemain:實(shí)際滾動(dòng)量。

觸發(fā)該事件的條件 :

1、滾動(dòng)組件觸發(fā)滾動(dòng)時(shí)觸發(fā),包括鍵鼠操作等其他觸發(fā)滾動(dòng)的輸入設(shè)置。

2、調(diào)用控制器接口時(shí)不觸發(fā)。

3、越界回彈不觸發(fā)。

說(shuō)明:

支持offsetRemain為負(fù)值。

若通過(guò)onScrollFrameBegin事件和scrollBy方法實(shí)現(xiàn)容器嵌套滾動(dòng),需設(shè)置子滾動(dòng)節(jié)點(diǎn)的EdgeEffect為None。如Scroll嵌套List滾動(dòng)時(shí),List組件的edgeEffect屬性需設(shè)置為EdgeEffect.None。

onScroll(event: (xOffset: number, yOffset: number) => void)

滾動(dòng)事件回調(diào), 返回滾動(dòng)時(shí)水平、豎直方向偏移量。

觸發(fā)該事件的條件 :

1、滾動(dòng)組件觸發(fā)滾動(dòng)時(shí)觸發(fā),支持鍵鼠操作等其他觸發(fā)滾動(dòng)的輸入設(shè)置。2、通過(guò)滾動(dòng)控制器API接口調(diào)用。

3、越界回彈。

onScrollEdge(event: (side: Edge) => void)

滾動(dòng)到邊緣事件回調(diào)。

觸發(fā)該事件的條件 :

1、滾動(dòng)組件滾動(dòng)到邊緣時(shí)觸發(fā),支持鍵鼠操作等其他觸發(fā)滾動(dòng)的輸入設(shè)置。

2、通過(guò)滾動(dòng)控制器API接口調(diào)用。

3、越界回彈。

onScrollEnd(deprecated) (event: () => void)

滾動(dòng)停止事件回調(diào)。

該事件從API version 9開(kāi)始廢棄,使用onScrollStop事件替代。

觸發(fā)該事件的條件 :

1、滾動(dòng)組件觸發(fā)滾動(dòng)后停止,支持鍵鼠操作等其他觸發(fā)滾動(dòng)的輸入設(shè)置。

2、通過(guò)滾動(dòng)控制器API接口調(diào)用后停止,帶過(guò)渡動(dòng)效。

onScrollStart9+(event: () => void)

滾動(dòng)開(kāi)始時(shí)觸發(fā)。手指拖動(dòng)Scroll或拖動(dòng)Scroll的滾動(dòng)條觸發(fā)的滾動(dòng)開(kāi)始時(shí),會(huì)觸發(fā)該事件。使用Scroller滾動(dòng)控制器觸發(fā)的帶動(dòng)畫的滾動(dòng),動(dòng)畫開(kāi)始時(shí)會(huì)觸發(fā)該事件。

onScrollStop9+(event: () => void)

滾動(dòng)停止時(shí)觸發(fā)。手拖動(dòng)Scroll或拖動(dòng)Scroll的滾動(dòng)條觸發(fā)的滾動(dòng),手離開(kāi)屏幕并且滾動(dòng)停止時(shí)會(huì)觸發(fā)該事件。使用Scroller滾動(dòng)控制器觸發(fā)的帶動(dòng)畫的滾動(dòng),動(dòng)畫停止時(shí)會(huì)觸發(fā)該事件。

說(shuō)明

若通過(guò)onScrollFrameBegin事件和scrollBy方法實(shí)現(xiàn)容器嵌套滾動(dòng),需設(shè)置子滾動(dòng)節(jié)點(diǎn)的EdgeEffect為None。如Scroll嵌套List滾動(dòng)時(shí),List組件的edgeEffect屬性需設(shè)置為EdgeEffect.None。

Scroller

可滾動(dòng)容器組件的控制器,可以將此組件綁定至容器組件,然后通過(guò)它控制容器組件的滾動(dòng),同一個(gè)控制器不可以控制多個(gè)容器組件,目前支持綁定到List、Scroll、ScrollBar、Grid、WaterFlow上。

導(dǎo)入對(duì)象

  1. scroller: Scroller = new Scroller()

scrollTo

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

滑動(dòng)到指定位置。

參數(shù):

參數(shù)名

參數(shù)類型

必填

參數(shù)描述

xOffset

number | string

水平滑動(dòng)偏移。

說(shuō)明:

該參數(shù)值不支持設(shè)置百分比。

當(dāng)值小于0時(shí),不帶動(dòng)畫的滾動(dòng),按0處理。帶動(dòng)畫的滾動(dòng),滾動(dòng)到起始位置后停止。

僅滾動(dòng)軸為x軸時(shí)生效。

yOffset

number | string

垂直滑動(dòng)偏移。

說(shuō)明:

該參數(shù)值不支持設(shè)置百分比。

當(dāng)值小于0時(shí),不帶動(dòng)畫的滾動(dòng),按0處理。帶動(dòng)畫的滾動(dòng),滾動(dòng)到起始位置后停止。

僅滾動(dòng)軸為y軸時(shí)生效。

animation

{

duration: number,

curve: Curve

}

動(dòng)畫配置:

- duration: 滾動(dòng)時(shí)長(zhǎng)設(shè)置。

- curve: 滾動(dòng)曲線設(shè)置。

默認(rèn)值:

{

duration: 0,

curve: Curve.Ease

}

說(shuō)明:

設(shè)置為小于0的值時(shí),按默認(rèn)值顯示。

scrollEdge

scrollEdge(value: Edge): void

滾動(dòng)到容器邊緣,不區(qū)分滾動(dòng)軸方向,Edge.Top和Edge.Start表現(xiàn)相同,Edge.Bottom和Edge.End表現(xiàn)相同。

參數(shù):

參數(shù)名

參數(shù)類型

必填

參數(shù)描述

value

Edge

滾動(dòng)到的邊緣位置。

scrollPage

scrollPage(value: { next: boolean, direction?: Axis }): void

滾動(dòng)到下一頁(yè)或者上一頁(yè)。

參數(shù):

參數(shù)名

參數(shù)類型

必填

參數(shù)描述

next

boolean

是否向下翻頁(yè)。true表示向下翻頁(yè),false表示向上翻頁(yè)。

direction(deprecated)

Axis

設(shè)置滾動(dòng)方向?yàn)樗交蜇Q直方向。

從API version 9開(kāi)始廢棄

currentOffset

currentOffset(): { xOffset: number, yOffset: number }

返回當(dāng)前的滾動(dòng)偏移量。

返回值

類型

描述

{

xOffset: number,

yOffset: number

}

xOffset: 水平滑動(dòng)偏移;

yOffset: 豎直滑動(dòng)偏移。

說(shuō)明:

返回值單位為vp。

scrollToIndex

scrollToIndex(value: number): void

滑動(dòng)到指定Index。

說(shuō)明

僅支持Grid、List組件。

參數(shù):

參數(shù)名

參數(shù)類型

必填

參數(shù)描述

value

number

要滑動(dòng)到的列表項(xiàng)在列表中的索引值。

scrollBy9+

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

滑動(dòng)指定距離。

說(shuō)明

支持Scroll、List、Grid、WaterFlow組件

參數(shù):

參數(shù)名

參數(shù)類型

必填

參數(shù)描述

dx

Length

水平方向滾動(dòng)距離,不支持百分比形式。

dy

Length

豎直方向滾動(dòng)距離,不支持百分比形式。

示例

示例1

  1. // xxx.ets
  2. @Entry
  3. @Component
  4. struct ScrollExample {
  5. scroller: Scroller = new Scroller()
  6. private arr: number[] = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
  7. build() {
  8. Stack({ alignContent: Alignment.TopStart }) {
  9. Scroll(this.scroller) {
  10. Column() {
  11. ForEach(this.arr, (item) => {
  12. Text(item.toString())
  13. .width('90%')
  14. .height(150)
  15. .backgroundColor(0xFFFFFF)
  16. .borderRadius(15)
  17. .fontSize(16)
  18. .textAlign(TextAlign.Center)
  19. .margin({ top: 10 })
  20. }, item => item)
  21. }.width('100%')
  22. }
  23. .scrollable(ScrollDirection.Vertical) // 滾動(dòng)方向縱向
  24. .scrollBar(BarState.On) // 滾動(dòng)條常駐顯示
  25. .scrollBarColor(Color.Gray) // 滾動(dòng)條顏色
  26. .scrollBarWidth(10) // 滾動(dòng)條寬度
  27. .edgeEffect(EdgeEffect.None)
  28. .onScroll((xOffset: number, yOffset: number) => {
  29. console.info(xOffset + ' ' + yOffset)
  30. })
  31. .onScrollEdge((side: Edge) => {
  32. console.info('To the edge')
  33. })
  34. .onScrollEnd(() => {
  35. console.info('Scroll Stop')
  36. })
  37. Button('scroll 150')
  38. .onClick(() => { // 點(diǎn)擊后下滑指定距離150.0vp
  39. this.scroller.scrollBy(0,150)
  40. })
  41. .margin({ top: 10, left: 20 })
  42. Button('scroll 100')
  43. .onClick(() => { // 點(diǎn)擊后滑動(dòng)到指定位置,即下滑100.0vp的距離
  44. this.scroller.scrollTo({ xOffset: 0, yOffset: this.scroller.currentOffset().yOffset + 100 })
  45. })
  46. .margin({ top: 60, left: 20 })
  47. Button('back top')
  48. .onClick(() => { // 點(diǎn)擊后回到頂部
  49. this.scroller.scrollEdge(Edge.Top)
  50. })
  51. .margin({ top: 110, left: 20 })
  52. Button('next page')
  53. .onClick(() => { // 點(diǎn)擊后滑到下一頁(yè)
  54. this.scroller.scrollPage({ next: true })
  55. })
  56. .margin({ top: 170, left: 20 })
  57. }.width('100%').height('100%').backgroundColor(0xDCDCDC)
  58. }
  59. }

示例2

  1. @Entry
  2. @Component
  3. struct NestedScroll {
  4. @State listPosition: number = 0; // 0代表滾動(dòng)到List頂部,1代表中間值,2代表滾動(dòng)到List底部。
  5. private arr: number[] = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
  6. private scrollerForScroll: Scroller = new Scroller()
  7. private scrollerForList: Scroller = new Scroller()
  8. build() {
  9. Flex() {
  10. Scroll(this.scrollerForScroll) {
  11. Column() {
  12. Text("Scroll Area")
  13. .width("100%").height("40%").backgroundColor(0X330000FF)
  14. .fontSize(16).textAlign(TextAlign.Center)
  15. .onClick(() => {
  16. this.scrollerForList.scrollToIndex(5)
  17. })
  18. List({ space: 20, scroller: this.scrollerForList }) {
  19. ForEach(this.arr, (item) => {
  20. ListItem() {
  21. Text("ListItem" + item)
  22. .width("100%").height("100%").borderRadius(15)
  23. .fontSize(16).textAlign(TextAlign.Center).backgroundColor(Color.White)
  24. }.width("100%").height(100)
  25. }, item => item)
  26. }
  27. .width("100%")
  28. .height("50%")
  29. .edgeEffect(EdgeEffect.None)
  30. .onReachStart(() => {
  31. this.listPosition = 0
  32. })
  33. .onReachEnd(() => {
  34. this.listPosition = 2
  35. })
  36. .onScrollFrameBegin((offset: number) => {
  37. if ((this.listPosition == 0 && offset <= 0) || (this.listPosition == 2 && offset >= 0)) {
  38. this.scrollerForScroll.scrollBy(0, offset)
  39. return { offsetRemain: 0 }
  40. }
  41. this.listPosition = 1
  42. return { offsetRemain: offset };
  43. })
  44. Text("Scroll Area")
  45. .width("100%").height("40%").backgroundColor(0X330000FF)
  46. .fontSize(16).textAlign(TextAlign.Center)
  47. }
  48. }
  49. .width("100%").height("100%")
  50. }.width('100%').height('100%').backgroundColor(0xDCDCDC).padding(20)
  51. }
  52. }

以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)