0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

鴻蒙ArkTS容器組件:Scroll

jf_46214456 ? 來源:jf_46214456 ? 作者:jf_46214456 ? 2024-07-12 15:24 ? 次閱讀

Scroll

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

說明:
開發(fā)前請熟悉鴻蒙開發(fā)指導(dǎo)文檔 :[gitee.com/li-shizhen-skin/harmony-os/blob/master/README.md]

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

子組件

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

接口

Scroll(scroller?: Scroller)

參數(shù)

參數(shù)名參數(shù)類型必填參數(shù)描述
scroller[Scroller]可滾動組件的控制器。用于與可滾動組件進(jìn)行綁定。

屬性

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

名稱參數(shù)類型描述
scrollable[ScrollDirection]設(shè)置滾動方向。 默認(rèn)值:ScrollDirection.Vertical
scrollBar[BarState]設(shè)置滾動條狀態(tài)。 默認(rèn)值:BarState.Auto**說明:**如果容器組件無法滾動,則滾動條不顯示。如果容器組件的子組件大小為無窮大,則滾動條不支持拖動和伴隨滾動。
scrollBarColorstringnumber
scrollBarWidthstringnumber
edgeEffect[EdgeEffect]設(shè)置滑動效果,目前支持的滑動效果參見EdgeEffect的枚舉說明。 默認(rèn)值:EdgeEffect.None
enableScrollInteraction10+boolean設(shè)置是否支持滾動手勢,當(dāng)設(shè)置為false時(shí),無法通過手指或者鼠標(biāo)滾動,但不影響控制器的滾動接口。 默認(rèn)值:true
friction10+number[Resource]

ScrollDirection枚舉說明

名稱描述
Horizontal僅支持水平方向滾動。
Vertical僅支持豎直方向滾動。
None不可滾動。

事件

名稱功能描述
onScrollFrameBegin9+(event: (offset: number, state: ScrollState) => { offsetRemain })每幀開始滾動時(shí)觸發(fā),事件參數(shù)傳入即將發(fā)生的滾動量,事件處理函數(shù)中可根據(jù)應(yīng)用場景計(jì)算實(shí)際需要的滾動量并作為事件處理函數(shù)的返回值返回,Scroll將按照返回值的實(shí)際滾動量進(jìn)行滾動。 - offset:即將發(fā)生的滾動量。 - state:當(dāng)前滾動狀態(tài)。 - offsetRemain:實(shí)際滾動量。 觸發(fā)該事件的條件 : 1、滾動組件觸發(fā)滾動時(shí)觸發(fā),包括鍵鼠操作等其他觸發(fā)滾動的輸入設(shè)置。 2、調(diào)用控制器接口時(shí)不觸發(fā)。 3、越界回彈不觸發(fā)。**說明:**支持offsetRemain為負(fù)值。 若通過onScrollFrameBegine事件和scrollBy方法實(shí)現(xiàn)容器嵌套滾動,需設(shè)置子滾動節(jié)點(diǎn)的EdgeEffect為None。如Scroll嵌套List滾動時(shí),List組件的edgeEffect屬性需設(shè)置為EdgeEffect.None。
onScroll(event: (xOffset: number, yOffset: number) => void)滾動事件回調(diào), 返回滾動時(shí)水平、豎直方向偏移量。 觸發(fā)該事件的條件 : 1、滾動組件觸發(fā)滾動時(shí)觸發(fā),支持鍵鼠操作等其他觸發(fā)滾動的輸入設(shè)置。 2、通過滾動控制器API接口調(diào)用。 3、越界回彈。
onScrollEdge(event: (side: Edge) => void)滾動到邊緣事件回調(diào)。 觸發(fā)該事件的條件 : 1、滾動組件滾動到邊緣時(shí)觸發(fā),支持鍵鼠操作等其他觸發(fā)滾動的輸入設(shè)置。 2、通過滾動控制器API接口調(diào)用。 3、越界回彈。
onScrollStart9+(event: () => void)滾動開始時(shí)觸發(fā)。手指拖動Scroll或拖動Scroll的滾動條觸發(fā)的滾動開始時(shí),會觸發(fā)該事件。使用[Scroller]滾動控制器觸發(fā)的帶動畫的滾動,動畫開始時(shí)會觸發(fā)該事件。 觸發(fā)該事件的條件 : 1、滾動組件開始滾動時(shí)觸發(fā),支持鍵鼠操作等其他觸發(fā)滾動的輸入設(shè)置。 2、通過滾動控制器API接口調(diào)用后開始,帶過渡動效。
onScrollStop9+(event: () => void)滾動停止時(shí)觸發(fā)。手拖動Scroll或拖動Scroll的滾動條觸發(fā)的滾動,手離開屏幕并且滾動停止時(shí)會觸發(fā)該事件。使用[Scroller]滾動控制器觸發(fā)的帶動畫的滾動,動畫停止時(shí)會觸發(fā)該事件。 觸發(fā)該事件的條件 : 1、滾動組件觸發(fā)滾動后停止,支持鍵鼠操作等其他觸發(fā)滾動的輸入設(shè)置。 2、通過滾動控制器API接口調(diào)用后開始,帶過渡動效。

說明:

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

Scroller

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

導(dǎo)入對象

scroller: Scroller = new Scroller()

scrollTo

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

滑動到指定位置。

參數(shù):

參數(shù)名參數(shù)類型必填參數(shù)描述
xOffsetnumberstring
yOffsetnumberstring
animation{ duration?: number, curve?: [Curve][ICurve]10+ }boolean10+

scrollEdge

scrollEdge(value: Edge): void

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

參數(shù):

參數(shù)名參數(shù)類型必填參數(shù)描述
value[Edge]滾動到的邊緣位置。

scrollPage

scrollPage(value: { next: boolean }): void

滾動到下一頁或者上一頁。

參數(shù):

參數(shù)名參數(shù)類型必填參數(shù)描述
nextboolean是否向下翻頁。true表示向下翻頁,false表示向上翻頁。

currentOffset

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

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

返回值

類型描述
{ xOffset: number, yOffset: number }xOffset: 水平滑動偏移; yOffset: 豎直滑動偏移。**說明:**返回值單位為vp。

scrollToIndex

scrollToIndex(value: number, smooth?: boolean, align?: ScrollAlign): void

滑動到指定Index。

開啟smooth動效時(shí),會對經(jīng)過的所有item進(jìn)行加載和布局計(jì)算,當(dāng)大量加載item時(shí)會導(dǎo)致性能問題。

說明:

僅支持Grid、List、WaterFlow組件。

參數(shù):

參數(shù)名參數(shù)類型必填參數(shù)描述
valuenumber要滑動到的目標(biāo)元素在當(dāng)前容器中的索引值。**說明:**value值設(shè)置成負(fù)值或者大于當(dāng)前容器子組件的最大索引值,視為異常值,本次跳轉(zhuǎn)不生效。
smooth10+boolean設(shè)置滑動到列表項(xiàng)在列表中的索引值時(shí)是否有動效,true表示有動效,false表示沒有動效。 默認(rèn)值:false。**說明:**當(dāng)前僅List組件支持該參數(shù)。
align10+[ScrollAlign]指定滑動到的元素與當(dāng)前容器的對齊方式。 List中的默認(rèn)值為:ScrollAlign.START。Grid中默認(rèn)值為:ScrollAlign.AUTO**說明:**當(dāng)前僅List、Grid組件支持該參數(shù)。

scrollBy9+

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

滑動指定距離。

說明:

僅支持Scroll、ScrollBar、Grid、List組件。

參數(shù):

參數(shù)名參數(shù)類型必填參數(shù)描述
dxLength水平方向滾動距離,不支持百分比形式。
dyLength豎直方向滾動距離,不支持百分比形式。

isAtEnd10+

isAtEnd(): boolean

查詢組件是否滾動到底部。

說明:

支持Scroll、List、Grid、WaterFlow組件。

返回值

類型描述
booleantrue表示組件已經(jīng)滾動到底部,false表示組件還沒滾動到底部。

ScrollAlign枚舉說明10+

名稱描述HarmonyOSOpenHarmony鴻蒙文檔籽料:mau123789是v直接拿
START首部對齊。指定item首部與List首部對齊。
CENTER居中對齊。指定item主軸方向居中對齊于List。
END尾部對齊。指定item尾部與List尾部對齊。
AUTO自動對齊。 若指定item完全處于顯示區(qū),不做調(diào)整。否則依照滑動距離最短的原則,將指定item首部對齊或尾部對齊于List,使指定item完全處于顯示區(qū)。

示例

示例1

// xxx.ets
import Curves from '@ohos.curves'

@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: number) = > {
            Text(item.toString())
              .width('90%')
              .height(150)
              .backgroundColor(0xFFFFFF)
              .borderRadius(15)
              .fontSize(16)
              .textAlign(TextAlign.Center)
              .margin({ top: 10 })
          }, (item: string) = > item)
        }.width('100%')
      }
      .scrollable(ScrollDirection.Vertical)  // 滾動方向縱向
      .scrollBar(BarState.On)  // 滾動條常駐顯示
      .scrollBarColor(Color.Gray)  // 滾動條顏色
      .scrollBarWidth(10) // 滾動條寬度
      .friction(0.6)
      .edgeEffect(EdgeEffect.None)
      .onScroll((xOffset: number, yOffset: number) = > {
        console.info(xOffset + ' ' + yOffset)
      })
      .onScrollEdge((side: Edge) = > {
        console.info('To the edge')
      })

      Button('scroll 150')
        .height('5%')
        .onClick(() = > { // 點(diǎn)擊后下滑指定距離150.0vp
          this.scroller.scrollBy(0,150)
        })
        .margin({ top: 10, left: 20 })
      Button('scroll 100')
        .height('5%')
        .onClick(() = > { // 點(diǎn)擊后滑動到指定位置,即下滑100.0vp的距離
          const yOffset: number = this.scroller.currentOffset().yOffset;
          this.scroller.scrollTo({ xOffset: 0, yOffset: yOffset + 100 })
        })
        .margin({ top: 60, left: 20 })
      Button('scroll 100')
        .height('5%')
        .onClick(() = > { // 點(diǎn)擊后滑動到指定位置,即下滑100.0vp的距離,滑動過程配置有動畫
          let curve = Curves.interpolatingSpring(100, 1, 228, 30) //創(chuàng)建一個(gè)階梯曲線
          const yOffset: number = this.scroller.currentOffset().yOffset;
          this.scroller.scrollTo({ xOffset: 0, yOffset: yOffset + 100, animation: { duration: 1000, curve: curve } })
        })
        .margin({ top: 110, left: 20 })
      Button('back top')
        .height('5%')
        .onClick(() = > { // 點(diǎn)擊后回到頂部
          this.scroller.scrollEdge(Edge.Top)
        })
        .margin({ top: 160, left: 20 })
      Button('next page')
        .height('5%')
        .onClick(() = > { // 點(diǎn)擊后滑到下一頁
          this.scroller.scrollPage({ next: true })
        })
        .margin({ top: 210, left: 20 })
    }.width('100%').height('100%').backgroundColor(0xDCDCDC)
  }
}

示例2

@Entry
@Component
struct NestedScroll {
  @State listPosition: number = 0; // 0代表滾動到List頂部,1代表中間值,2代表滾動到List底部。
  private arr: number[] = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
  private scrollerForScroll: Scroller = new Scroller()
  private scrollerForList: Scroller = new Scroller()

  build() {
    Flex() {
      Scroll(this.scrollerForScroll) {
        Column() {
          Text("Scroll Area")
            .width("100%")
            .height("40%")
            .backgroundColor(0X330000FF)
            .fontSize(16)
            .textAlign(TextAlign.Center)
            .onClick(() = > {
              this.scrollerForList.scrollToIndex(5)
            })

          List({ space: 20, scroller: this.scrollerForList }) {
            ForEach(this.arr, (item: number) = > {
              ListItem() {
                Text("ListItem" + item)
                  .width("100%")
                  .height("100%")
                  .borderRadius(15)
                  .fontSize(16)
                  .textAlign(TextAlign.Center)
                  .backgroundColor(Color.White)
              }.width("100%").height(100)
            }, (item: string) = > item)
          }
          .width("100%")
          .height("50%")
          .edgeEffect(EdgeEffect.None)
          .friction(0.6)
          .onReachStart(() = > {
            this.listPosition = 0
          })
          .onReachEnd(() = > {
            this.listPosition = 2
          })
          .onScrollFrameBegin((offset: number) = > {
            if ((this.listPosition == 0 && offset <= 0) || (this.listPosition == 2 && offset >= 0)) {
              this.scrollerForScroll.scrollBy(0, offset)
              return { offsetRemain: 0 }
            }
            this.listPosition = 1
            return { offsetRemain: offset };
          })

          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)
  }
}

審核編輯 黃宇

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報(bào)投訴
  • 組件
    +關(guān)注

    關(guān)注

    1

    文章

    495

    瀏覽量

    17726
  • 鴻蒙
    +關(guān)注

    關(guān)注

    56

    文章

    2267

    瀏覽量

    42481
收藏 人收藏

    評論

    相關(guān)推薦

    鴻蒙ArkTS聲明式組件:ScrollBar

    滾動條組件ScrollBar,用于配合可滾動組件使用,如List、Grid、Scroll。
    的頭像 發(fā)表于 07-01 15:52 ?333次閱讀
    <b class='flag-5'>鴻蒙</b><b class='flag-5'>ArkTS</b>聲明式<b class='flag-5'>組件</b>:ScrollBar

    鴻蒙ArkTS容器組件:Column

    沿垂直方向布局的容器。
    的頭像 發(fā)表于 07-05 16:32 ?286次閱讀
    <b class='flag-5'>鴻蒙</b><b class='flag-5'>ArkTS</b><b class='flag-5'>容器</b><b class='flag-5'>組件</b>:Column

    鴻蒙ArkTS容器組件:Flex

    以彈性方式布局子組件容器組件。
    的頭像 發(fā)表于 07-08 10:19 ?270次閱讀
    <b class='flag-5'>鴻蒙</b><b class='flag-5'>ArkTS</b><b class='flag-5'>容器</b><b class='flag-5'>組件</b>:Flex

    鴻蒙ArkTS容器組件:FlowItem

    [瀑布流組件]的子組件,用來展示瀑布流具體item。
    的頭像 發(fā)表于 07-08 09:56 ?225次閱讀
    <b class='flag-5'>鴻蒙</b><b class='flag-5'>ArkTS</b><b class='flag-5'>容器</b><b class='flag-5'>組件</b>:FlowItem

    鴻蒙ArkTS容器組件:GridCol

    柵格子組件,必須作為柵格容器組件([GridRow])的子組件使用。
    的頭像 發(fā)表于 07-08 15:17 ?259次閱讀
    <b class='flag-5'>鴻蒙</b><b class='flag-5'>ArkTS</b><b class='flag-5'>容器</b><b class='flag-5'>組件</b>:GridCol

    鴻蒙ArkTS容器組件:GridItem

    網(wǎng)格容器中單項(xiàng)內(nèi)容容器。
    的頭像 發(fā)表于 07-09 09:25 ?233次閱讀
    <b class='flag-5'>鴻蒙</b><b class='flag-5'>ArkTS</b><b class='flag-5'>容器</b><b class='flag-5'>組件</b>:GridItem

    鴻蒙ArkTS容器組件:ListItemGroup

    組件用來展示列表item分組,寬度默認(rèn)充滿[List]組件,必須配合List組件來使用。
    的頭像 發(fā)表于 07-10 09:20 ?360次閱讀
    <b class='flag-5'>鴻蒙</b><b class='flag-5'>ArkTS</b><b class='flag-5'>容器</b><b class='flag-5'>組件</b>:ListItemGroup

    鴻蒙ArkTS容器組件:Navigator

    路由容器組件,提供路由跳轉(zhuǎn)能力。
    的頭像 發(fā)表于 07-10 14:55 ?272次閱讀

    鴻蒙ArkTS容器組件:Refresh

    可以進(jìn)行頁面下拉操作并顯示刷新動效的容器組件。
    的頭像 發(fā)表于 07-11 16:11 ?292次閱讀

    鴻蒙ArkTS容器組件:RowSplit

    將子組件橫向布局,并在每個(gè)子組件之間插入一根縱向的分割線。
    的頭像 發(fā)表于 07-11 22:25 ?180次閱讀

    鴻蒙ArkTS容器組件:SideBarContainer

    提供側(cè)邊欄可以顯示和隱藏的側(cè)邊欄容器,通過子組件定義側(cè)邊欄和內(nèi)容區(qū),第一個(gè)子組件表示側(cè)邊欄,第二個(gè)子組件表示內(nèi)容區(qū)。
    的頭像 發(fā)表于 07-18 15:46 ?324次閱讀
    <b class='flag-5'>鴻蒙</b><b class='flag-5'>ArkTS</b><b class='flag-5'>容器</b><b class='flag-5'>組件</b>:SideBarContainer

    鴻蒙ArkTS容器組件:Stack

    堆疊容器,子組件按照順序依次入棧,后一個(gè)子組件覆蓋前一個(gè)子組件
    的頭像 發(fā)表于 07-15 18:23 ?677次閱讀

    鴻蒙ArkTS容器組件:Swiper

    滑塊視圖容器,提供子組件滑動輪播顯示的能力。
    的頭像 發(fā)表于 07-15 09:51 ?323次閱讀
    <b class='flag-5'>鴻蒙</b><b class='flag-5'>ArkTS</b><b class='flag-5'>容器</b><b class='flag-5'>組件</b>:Swiper

    鴻蒙ArkTS容器組件:Tabs

    通過頁簽進(jìn)行內(nèi)容視圖切換的容器組件,每個(gè)頁簽對應(yīng)一個(gè)內(nèi)容視圖。
    的頭像 發(fā)表于 07-15 09:48 ?465次閱讀
    <b class='flag-5'>鴻蒙</b><b class='flag-5'>ArkTS</b><b class='flag-5'>容器</b><b class='flag-5'>組件</b>:Tabs

    鴻蒙ArkTS容器組件:WaterFlow

    瀑布流容器,由“行”和“列”分割的單元格所組成,通過容器自身的排列規(guī)則,將不同大小的“項(xiàng)目”自上而下,如瀑布般緊密布局。
    的頭像 發(fā)表于 07-15 17:35 ?296次閱讀
    <b class='flag-5'>鴻蒙</b><b class='flag-5'>ArkTS</b><b class='flag-5'>容器</b><b class='flag-5'>組件</b>:WaterFlow