網(wǎng)格容器

2024-01-22 17:51 更新

網(wǎng)格容器,由“行”和“列”分割的單元格所組成,通過指定“項目”所在的單元格做出各種各樣的布局。

說明

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

子組件

包含GridItem子組件。

說明

Grid子組件的索引值計算規(guī)則:

  • 按子組件的順序依次遞增。
  • if/else語句中,只有條件成立分支內(nèi)的子組件會參與索引值計算,條件不成立分支內(nèi)的子組件不計算索引值。
  • ForEach/LazyForEach語句中,會計算展開所有子節(jié)點索引值。
  • if/else/ForEach/LazyForEach發(fā)生變化以后,會更新子節(jié)點索引值。
  • Grid子組件的visibility屬性設(shè)置為Hidden或None時依然會計算索引值。
  • Grid子組件的visibility屬性設(shè)置為None時不顯示,但依然會占用子組件對應(yīng)的網(wǎng)格。
  • Grid子組件設(shè)置position屬性,會占用子組件對應(yīng)的網(wǎng)格,子組件將顯示在相對Grid左上角偏移position的位置。該子組件不會隨其對應(yīng)網(wǎng)格滾動,在對應(yīng)網(wǎng)格滑出Grid顯示范圍外后不顯示。
  • 當(dāng)Grid子組件之間留有空隙時,會根據(jù)當(dāng)前的展示區(qū)域盡可能填補空隙,因此GridItem可能會隨著網(wǎng)格滾動而改變相對位置。

接口

Grid(scroller?: Scroller)

參數(shù):

參數(shù)名

參數(shù)類型

必填

參數(shù)描述

scroller

Scroller

可滾動組件的控制器。用于與可滾動組件進行綁定。

說明:

不允許和其他滾動類組件綁定同一個滾動控制對象。

屬性

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

名稱

參數(shù)類型

描述

columnsTemplate

string

設(shè)置當(dāng)前網(wǎng)格布局列的數(shù)量,不設(shè)置時默認1列。

例如, '1fr 1fr 2fr' 是將父組件分3列,將父組件允許的寬分為4等份,第一列占1份,第二列占1份,第三列占2份。

說明:

設(shè)置為'0fr'時,該列的列寬為0,不顯示GridItem。設(shè)置為其他非法值時,GridItem顯示為固定1列。

rowsTemplate

string

設(shè)置當(dāng)前網(wǎng)格布局行的數(shù)量,不設(shè)置時默認1行。

例如,'1fr 1fr 2fr'是將父組件分三行,將父組件允許的高分為4等份,第一行占1份,第二行占一份,第三行占2份。

說明:

設(shè)置為'0fr',則這一行的行寬為0,這一行GridItem不顯示。設(shè)置為其他非法值,按固定1行處理。

columnsGap

Length

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

默認值:0

說明:

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

rowsGap

Length

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

默認值:0

說明:

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

scrollBar

BarState

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

默認值:BarState.Off

scrollBarColor

string | number | Color

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

scrollBarWidth

string | number

設(shè)置滾動條的寬度。寬度設(shè)置后,滾動條正常狀態(tài)和按壓狀態(tài)寬度均為滾動條的寬度值。

默認值:4

單位:vp

cachedCount

number

設(shè)置預(yù)加載的GridItem的數(shù)量,只在LazyForEach中生效。具體使用可參考減少應(yīng)用白塊說明

默認值:1

說明:

設(shè)置緩存后會在Grid顯示區(qū)域上下各緩存cachedCount*列數(shù)個GridItem。LazyForEach超出顯示和緩存范圍的GridItem會被釋放。

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

editMode8+

boolean

設(shè)置Grid是否進入編輯模式,進入編輯模式可以拖拽Grid組件內(nèi)部GridItem

默認值:false

layoutDirection8+

GridDirection

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

默認值:GridDirection.Row

maxCount8+

number

當(dāng)layoutDirection是Row/RowReverse時,表示可顯示的最大列數(shù)

當(dāng)layoutDirection是Column/ColumnReverse時,表示可顯示的最大行數(shù)。

默認值:Infinity

說明:

當(dāng)maxCount小于minCount時,maxCount和minCount都按默認值處理。

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

minCount8+

number

當(dāng)layoutDirection是Row/RowReverse時,表示可顯示的最小列數(shù)。

當(dāng)layoutDirection是Column/ColumnReverse時,表示可顯示的最小行數(shù)。

默認值:1

說明:

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

cellLength8+

number

當(dāng)layoutDirection是Row/RowReverse時,表示一行的高度。

當(dāng)layoutDirection是Column/ColumnReverse時,表示一列的寬度。

默認值:第一個元素的大小

multiSelectable8+

boolean

是否開啟鼠標框選。

默認值:false

- false:關(guān)閉框選。

- true:開啟框選。

supportAnimation8+

boolean

是否支持動畫。當(dāng)前支持GridItem拖拽動畫。

默認值:false

Grid組件根據(jù)rowsTemplate、columnsTemplate屬性的設(shè)置情況,可分為以下三種布局模式:

  1. rowsTemplate、columnsTemplate同時設(shè)置:
    • Grid只展示固定行列數(shù)的元素,其余元素不展示,且Grid不可滾動。
    • 此模式下以下屬性不生效:layoutDirection、maxCount、minCount、cellLength。
    • Grid的寬高沒有設(shè)置時,默認適應(yīng)父組件尺寸。
    • Gird網(wǎng)格列大小按照Gird自身內(nèi)容區(qū)域大小減去所有行列Gap后按各個行列所占比重分配。
    • GridItem默認填滿網(wǎng)格大小。
  2. rowsTemplate、columnsTemplate僅設(shè)置其中的一個:
    • 元素按照設(shè)置的方向進行排布,超出Grid顯示區(qū)域后,Grid可通過滾動的方式展示。
    • 如果設(shè)置了columnsTemplate,Gird滾動方向為垂直方向,主軸方向為垂直方向,交叉軸方向為水平方向。
    • 如果設(shè)置了rowsTemplate,Gird滾動方向為水平方向,主軸方向為水平方向,交叉軸方向為垂直方向。
    • 此模式下以下屬性不生效:layoutDirection、maxCount、minCount、cellLength。
    • 網(wǎng)格交叉軸方向尺寸根據(jù)Gird自身內(nèi)容區(qū)域交叉軸尺寸減去交叉軸方向所有Gap后按所占比重分配。
    • 網(wǎng)格主軸方向尺寸取當(dāng)前網(wǎng)格交叉軸方向所有GridItem高度最大值。
  3. rowsTemplate、columnsTemplate都不設(shè)置:
    • 元素在layoutDirection方向上排布,列數(shù)由Grid的寬度、首個元素的寬度、minCount、maxCount、columnsGap共同決定。
    • 行數(shù)由Grid高度、首個元素高度、cellLength、rowsGap共同決定。超出行列容納范圍的元素不顯示,也不能通過滾動進行展示。
    • 此模式下僅生效以下屬性:layoutDirection、maxCount、minCount、cellLength、editMode、columnsGap、rowsGap。
    • 當(dāng)前l(fā)ayoutDirection設(shè)置為Row時,先從左到右排列,排滿一行再排一下一列。剩余高度不足時不再布局,整體內(nèi)容頂部居中。
    • 當(dāng)前l(fā)ayoutDirection設(shè)置為Column時,先從上到下排列,排滿一列再排一下一列,剩余寬度度不足時不再。整體內(nèi)容頂部居中。

GridDirection8+枚舉說明

名稱

描述

Row

主軸布局方向沿水平方向布局,即自左往右先填滿一行,再去填下一行。

Column

主軸布局方向沿垂直方向布局,即自上往下先填滿一列,再去填下一列。

RowReverse

主軸布局方向沿水平方向反向布局,即自右往左先填滿一行,再去填下一行。

ColumnReverse

主軸布局方向沿垂直方向反向布局,即自下往上先填滿一列,再去填下一列。

說明

Grid組件通用屬性clip的默認值為true。

事件

除支持通用事件外,還支持以下事件:

名稱

功能描述

onScrollIndex(event: (first: number) => void)

當(dāng)前網(wǎng)格顯示的起始位置item發(fā)生變化時觸發(fā)。

- first: 當(dāng)前顯示的網(wǎng)格起始位置的索引值。

Grid顯示區(qū)域上第一個子組件的索引值有變化就會觸發(fā)。

onItemDragStart(event: (event: ItemDragInfo, itemIndex: number) => (() => any) | void)

開始拖拽網(wǎng)格元素時觸發(fā)。

- event: 見ItemDragInfo對象說明

- itemIndex: 被拖拽網(wǎng)格元素索引值。

說明:

返回void表示不能拖拽。

手指長按GridItem時觸發(fā)該事件。

onItemDragEnter(event: (event: ItemDragInfo) => void)

拖拽進入網(wǎng)格元素范圍內(nèi)時觸發(fā)。

- event: 見ItemDragInfo對象說明

onItemDragMove(event: (event: ItemDragInfo, itemIndex: number, insertIndex: number) => void)

拖拽在網(wǎng)格元素范圍內(nèi)移動時觸發(fā)。

- event: 見ItemDragInfo對象說明。

- itemIndex: 拖拽起始位置。

- insertIndex: 拖拽插入位置。

onItemDragLeave(event: (event: ItemDragInfo, itemIndex: number) => void)

拖拽離開網(wǎng)格元素時觸發(fā)。

- event: 見ItemDragInfo對象說明。

- itemIndex: 拖拽離開的網(wǎng)格元素索引值。

onItemDrop(event: (event: ItemDragInfo, itemIndex: number, insertIndex: number, isSuccess: boolean) => void)

綁定該事件的網(wǎng)格元素可作為拖拽釋放目標,當(dāng)在網(wǎng)格元素內(nèi)停止拖拽時觸發(fā)。

- event: 見ItemDragInfo對象說明。

- itemIndex: 拖拽起始位置。

- insertIndex: 拖拽插入位置。

- isSuccess: 是否成功釋放。

ItemDragInfo對象說明

名稱

類型

描述

x

number

當(dāng)前拖拽點的x坐標。

y

number

當(dāng)前拖拽點的y坐標。

示例

示例1

  1. // xxx.ets
  2. @Entry
  3. @Component
  4. struct GridExample {
  5. @State Number: String[] = ['0', '1', '2', '3', '4']
  6. scroller: Scroller = new Scroller()
  7. build() {
  8. Column({ space: 5 }) {
  9. Grid() {
  10. ForEach(this.Number, (day: string) => {
  11. ForEach(this.Number, (day: string) => {
  12. GridItem() {
  13. Text(day)
  14. .fontSize(16)
  15. .backgroundColor(0xF9CF93)
  16. .width('100%')
  17. .height('100%')
  18. .textAlign(TextAlign.Center)
  19. }
  20. }, day => day)
  21. }, day => day)
  22. }
  23. .columnsTemplate('1fr 1fr 1fr 1fr 1fr')
  24. .rowsTemplate('1fr 1fr 1fr 1fr 1fr')
  25. .columnsGap(10)
  26. .rowsGap(10)
  27. .width('90%')
  28. .backgroundColor(0xFAEEE0)
  29. .height(300)
  30. Text('scroll').fontColor(0xCCCCCC).fontSize(9).width('90%')
  31. Grid(this.scroller) {
  32. ForEach(this.Number, (day: string) => {
  33. ForEach(this.Number, (day: string) => {
  34. GridItem() {
  35. Text(day)
  36. .fontSize(16)
  37. .backgroundColor(0xF9CF93)
  38. .width('100%')
  39. .height(80)
  40. .textAlign(TextAlign.Center)
  41. }
  42. }, day => day)
  43. }, day => day)
  44. }
  45. .columnsTemplate('1fr 1fr 1fr 1fr 1fr')
  46. .columnsGap(10)
  47. .rowsGap(10)
  48. .onScrollIndex((first: number) => {
  49. console.info(first.toString())
  50. })
  51. .width('90%')
  52. .backgroundColor(0xFAEEE0)
  53. .height(300)
  54. Button('next page')
  55. .onClick(() => { // 點擊后滑到下一頁
  56. this.scroller.scrollPage({ next: true })
  57. })
  58. }.width('100%').margin({ top: 5 })
  59. }
  60. }

示例2

  1. 設(shè)置屬性editMode(true)設(shè)置Grid是否進入編輯模式,進入編輯模式可以拖拽Grid組件內(nèi)部GridItem。
  2. 在onItemDragStart回調(diào)中設(shè)置拖拽過程中顯示的圖片。
  3. 在onItemDrop中獲取拖拽起始位置,和拖拽插入位置,在onItemDrop回調(diào)中完成交換數(shù)組位置邏輯。
  1. @Entry
  2. @Component
  3. struct GridExample {
  4. @State numbers: string[] = []
  5. scroller: Scroller = new Scroller()
  6. @State text: string = 'drag'
  7. @Builder pixelMapBuilder() { //拖拽過程樣式
  8. Column() {
  9. Text(this.text)
  10. .fontSize(16)
  11. .backgroundColor(0xF9CF93)
  12. .width(80)
  13. .height(80)
  14. .textAlign(TextAlign.Center)
  15. }
  16. }
  17. aboutToAppear() {
  18. for (let i = 1;i <= 15; i++) {
  19. this.numbers.push(i + '')
  20. }
  21. }
  22. changeIndex(index1:number, index2:number) { //交換數(shù)組中的位置
  23. const temp = this.numbers[index1];
  24. if (index1 > index2) {
  25. this.numbers.splice(index2, 0, temp);
  26. this.numbers.splice(index1 + 1, 1);
  27. } else {
  28. this.numbers.splice(index2 + 1, 0, temp);
  29. this.numbers.splice(index1, 1);
  30. }
  31. }
  32. build() {
  33. Column({ space: 5 }) {
  34. Grid(this.scroller) {
  35. ForEach(this.numbers, (day: string) => {
  36. GridItem() {
  37. Text(day)
  38. .fontSize(16)
  39. .backgroundColor(0xF9CF93)
  40. .width(80)
  41. .height(80)
  42. .textAlign(TextAlign.Center)
  43. }
  44. })
  45. }
  46. .columnsTemplate('1fr 1fr 1fr')
  47. .columnsGap(10)
  48. .rowsGap(10)
  49. .onScrollIndex((first: number) => {
  50. console.info(first.toString())
  51. })
  52. .width('90%')
  53. .backgroundColor(0xFAEEE0)
  54. .height(300)
  55. .editMode(true) //設(shè)置Grid是否進入編輯模式,進入編輯模式可以拖拽Grid組件內(nèi)部GridItem
  56. .supportAnimation(true) //設(shè)置Grid是否開啟拖拽補位動畫
  57. .onItemDragStart((event: ItemDragInfo, itemIndex: number) => { //第一次拖拽此事件綁定的組件時,觸發(fā)回調(diào)。
  58. this.text = this.numbers[itemIndex]
  59. return this.pixelMapBuilder() //設(shè)置拖拽過程中顯示的圖片。
  60. })
  61. .onItemDrop((event: ItemDragInfo, itemIndex: number, insertIndex: number, isSuccess: boolean) => { //綁定此事件的組件可作為拖拽釋放目標,當(dāng)在本組件范圍內(nèi)停止拖拽行為時,觸發(fā)回調(diào)。
  62. // isSuccess=false時,說明drop的位置在grid外部;insertIndex > length時,說明有新增元素的事件發(fā)生
  63. if (!isSuccess || insertIndex >= this.numbers.length) {
  64. return
  65. }
  66. console.info('beixiang' + itemIndex + '', insertIndex + '') //itemIndex拖拽起始位置,insertIndex拖拽插入位置
  67. this.changeIndex(itemIndex, insertIndex)
  68. })
  69. }.width('100%').margin({ top: 5 })
  70. }
  71. }

網(wǎng)格拖拽補位動畫:

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

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號