Scroll
可滾動的容器組件,當子組件的布局尺寸超過父組件的尺寸時,內容可以滾動。
說明:
開發前請熟悉鴻蒙開發指導文檔 :[gitee.com/li-shizhen-skin/harmony-os/blob/master/README.md
]
- 該組件從API version 7開始支持。后續版本如有新增內容,則采用上角標單獨標記該內容的起始版本。
- 該組件嵌套List子組件滾動時,若List不設置寬高,則默認全部加載,在對性能有要求的場景下建議指定List的寬高。
- 該組件滾動的前提是主軸方向大小小于內容大小。
- 該組件回彈的前提是要有滾動。內容小于一屏時,沒有回彈效果。
子組件
支持單個子組件。
接口
Scroll(scroller?: Scroller)
參數:
參數名 | 參數類型 | 必填 | 參數描述 |
---|---|---|---|
scroller | [Scroller] | 否 | 可滾動組件的控制器。用于與可滾動組件進行綁定。 |
屬性
除支持[通用屬性]外,還支持以下屬性:
名稱 | 參數類型 | 描述 |
---|---|---|
scrollable | [ScrollDirection] | 設置滾動方向。 默認值:ScrollDirection.Vertical |
scrollBar | [BarState] | 設置滾動條狀態。 默認值:BarState.Auto**說明:**如果容器組件無法滾動,則滾動條不顯示。如果容器組件的子組件大小為無窮大,則滾動條不支持拖動和伴隨滾動。 |
scrollBarColor | string | number |
scrollBarWidth | string | number |
edgeEffect | [EdgeEffect] | 設置滑動效果,目前支持的滑動效果參見EdgeEffect的枚舉說明。 默認值:EdgeEffect.None |
enableScrollInteraction10+ | boolean | 設置是否支持滾動手勢,當設置為false時,無法通過手指或者鼠標滾動,但不影響控制器的滾動接口。 默認值:true |
friction10+ | number | [Resource] |
ScrollDirection枚舉說明
名稱 | 描述 |
---|---|
Horizontal | 僅支持水平方向滾動。 |
Vertical | 僅支持豎直方向滾動。 |
None | 不可滾動。 |
事件
名稱 | 功能描述 |
---|---|
onScrollFrameBegin9+(event: (offset: number, state: ScrollState) => { offsetRemain }) | 每幀開始滾動時觸發,事件參數傳入即將發生的滾動量,事件處理函數中可根據應用場景計算實際需要的滾動量并作為事件處理函數的返回值返回,Scroll將按照返回值的實際滾動量進行滾動。 - offset:即將發生的滾動量。 - state:當前滾動狀態。 - offsetRemain:實際滾動量。 觸發該事件的條件 : 1、滾動組件觸發滾動時觸發,包括鍵鼠操作等其他觸發滾動的輸入設置。 2、調用控制器接口時不觸發。 3、越界回彈不觸發。**說明:**支持offsetRemain為負值。 若通過onScrollFrameBegine事件和scrollBy方法實現容器嵌套滾動,需設置子滾動節點的EdgeEffect為None。如Scroll嵌套List滾動時,List組件的edgeEffect屬性需設置為EdgeEffect.None。 |
onScroll(event: (xOffset: number, yOffset: number) => void) | 滾動事件回調, 返回滾動時水平、豎直方向偏移量。 觸發該事件的條件 : 1、滾動組件觸發滾動時觸發,支持鍵鼠操作等其他觸發滾動的輸入設置。 2、通過滾動控制器API接口調用。 3、越界回彈。 |
onScrollEdge(event: (side: Edge) => void) | 滾動到邊緣事件回調。 觸發該事件的條件 : 1、滾動組件滾動到邊緣時觸發,支持鍵鼠操作等其他觸發滾動的輸入設置。 2、通過滾動控制器API接口調用。 3、越界回彈。 |
onScrollStart9+(event: () => void) | 滾動開始時觸發。手指拖動Scroll或拖動Scroll的滾動條觸發的滾動開始時,會觸發該事件。使用[Scroller]滾動控制器觸發的帶動畫的滾動,動畫開始時會觸發該事件。 觸發該事件的條件 : 1、滾動組件開始滾動時觸發,支持鍵鼠操作等其他觸發滾動的輸入設置。 2、通過滾動控制器API接口調用后開始,帶過渡動效。 |
onScrollStop9+(event: () => void) | 滾動停止時觸發。手拖動Scroll或拖動Scroll的滾動條觸發的滾動,手離開屏幕并且滾動停止時會觸發該事件。使用[Scroller]滾動控制器觸發的帶動畫的滾動,動畫停止時會觸發該事件。 觸發該事件的條件 : 1、滾動組件觸發滾動后停止,支持鍵鼠操作等其他觸發滾動的輸入設置。 2、通過滾動控制器API接口調用后開始,帶過渡動效。 |
說明:
若通過onScrollFrameBegin事件和scrollBy方法實現容器嵌套滾動,需設置子滾動節點的EdgeEffect為None。如Scroll嵌套List滾動時,List組件的edgeEffect屬性需設置為EdgeEffect.None。
Scroller
可滾動容器組件的控制器,可以將此組件綁定至容器組件,然后通過它控制容器組件的滾動,同一個控制器不可以控制多個容器組件,目前支持綁定到List、Scroll、ScrollBar、Grid、WaterFlow上。
導入對象
scroller: Scroller = new Scroller()
scrollTo
scrollTo(value: { xOffset: number | string, yOffset: number | string, animation?: { duration?: number, curve?: Curve | ICurve } | boolean }): void
滑動到指定位置。
參數:
參數名 | 參數類型 | 必填 | 參數描述 |
---|---|---|---|
xOffset | number | string | 是 |
yOffset | number | string | 是 |
animation | { duration?: number, curve?: [Curve] | [ICurve]10+ } | boolean10+ |
scrollEdge
scrollEdge(value: Edge): void
滾動到容器邊緣,不區分滾動軸方向,Edge.Top和Edge.Start表現相同,Edge.Bottom和Edge.End表現相同。
參數:
參數名 | 參數類型 | 必填 | 參數描述 |
---|---|---|---|
value | [Edge] | 是 | 滾動到的邊緣位置。 |
scrollPage
scrollPage(value: { next: boolean }): void
滾動到下一頁或者上一頁。
參數:
參數名 | 參數類型 | 必填 | 參數描述 |
---|---|---|---|
next | boolean | 是 | 是否向下翻頁。true表示向下翻頁,false表示向上翻頁。 |
currentOffset
currentOffset(): { xOffset: number, yOffset: number }
返回當前的滾動偏移量。
返回值
類型 | 描述 |
---|---|
{ xOffset: number, yOffset: number } | xOffset: 水平滑動偏移; yOffset: 豎直滑動偏移。**說明:**返回值單位為vp。 |
scrollToIndex
scrollToIndex(value: number, smooth?: boolean, align?: ScrollAlign): void
滑動到指定Index。
開啟smooth動效時,會對經過的所有item進行加載和布局計算,當大量加載item時會導致性能問題。
說明:
僅支持Grid、List、WaterFlow組件。
參數:
參數名 | 參數類型 | 必填 | 參數描述 |
---|---|---|---|
value | number | 是 | 要滑動到的目標元素在當前容器中的索引值。**說明:**value值設置成負值或者大于當前容器子組件的最大索引值,視為異常值,本次跳轉不生效。 |
smooth10+ | boolean | 否 | 設置滑動到列表項在列表中的索引值時是否有動效,true表示有動效,false表示沒有動效。 默認值:false。**說明:**當前僅List組件支持該參數。 |
align10+ | [ScrollAlign] | 否 | 指定滑動到的元素與當前容器的對齊方式。 List中的默認值為:ScrollAlign.START。Grid中默認值為:ScrollAlign.AUTO**說明:**當前僅List、Grid組件支持該參數。 |
scrollBy9+
scrollBy(dx: Length, dy: Length): void
滑動指定距離。
說明:
僅支持Scroll、ScrollBar、Grid、List組件。
參數:
參數名 | 參數類型 | 必填 | 參數描述 |
---|---|---|---|
dx | Length | 是 | 水平方向滾動距離,不支持百分比形式。 |
dy | Length | 是 | 豎直方向滾動距離,不支持百分比形式。 |
isAtEnd10+
isAtEnd(): boolean
查詢組件是否滾動到底部。
說明:
支持Scroll、List、Grid、WaterFlow組件。
返回值
類型 | 描述 |
---|---|
boolean | true表示組件已經滾動到底部,false表示組件還沒滾動到底部。 |
ScrollAlign枚舉說明10+
名稱 | 描述HarmonyOS與OpenHarmony鴻蒙文檔籽料:mau123789是v直接拿 |
---|---|
START | 首部對齊。指定item首部與List首部對齊。 |
CENTER | 居中對齊。指定item主軸方向居中對齊于List。 |
END | 尾部對齊。指定item尾部與List尾部對齊。 |
AUTO | 自動對齊。 若指定item完全處于顯示區,不做調整。否則依照滑動距離最短的原則,將指定item首部對齊或尾部對齊于List,使指定item完全處于顯示區。 |
示例
示例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(() = > { // 點擊后下滑指定距離150.0vp
this.scroller.scrollBy(0,150)
})
.margin({ top: 10, left: 20 })
Button('scroll 100')
.height('5%')
.onClick(() = > { // 點擊后滑動到指定位置,即下滑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(() = > { // 點擊后滑動到指定位置,即下滑100.0vp的距離,滑動過程配置有動畫
let curve = Curves.interpolatingSpring(100, 1, 228, 30) //創建一個階梯曲線
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(() = > { // 點擊后回到頂部
this.scroller.scrollEdge(Edge.Top)
})
.margin({ top: 160, left: 20 })
Button('next page')
.height('5%')
.onClick(() = > { // 點擊后滑到下一頁
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)
}
}
審核編輯 黃宇
-
組件
+關注
關注
1文章
512瀏覽量
17836 -
鴻蒙
+關注
關注
57文章
2358瀏覽量
42871
發布評論請先 登錄
相關推薦
評論