10.ArkUI Grid的介紹和使用

ArkUI Grid 組件詳解與使用指南

Grid 是 ArkUI 中用于實現網格布局的容器組件,能夠以行和列的形式排列子組件。以下是 Grid 組件的詳細介紹和使用方法。

基本介紹

Grid 組件特點:

  • 支持固定列數和自適應布局
  • 提供靈活的間距和排列控制
  • 支持滾動顯示大量項目
  • 可以實現復雜的網格布局效果

基本使用

1. 簡單網格布局

@Entry
@Component
struct SimpleGridExample {private data: string[] = ['Item 1', 'Item 2', 'Item 3', 'Item 4', 'Item 5', 'Item 6']build() {Grid() {ForEach(this.data, (item: string) => {GridItem() {Text(item).fontSize(16).textAlign(TextAlign.Center).width('100%').height('100%').backgroundColor('#f0f0f0')}}, (item: string) => item)}.columnsTemplate('1fr 1fr 1fr') // 3等分列.rowsTemplate('1fr 1fr') // 2等分行.columnsGap(10) // 列間距.rowsGap(10) // 行間距.height(300).width('100%').margin(10)}
}

2. 自適應網格

@Entry
@Component
struct AutoGridExample {private data: string[] = ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H']build() {Grid() {ForEach(this.data, (item: string) => {GridItem() {Text(item).fontSize(20).fontWeight(FontWeight.Bold).textAlign(TextAlign.Center).width('100%').height('100%').backgroundColor('#e6f7ff').borderRadius(8)}}, (item: string) => item)}.maxCount(4) // 每行最多4項.minCount(2) // 每行至少2項.cellLength(100) // 每個網格項的長度.height('100%').width('100%').padding(10)}
}

核心功能

1. 網格模板布局

Grid() {// GridItems...
}
.columnsTemplate('100px 1fr 2fr') // 第一列固定100px,第二列1份,第三列2份
.rowsTemplate('50px 1fr 50px') // 第一行和第三行固定50px,中間行自適應

2. 網格間距控制

Grid() {// GridItems...
}
.columnsGap(12) // 列間距12px
.rowsGap(8) // 行間距8px

3. 滾動網格

Grid() {ForEach(Array(20).fill(0).map((_, index) => {GridItem() {Text(`Item ${index + 1}`)// 樣式...}})
}
.columnsTemplate('1fr 1fr 1fr')
.height(400) // 固定高度實現滾動
.width('100%')
.scrollBar(BarState.On) // 顯示滾動條

4. 響應式網格

@Entry
@Component
struct ResponsiveGridExample {@State gridColumns: string = '1fr 1fr' // 默認2列build() {Column() {// 切換列數按鈕Row() {Button('2列').onClick(() => { this.gridColumns = '1fr 1fr' })Button('3列').onClick(() => { this.gridColumns = '1fr 1fr 1fr' })Button('4列').onClick(() => { this.gridColumns = '1fr 1fr 1fr 1fr' })}.margin(10)// 響應式網格Grid() {ForEach(Array(12).fill(0).map((_, index) => {GridItem() {Text(`Item ${index + 1}`)// 樣式...}})}.columnsTemplate(this.gridColumns).rowsGap(10).columnsGap(10).height('80%').width('100%')}}
}

高級功能

1. 不規則網格項

Grid() {// 跨2列的項GridItem({ columnStart: 0, columnEnd: 2 }) {Text('跨兩列')// 樣式...}// 跨2行的項GridItem({ rowStart: 1, rowEnd: 3 }) {Text('跨兩行')// 樣式...}// 普通項GridItem() {Text('普通項')// 樣式...}
}
.columnsTemplate('1fr 1fr 1fr')
.rowsTemplate('100px 100px 100px')

2. 網格項動畫

@State scaleValue: number = 1build() {Grid() {GridItem() {Text('點擊放大').width('100%').height('100%').onClick(() => {animateTo({duration: 300,curve: Curve.EaseInOut}, () => {this.scaleValue = this.scaleValue === 1 ? 1.2 : 1})}).scale({ x: this.scaleValue, y: this.scaleValue })}// 更多GridItems...}// 網格配置...
}

3. 網格拖拽排序

@Entry
@Component
struct DraggableGridExample {@State items: string[] = ['A', 'B', 'C', 'D', 'E', 'F']@State draggedIndex: number = -1build() {Grid() {ForEach(this.items, (item: string, index: number) => {GridItem() {Text(item).width('100%').height('100%').gesture(PanGesture({ distance: 5 }).onActionStart(() => {this.draggedIndex = index}).onActionUpdate((event: GestureEvent) => {// 處理拖拽邏輯}).onActionEnd(() => {this.draggedIndex = -1}))}.zIndex(this.draggedIndex === index ? 1 : 0)}, (item: string) => item)}.columnsTemplate('1fr 1fr 1fr').height(400).width('100%')}
}

性能優化

1. 復用網格項

Grid() {LazyForEach(this.dataSource, (item: ItemData) => {GridItem() {// 內容...}}, (item: ItemData) => item.id.toString())
}

2. 固定尺寸網格項

Grid() {ForEach(this.data, (item) => {GridItem() {// 內容...}.width(100) // 固定寬度.height(120) // 固定高度})
}

3. 虛擬滾動

Grid() {// 大數據集使用虛擬滾動Virtualize({ scroller: this.scroller,builder: (index: number) => {return this.buildGridItem(index)},count: this.data.length})
}
.height(500)
.width('100%')

最佳實踐

  1. 合理設計網格結構

    • 根據內容類型選擇合適的列數和行高
    • 考慮不同屏幕尺寸的適配
  2. 優化性能

    • 大數據集使用懶加載或虛擬滾動
    • 避免過度復雜的網格項嵌套
  3. 增強用戶體驗

    • 為網格項添加適當的交互反饋
    • 實現平滑的滾動和動畫效果
  4. 響應式設計

    • 根據屏幕寬度動態調整列數
    • 使用相對單位確保布局彈性

實際應用示例

1. 圖片網格畫廊

@Entry
@Component
struct ImageGridGallery {private images = [{ id: 1, url: $r('app.media.image1') },{ id: 2, url: $r('app.media.image2') },// 更多圖片...]build() {Grid() {ForEach(this.images, (image) => {GridItem() {Image(image.url).width('100%').height('100%').objectFit(ImageFit.Cover).onClick(() => {// 處理圖片點擊})}.aspectRatio(1) // 保持正方形}, (image) => image.id.toString())}.columnsTemplate('1fr 1fr 1fr').columnsGap(5).rowsGap(5).width('100%').padding(10)}
}

2. 儀表盤布局

@Entry
@Component
struct DashboardLayout {build() {Grid() {// 頂部指標卡 - 跨3列GridItem({ columnStart: 0, columnEnd: 3 }) {DashboardCard('總體數據', '1000')}// 左側圖表 - 跨2行GridItem({ rowStart: 1, rowEnd: 3 }) {DashboardCard('趨勢分析', '圖表')}// 右側小指標GridItem({ columnStart: 1 }) {DashboardCard('今日新增', '120')}GridItem({ columnStart: 2 }) {DashboardCard('完成率', '85%')}GridItem({ columnStart: 1, columnEnd: 3 }) {DashboardCard('最近活動', '詳情')}}.columnsTemplate('1fr 1fr 1fr').rowsTemplate('80px 1fr 1fr').columnsGap(10).rowsGap(10).height('100%').width('100%').padding(10)}@BuilderDashboardCard(title: string, value: string) {Column() {Text(title).fontSize(14).fontColor('#666')Text(value).fontSize(24).fontWeight(FontWeight.Bold).margin({ top: 8 })}.width('100%').height('100%').padding(10).backgroundColor('#fff').borderRadius(8).shadow({ radius: 4, color: '#00000020', offsetX: 1, offsetY: 1 })}
}

通過合理使用 Grid 組件,可以創建出靈活、高效的網格布局,適用于各種應用場景,如圖庫、儀表盤、產品列表等。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/78581.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/78581.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/78581.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

目標檢測原理簡介

目標檢測是一類計算機視覺任務,簡單來說,目標檢測可被定義為在計算機中輸入一張圖像,計算機需要找出圖像中所有感興趣的目標(物體),確定它們的類別和位置,如圖一所示。目標檢測是計算機視覺領域的核心問題之一,相較于最原始的將整張圖片分類為某一類別,目標檢測不光可…

ZYNQ筆記(十四):基于 BRAM 的 PS、PL 數據交互

版本:Vivado2020.2(Vitis) 實驗任務: PS 將字符串數據寫入BRAM,再將數據讀取出來;PL 從 BRAM 中讀取數據,bing。通過 ILA 來觀察讀出的數據,與前面串口打印的數據進行對照&#xff0…

Python-Django系列—部件

部件是 Django 對 HTML 輸入元素的表示。部件處理 HTML 的渲染&#xff0c;以及從對應于部件的 GET&#xff0f;POST 字典中提取數據。 內置部件生成的 HTML 使用 HTML5 語法&#xff0c;目標是 <!DOCTYPE html>。例如&#xff0c;它使用布爾屬性&#xff0c;如 checked…

【Leetcode 每日一題】2799. 統計完全子數組的數目

問題背景 給你一個由 正 整數組成的數組 n u m s nums nums。 如果數組中的某個子數組滿足下述條件&#xff0c;則稱之為 完全子數組 &#xff1a; 子數組中 不同 元素的數目等于整個數組不同元素的數目。 返回數組中 完全子數組 的數目。 子數組 是數組中的一個連續非空序…

卷積神經網絡(二)

1 卷積運算的兩個問題&#xff1a; 1.1 圖像邊緣信息使用少 邊緣的像素點可能只會被用一次或者2次&#xff0c;中間的會用的更多。 1.2 圖像被壓縮 5*5的圖像&#xff0c;如果經過3*3的卷積核后&#xff0c;大小變成3*3的。 N*N的圖像&#xff0c;果經過F*F的卷積核后&#x…

組網技術-DHCP服務器,RIP協議,OSPF協議

1.DHCP Server提供三種IP地址分配策略&#xff1a; 手工分配地址 自動分配地址 n 動態分配地址 2.DHCP報文類型 DHCP DISCOVER(廣播)&#xff1a;用于尋址DHCP Server DHCP OFFER&#xff08;單播&#xff09;&#xff1a;攜帶分配給客戶端的IP地址 DHCP REQUEST&#xff08;…

反爬策略應對指南:淘寶 API 商品數據采集的 IP 代理與請求偽裝技術

一、引言? 在電商數據驅動決策的時代&#xff0c;淘寶平臺海量的商品數據極具價值。然而&#xff0c;淘寶為保障平臺安全和用戶體驗&#xff0c;構建了嚴密的反爬體系。當采集淘寶 API 商品數據時&#xff0c;若不采取有效措施&#xff0c;頻繁的請求極易觸發反爬機制&#x…

學習筆記(算法學習+Maven)

單調隊列優化多重背包 #include <bits/stdc.h> using namespace std; const int M 2010; const int N 20010; int q[N]; int hh 0, tt -1; int f[N]; int g[N]; int v[M], w[M], s[M]; int n, m; int main() { cin >> n >> m; for (int i 1; …

WPF之項目創建

文章目錄 引言先決條件創建 WPF 項目步驟理解項目結構XAML 與 C# 代碼隱藏第一個 "Hello, WPF!" 示例構建和運行應用程序總結相關學習資源 引言 Windows Presentation Foundation (WPF) 是 Microsoft 用于構建具有豐富用戶界面的 Windows 桌面應用程序的現代框架。它…

JAVAEE初階01

個人主頁 JavaSE專欄 JAVAEE初階01 操作系統 1.對下&#xff08;硬件&#xff09;管理各種計算機設備 2.對上&#xff08;軟件&#xff09;為各種軟件提供一個穩定的運行環境 線程 運行的程序在操作系統中以進程的形式存在 進程是系統分配資源的最小單位 進程與線程的關…

HTML快速入門-4:HTML <meta> 標簽屬性詳解

<meta> 標簽是 HTML 文檔頭部&#xff08;<head> 部分&#xff09;的重要元素&#xff0c;用于提供關于文檔的元數據&#xff08;metadata&#xff09;。這些數據不會直接顯示在頁面上&#xff0c;但對瀏覽器、搜索引擎和其他服務非常重要。 常用屬性 1. name 和 …

前端基礎之《Vue(12)—插件封裝》

一、插件封裝 1、在Vue生態中&#xff0c;除了Vue本身&#xff0c;其它所有的與Vue相關的第三方包&#xff0c;都是插件 例子&#xff1a; import VueRouter form vue-router Vue.use(VueRouter) // 注冊插件 2、如何封裝Vue插件 &#xff08;1&#xff09;第一種寫法 const…

TCP基礎題:音樂播放列表管理系統

需求描述 服務器端 創建一個 TCP 服務器&#xff0c;監聽本地的 9999 端口&#xff0c;支持多個客戶端連接。維護一個音樂播放列表&#xff0c;每個音樂條目包含歌曲名稱、歌手、時長等信息。能夠處理客戶端的以下請求&#xff1a; 添加音樂到播放列表&#xff1a;接收客戶端發…

Verilog 語法 (二)

在掌握了 Verilog 的基礎語法和常用程序框架之后&#xff0c;本節將帶大家深入學習一些 高級設計知識點。這些內容包括&#xff1a; 阻塞賦值&#xff08;&#xff09;與非阻塞賦值&#xff08;<&#xff09;的區別及使用場景&#xff1b; assign 和 always 語句的差異&am…

OpenCV 圖形API(61)圖像特征檢測------檢測圖像邊緣的函數Canny()

操作系統&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 編程語言&#xff1a;C11 算法描述 使用Canny算法在圖像中查找邊緣。 該函數在輸入圖像中查找邊緣&#xff0c;并使用Canny算法在輸出映射&#xff08;edges&#xff09;中標記它們…

ubantu中下載編譯安裝qt5.15.3

操作步驟如下&#xff1a; 克隆 Qt 倉庫&#xff1a; git clone https://code.qt.io/qt/qt5.git cd qt5 切換到 Qt 5.15.3 標簽&#xff1a; git checkout v5.15.3-lts-lgpl 初始化子模塊&#xff1a; perl init-repository 配置和編譯 Qt&#xff1a; ./configure -prefix $H…

畢業論文設計基本內容和要求:

畢業設計基本內容和要求&#xff1a; 研究內容 調查了解LAMP架構和PHP開發&#xff1b; 學習百度旅游調用的其他產品線服務并熟悉請求接口&#xff1b; 學習社區業務層規范&#xff1b; 設計并實現旅游主要模塊&#xff1b; 技術指標 熟悉企業中流程運轉的方式&#xff0c;…

【大語言模型】大語言模型(LLMs)在工業缺陷檢測領域的應用

大語言模型&#xff08;LLMs&#xff09;在工業缺陷檢測領域的應用場景正在快速擴展&#xff0c;結合其多模態理解、文本生成和邏輯推理能力&#xff0c;為傳統檢測方法提供了新的技術路徑。以下是該領域的主要應用場景及相關技術進展&#xff1a; 1. 多模態缺陷檢測與解釋 視…

【AI插件開發】Notepad++ AI插件開發1.0發布和使用說明

一、產品簡介 AiCoder是一款為Notepad設計的輕量級AI輔助插件&#xff0c;提供以下核心功能&#xff1a; 嵌入式提問&#xff1a;對選中的文本內容進行AI分析&#xff0c;通過側邊欄聊天界面與AI交互&#xff0c;實現多輪對話、問題解答或代碼生成。對話式提問&#xff1a;獨…

第2講:R語言中的色彩美學——科研圖表配色指南

目錄 一、背景導引:科研圖表為何需要“配色講究”? 二、色彩基礎認知:別讓“紅綠盲”錯過你的科研成果 三、R語言中的配色庫全景圖 四、案例演示與代碼實戰 ??案例1:ggplot2 + viridis 配色的熱圖 ??案例2:MetBrewer 中的印象派色彩 五、技巧點撥:如何為SCI圖…