瀑布流容器

2024-01-22 17:59 更新

瀑布流容器,由“行”和“列”分割的單元格所組成,通過容器自身的排列規(guī)則,將不同大小的“項目”自上而下,如瀑布般緊密布局。

說明

該組件從API Version 9開始支持。后續(xù)版本如有新增內(nèi)容,則采用上角標(biāo)單獨標(biāo)記該內(nèi)容的起始版本。

子組件

包含FlowItem子組件。

說明

WaterFlow子組件的visibility屬性設(shè)置為None時不顯示,但依然會占用子組件對應(yīng)的網(wǎng)格。

接口

WaterFlow(options?: {footer?: CustomBuilder, scroller?: Scroller})

參數(shù):

參數(shù)名

參數(shù)類型

必填

參數(shù)描述

footer

CustomBuilder

設(shè)置WaterFlow尾部組件。

scroller

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

ConstraintSizeOptions

設(shè)置約束尺寸,子組件布局時,進(jìn)行尺寸范圍限制。

columnsGap

Length

設(shè)置列與列的間距。

默認(rèn)值:0

rowsGap

Length

設(shè)置行與行的間距。

默認(rèn)值:0

layoutDirection

FlexDirection

設(shè)置布局的主軸方向。

默認(rèn)值:FlexDirection.Column

layoutDirection優(yōu)先級高于rowsTemplate和columnsTemplate。根據(jù)layoutDirection設(shè)置情況,分為以下三種設(shè)置模式:

  • layoutDirection設(shè)置縱向布局(FlexDirection.Column 或 FlexDirection.ColumnReverse)

    此時columnsTemplate有效(如果未設(shè)置,取默認(rèn)值)。例如columnsTemplate設(shè)置為"1fr 1fr"、rowsTemplate設(shè)置為"1fr 1fr 1fr"時,瀑布流組件縱向布局,輔軸均分成橫向2列。

  • layoutDirection設(shè)置橫向布局(FlexDirection.Row 或 FlexDirection.RowReverse)

    此時rowsTemplate有效(如果未設(shè)置,取默認(rèn)值)。例如columnsTemplate設(shè)置為"1fr 1fr"、rowsTemplate設(shè)置為"1fr 1fr 1fr"時,瀑布流組件橫向布局,輔軸均分成縱向3列。

  • layoutDirection未設(shè)置布局方向

    布局方向為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ā)。

auto-fill說明

WaterFlow的columnsTemplate、rowsTemplate屬性的auto-fill僅支持以下格式:

  1. repeat(auto-fill, track-size)

其中repeat、auto-fill為關(guān)鍵字。track-size為行高或者列寬,支持的單位包括px、vp、%或有效數(shù)字,track-size至少包括一個有效行高或者列寬。

示例

  1. // WaterFlowDataSource.ets
  2. // 實現(xiàn)IDataSource接口的對象,用于瀑布流組件加載數(shù)據(jù)
  3. export class WaterFlowDataSource implements IDataSource {
  4. private dataArray: number[] = []
  5. private listeners: DataChangeListener[] = []
  6. constructor() {
  7. for (let i = 0; i < 100; i++) {
  8. this.dataArray.push(i)
  9. }
  10. }
  11. // 獲取索引對應(yīng)的數(shù)據(jù)
  12. public getData(index: number): any {
  13. return this.dataArray[index]
  14. }
  15. // 通知控制器數(shù)據(jù)重新加載
  16. notifyDataReload(): void {
  17. this.listeners.forEach(listener => {
  18. listener.onDataReloaded()
  19. })
  20. }
  21. // 通知控制器數(shù)據(jù)增加
  22. notifyDataAdd(index: number): void {
  23. this.listeners.forEach(listener => {
  24. listener.onDataAdded(index)
  25. })
  26. }
  27. // 通知控制器數(shù)據(jù)變化
  28. notifyDataChange(index: number): void {
  29. this.listeners.forEach(listener => {
  30. listener.onDataChanged(index)
  31. })
  32. }
  33. // 通知控制器數(shù)據(jù)刪除
  34. notifyDataDelete(index: number): void {
  35. this.listeners.forEach(listener => {
  36. listener.onDataDeleted(index)
  37. })
  38. }
  39. // 通知控制器數(shù)據(jù)位置變化
  40. notifyDataMove(from: number, to: number): void {
  41. this.listeners.forEach(listener => {
  42. listener.onDataMoved(from, to)
  43. })
  44. }
  45. // 獲取數(shù)據(jù)總數(shù)
  46. public totalCount(): number {
  47. return this.dataArray.length
  48. }
  49. // 注冊改變數(shù)據(jù)的控制器
  50. registerDataChangeListener(listener: DataChangeListener): void {
  51. if (this.listeners.indexOf(listener) < 0) {
  52. this.listeners.push(listener)
  53. }
  54. }
  55. // 注銷改變數(shù)據(jù)的控制器
  56. unregisterDataChangeListener(listener: DataChangeListener): void {
  57. const pos = this.listeners.indexOf(listener)
  58. if (pos >= 0) {
  59. this.listeners.splice(pos, 1)
  60. }
  61. }
  62. // 增加數(shù)據(jù)
  63. public Add1stItem(): void {
  64. this.dataArray.splice(0, 0, this.dataArray.length)
  65. this.notifyDataAdd(0)
  66. }
  67. // 在數(shù)據(jù)尾部增加一個元素
  68. public AddLastItem(): void {
  69. this.dataArray.splice(this.dataArray.length, 0, this.dataArray.length)
  70. this.notifyDataAdd(this.dataArray.length-1)
  71. }
  72. // 在指定索引位置增加一個元素
  73. public AddItem(index: number): void {
  74. this.dataArray.splice(index, 0, this.dataArray.length)
  75. this.notifyDataAdd(index)
  76. }
  77. // 刪除第一個元素
  78. public Delete1stItem(): void {
  79. this.dataArray.splice(0, 1)
  80. this.notifyDataDelete(0)
  81. }
  82. // 刪除第二個元素
  83. public Delete2ndItem(): void {
  84. this.dataArray.splice(1, 1)
  85. this.notifyDataDelete(1)
  86. }
  87. // 刪除最后一個元素
  88. public DeleteLastItem(): void {
  89. this.dataArray.splice(-1, 1)
  90. this.notifyDataDelete(this.dataArray.length)
  91. }
  92. // 重新加載數(shù)據(jù)
  93. public Reload(): void {
  94. this.dataArray.splice(1, 1)
  95. this.dataArray.splice(3, 2)
  96. this.notifyDataReload()
  97. }
  98. }
  1. // WaterflowDemo.ets
  2. import { WaterFlowDataSource } from './WaterFlowDataSource'
  3. @Entry
  4. @Component
  5. struct WaterflowDemo {
  6. @State minSize: number = 50
  7. @State maxSize: number = 100
  8. @State fontSize: number = 24
  9. @State colors: number[] = [0xFFC0CB, 0xDA70D6, 0x6B8E23, 0x6A5ACD, 0x00FFFF, 0x00FF7F]
  10. scroller: Scroller = new Scroller()
  11. datasource: WaterFlowDataSource = new WaterFlowDataSource()
  12. private itemWidthArray: number[] = []
  13. private itemHeightArray: number[] = []
  14. // 計算flow item寬/高
  15. getSize() {
  16. let ret = Math.floor(Math.random() * this.maxSize)
  17. return (ret > this.minSize ? ret : this.minSize)
  18. }
  19. // 保存flow item寬/高
  20. getItemSizeArray() {
  21. for (let i = 0; i < 100; i++) {
  22. this.itemWidthArray.push(this.getSize())
  23. this.itemHeightArray.push(this.getSize())
  24. }
  25. }
  26. aboutToAppear() {
  27. this.getItemSizeArray()
  28. }
  29. @Builder itemFoot() {
  30. Column() {
  31. Text(`Footer`)
  32. .fontSize(10)
  33. .backgroundColor(Color.Red)
  34. .width(50)
  35. .height(50)
  36. .align(Alignment.Center)
  37. .margin({ top: 2 })
  38. }
  39. }
  40. build() {
  41. Column({ space: 2 }) {
  42. WaterFlow({ footer: this.itemFoot.bind(this), scroller: this.scroller }) {
  43. LazyForEach(this.datasource, (item: number) => {
  44. FlowItem() {
  45. Column() {
  46. Text("N" + item).fontSize(12).height('16')
  47. Image('res/waterFlowTest(' + item % 5 + ').jpg')
  48. .objectFit(ImageFit.Fill)
  49. }
  50. }
  51. .width(this.itemWidthArray[item])
  52. .height(this.itemHeightArray[item])
  53. .backgroundColor(this.colors[item % 5])
  54. }, item => item)
  55. }
  56. .columnsTemplate("1fr 1fr 1fr 1fr")
  57. .itemConstraintSize({
  58. minWidth: 0,
  59. maxWidth: '100%',
  60. minHeight: 0,
  61. maxHeight: '100%'
  62. })
  63. .columnsGap(10)
  64. .rowsGap(5)
  65. .onReachStart(() => {
  66. console.info("onReachStart")
  67. })
  68. .onReachEnd(() => {
  69. console.info("onReachEnd")
  70. })
  71. .backgroundColor(0xFAEEE0)
  72. .width('100%')
  73. .height('80%')
  74. .layoutDirection(FlexDirection.Column)
  75. }
  76. }
  77. }

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

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號