W3Cschool
恭喜您成為首批注冊用戶
獲得88經(jīng)驗值獎勵
瀑布流容器,由“行”和“列”分割的單元格所組成,通過容器自身的排列規(guī)則,將不同大小的“項目”自上而下,如瀑布般緊密布局。
該組件從API Version 9開始支持。后續(xù)版本如有新增內(nèi)容,則采用上角標(biāo)單獨標(biāo)記該內(nèi)容的起始版本。
WaterFlow(options?: {footer?: CustomBuilder, scroller?: Scroller})
參數(shù):
參數(shù)名 | 參數(shù)類型 | 必填 | 參數(shù)描述 |
---|---|---|---|
footer | 否 | 設(shè)置WaterFlow尾部組件。 | |
scroller | 否 | 可滾動組件的控制器,與可滾動組件綁定。 目前瀑布流僅支持Scroller組件的scrollToIndex接口。 |
除支持通用屬性外,還支持以下屬性:
名稱 | 參數(shù)類型 | 描述 |
---|---|---|
columnsTemplate | string | 設(shè)置當(dāng)前瀑布流組件布局列的數(shù)量,不設(shè)置時默認(rèn)1列。 例如, '1fr 1fr 2fr' 是將父組件分3列,將父組件允許的寬分為4等份,第一列占1份,第二列占1份,第三列占2份。并支持auto-fill。 默認(rèn)值:'1fr' |
rowsTemplate | string | 設(shè)置當(dāng)前瀑布流組件布局行的數(shù)量,不設(shè)置時默認(rèn)1行。 例如, '1fr 1fr 2fr'是將父組件分三行,將父組件允許的高分為4等份,第一行占1份,第二行占一份,第三行占2份。并支持auto-fill。 默認(rèn)值:'1fr' |
itemConstraintSize | 設(shè)置約束尺寸,子組件布局時,進(jìn)行尺寸范圍限制。 | |
columnsGap | Length | 設(shè)置列與列的間距。 默認(rèn)值:0 |
rowsGap | Length | 設(shè)置行與行的間距。 默認(rèn)值:0 |
layoutDirection | 設(shè)置布局的主軸方向。 默認(rèn)值:FlexDirection.Column |
layoutDirection優(yōu)先級高于rowsTemplate和columnsTemplate。根據(jù)layoutDirection設(shè)置情況,分為以下三種設(shè)置模式:
此時columnsTemplate有效(如果未設(shè)置,取默認(rèn)值)。例如columnsTemplate設(shè)置為"1fr 1fr"、rowsTemplate設(shè)置為"1fr 1fr 1fr"時,瀑布流組件縱向布局,輔軸均分成橫向2列。
此時rowsTemplate有效(如果未設(shè)置,取默認(rèn)值)。例如columnsTemplate設(shè)置為"1fr 1fr"、rowsTemplate設(shè)置為"1fr 1fr 1fr"時,瀑布流組件橫向布局,輔軸均分成縱向3列。
布局方向為layoutDirection的默認(rèn)值:FlexDirection.Column,此時columnsTemplate有效。例如columnsTemplate設(shè)置為"1fr 1fr"、rowsTemplate設(shè)置為"1fr 1fr 1fr"時,瀑布流組件縱向布局,輔軸均分成橫向2列。
除支持通用事件外,還支持以下事件:
名稱 | 功能描述 |
---|---|
onReachStart(event: () => void) | 瀑布流組件到達(dá)起始位置時觸發(fā)。 |
onReachEnd(event: () => void) | 瀑布流組件到底末尾位置時觸發(fā)。 |
WaterFlow的columnsTemplate、rowsTemplate屬性的auto-fill僅支持以下格式:
- repeat(auto-fill, track-size)
其中repeat、auto-fill為關(guān)鍵字。track-size為行高或者列寬,支持的單位包括px、vp、%或有效數(shù)字,track-size至少包括一個有效行高或者列寬。
- // WaterFlowDataSource.ets
- // 實現(xiàn)IDataSource接口的對象,用于瀑布流組件加載數(shù)據(jù)
- export class WaterFlowDataSource implements IDataSource {
- private dataArray: number[] = []
- private listeners: DataChangeListener[] = []
- constructor() {
- for (let i = 0; i < 100; i++) {
- this.dataArray.push(i)
- }
- }
- // 獲取索引對應(yīng)的數(shù)據(jù)
- public getData(index: number): any {
- return this.dataArray[index]
- }
- // 通知控制器數(shù)據(jù)重新加載
- notifyDataReload(): void {
- this.listeners.forEach(listener => {
- listener.onDataReloaded()
- })
- }
- // 通知控制器數(shù)據(jù)增加
- notifyDataAdd(index: number): void {
- this.listeners.forEach(listener => {
- listener.onDataAdded(index)
- })
- }
- // 通知控制器數(shù)據(jù)變化
- notifyDataChange(index: number): void {
- this.listeners.forEach(listener => {
- listener.onDataChanged(index)
- })
- }
- // 通知控制器數(shù)據(jù)刪除
- notifyDataDelete(index: number): void {
- this.listeners.forEach(listener => {
- listener.onDataDeleted(index)
- })
- }
- // 通知控制器數(shù)據(jù)位置變化
- notifyDataMove(from: number, to: number): void {
- this.listeners.forEach(listener => {
- listener.onDataMoved(from, to)
- })
- }
- // 獲取數(shù)據(jù)總數(shù)
- public totalCount(): number {
- return this.dataArray.length
- }
- // 注冊改變數(shù)據(jù)的控制器
- registerDataChangeListener(listener: DataChangeListener): void {
- if (this.listeners.indexOf(listener) < 0) {
- this.listeners.push(listener)
- }
- }
- // 注銷改變數(shù)據(jù)的控制器
- unregisterDataChangeListener(listener: DataChangeListener): void {
- const pos = this.listeners.indexOf(listener)
- if (pos >= 0) {
- this.listeners.splice(pos, 1)
- }
- }
- // 增加數(shù)據(jù)
- public Add1stItem(): void {
- this.dataArray.splice(0, 0, this.dataArray.length)
- this.notifyDataAdd(0)
- }
- // 在數(shù)據(jù)尾部增加一個元素
- public AddLastItem(): void {
- this.dataArray.splice(this.dataArray.length, 0, this.dataArray.length)
- this.notifyDataAdd(this.dataArray.length-1)
- }
- // 在指定索引位置增加一個元素
- public AddItem(index: number): void {
- this.dataArray.splice(index, 0, this.dataArray.length)
- this.notifyDataAdd(index)
- }
- // 刪除第一個元素
- public Delete1stItem(): void {
- this.dataArray.splice(0, 1)
- this.notifyDataDelete(0)
- }
- // 刪除第二個元素
- public Delete2ndItem(): void {
- this.dataArray.splice(1, 1)
- this.notifyDataDelete(1)
- }
- // 刪除最后一個元素
- public DeleteLastItem(): void {
- this.dataArray.splice(-1, 1)
- this.notifyDataDelete(this.dataArray.length)
- }
- // 重新加載數(shù)據(jù)
- public Reload(): void {
- this.dataArray.splice(1, 1)
- this.dataArray.splice(3, 2)
- this.notifyDataReload()
- }
- }
- // WaterflowDemo.ets
- import { WaterFlowDataSource } from './WaterFlowDataSource'
- @Entry
- @Component
- struct WaterflowDemo {
- @State minSize: number = 50
- @State maxSize: number = 100
- @State fontSize: number = 24
- @State colors: number[] = [0xFFC0CB, 0xDA70D6, 0x6B8E23, 0x6A5ACD, 0x00FFFF, 0x00FF7F]
- scroller: Scroller = new Scroller()
- datasource: WaterFlowDataSource = new WaterFlowDataSource()
- private itemWidthArray: number[] = []
- private itemHeightArray: number[] = []
- // 計算flow item寬/高
- getSize() {
- let ret = Math.floor(Math.random() * this.maxSize)
- return (ret > this.minSize ? ret : this.minSize)
- }
- // 保存flow item寬/高
- getItemSizeArray() {
- for (let i = 0; i < 100; i++) {
- this.itemWidthArray.push(this.getSize())
- this.itemHeightArray.push(this.getSize())
- }
- }
- aboutToAppear() {
- this.getItemSizeArray()
- }
- @Builder itemFoot() {
- Column() {
- Text(`Footer`)
- .fontSize(10)
- .backgroundColor(Color.Red)
- .width(50)
- .height(50)
- .align(Alignment.Center)
- .margin({ top: 2 })
- }
- }
- build() {
- Column({ space: 2 }) {
- WaterFlow({ footer: this.itemFoot.bind(this), scroller: this.scroller }) {
- LazyForEach(this.datasource, (item: number) => {
- FlowItem() {
- Column() {
- Text("N" + item).fontSize(12).height('16')
- Image('res/waterFlowTest(' + item % 5 + ').jpg')
- .objectFit(ImageFit.Fill)
- }
- }
- .width(this.itemWidthArray[item])
- .height(this.itemHeightArray[item])
- .backgroundColor(this.colors[item % 5])
- }, item => item)
- }
- .columnsTemplate("1fr 1fr 1fr 1fr")
- .itemConstraintSize({
- minWidth: 0,
- maxWidth: '100%',
- minHeight: 0,
- maxHeight: '100%'
- })
- .columnsGap(10)
- .rowsGap(5)
- .onReachStart(() => {
- console.info("onReachStart")
- })
- .onReachEnd(() => {
- console.info("onReachEnd")
- })
- .backgroundColor(0xFAEEE0)
- .width('100%')
- .height('80%')
- .layoutDirection(FlexDirection.Column)
- }
- }
- }
Copyright©2021 w3cschool編程獅|閩ICP備15016281號-3|閩公網(wǎng)安備35020302033924號
違法和不良信息舉報電話:173-0602-2364|舉報郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號
聯(lián)系方式:
更多建議: