Compose組件轉換XML布局

文章目錄

  • 學習JetPack Compose資源
  • 前言:
  • 預覽界面的實現
  • Compose組件的布局管理
    • 一、Row和Colum組件(LinearLayout)
      • `LinearLayout`(垂直方向 → `Column`)
      • `LinearLayout`(水平方向 → `Row`)
    • 二、相對布局 `FrameLayout` → Box
    • 三、`RelativeLayout` → **`ConstraintLayout`** 或 **`Box`**
        • 1. 用 `ConstraintLayout` 實現相對定位
        • 2. 用 `Box` 實現簡單相對布局
    • 五、`GridLayout` → **`LazyVerticalGrid`** 或自定義行/列
        • 1. 網格布局
    • 六、`TableLayout` → **嵌套 `Row` 和 `Column`**
    • 七、`ScrollView` → **`Modifier.verticalScroll`** 或 **`LazyColumn`**
        • 1. 簡單滾動
        • 2. 惰性滾動(大數據集用 `LazyColumn`)
    • 八、`Space` → **`Spacer`**
    • 九、`include` 標簽 → **`@Composable` 函數**
        • 1. 定義可復用組件
      • 總結對比表

學習JetPack Compose資源

學習資源:JetPack Compose博物館

前言:

在JetPack Compose博物館中,對于compose的講解較為詳細,我這篇筆記主要是記錄自己不懂和不理解的知識點,可能會重復,也可能有其他的,學習Compose布局一般都是從傳統XML布局中進行轉換的,接下來開始學習不同布局的Compose組件。

預覽界面的實現

1、在傳統的XML文件中,都是可以一邊填寫代碼一邊查看頁面,在Compose如何實現呢?
首先,對一個無參的方法添加@Preview和@Composable的注解,如下圖所示

@Preview(showBackground = true)
@Composable
fun GreetingPreview() {ChainOfCustodyTheme {Text(text = "Hello Android!",modifier = Modifier.fillMaxSize().wrapContentSize(Alignment.Center), // 內容居中)}
}

2、上述的圖標分別為Code 、Split、Design,選擇Split就可以看到分屏顯示,默認為左右分屏,再次點擊Split圖標可以切換為上下分屏。

在這里插入圖片描述

3、在添加注解的方法中,有個小圖標,點擊可直接在設備中運行該方法,不需要全部運行了。如下圖所示在這里插入圖片描述

Compose組件的布局管理

一、Row和Colum組件(LinearLayout)

看字面意思可知,Row對應XML布局中LinearLayout的水平布局,Colum對應XML布局中LinearnLayout的垂直布局

LinearLayout(垂直方向 → Column

基本用法:

@Composable
fun VerticalList() {Column(modifier = Modifier.fillMaxWidth().padding(16.dp),verticalArrangement = Arrangement.SpaceEvenly // 垂直分布方式) {Text("Item 1")Text("Item 2")Text("Item 3")}
}

等效于:

<LinearLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content"android:orientation="vertical"><TextView ... /><TextView ... /><TextView ... />
</LinearLayout>

LinearLayout(水平方向 → Row

權重分配

@Composable
fun HorizontalWeight() {Row(modifier = Modifier.fillMaxWidth()) {Text(text = "Left",modifier = Modifier.weight(1f) // 占剩余空間的1/3.background(Color.Gray))Text(text = "Right",modifier = Modifier.weight(2f) // 占剩余空間的2/3.background(Color.LightGray))}
}

等效于

<LinearLayoutandroid:layout_width="match_parent"android:orientation="horizontal"><TextViewandroid:layout_width="0dp"android:layout_weight="1" .../><TextViewandroid:layout_width="0dp"android:layout_weight="2" .../>
</LinearLayout>

二、相對布局 FrameLayout → Box

疊加元素

@Composable
fun OverlayElements() {Box(modifier = Modifier.fillMaxSize()) {Image(painter = painterResource(R.drawable.background),contentDescription = null,modifier = Modifier.matchParentSize())Button(onClick = { /* ... */ },modifier = Modifier.align(Alignment.BottomEnd) // 右下角對齊) {Text("Action")}}
}

等效于

<FrameLayout ...><ImageView ... /><Buttonandroid:layout_gravity="bottom|end" ... />
</FrameLayout>

三、RelativeLayoutConstraintLayoutBox

使用ConstraintLayout需要額外添加依賴,注意需要和傳統ConstrainLayout區分開來
依賴添加:

implementation("androidx.constraintlayout:constraintlayout-compose:1.1.0-alpha13")
1. 用 ConstraintLayout 實現相對定位
@Composable
fun RelativePositioning() {ConstraintLayout(modifier = Modifier.fillMaxWidth()) {val (button, text) = createRefs()Button(onClick = { /* ... */ },modifier = Modifier.constrainAs(button) {start.linkTo(parent.start)top.linkTo(parent.top)}) { Text("Button") }Text(text = "Next to Button",modifier = Modifier.constrainAs(text) {start.linkTo(button.end, margin = 16.dp)top.linkTo(button.top)})}
}
2. 用 Box 實現簡單相對布局
Box(modifier = Modifier.fillMaxSize()) {Text("Center", modifier = Modifier.align(Alignment.Center))Text("Top Start", modifier = Modifier.align(Alignment.TopStart))
}

五、GridLayoutLazyVerticalGrid 或自定義行/列

1. 網格布局

直接調用組件LazyVerticalGrid既可以完成實現

LazyVerticalGrid(columns = GridCells.Fixed(2), // 2列modifier = Modifier.fillMaxWidth()
) {items(10) { index ->Card(modifier = Modifier.padding(8.dp).aspectRatio(1f)) {Box(modifier = Modifier.background(Color.LightGray)) {Text("Item $index", modifier = Modifier.align(Alignment.Center))}}}
}

六、TableLayout嵌套 RowColumn

@Composable
fun TableExample() {Column(modifier = Modifier.padding(16.dp)) {// 表頭行Row(modifier = Modifier.fillMaxWidth()) {Text(text = "Header 1",modifier = Modifier.weight(1f).padding(8.dp))Text(text = "Header 2",modifier = Modifier.weight(2f).padding(8.dp))}Divider(color = Color.Black, thickness = 1.dp)// 數據行Row(modifier = Modifier.fillMaxWidth()) {Text(text = "Data 1",modifier = Modifier.weight(1f).padding(8.dp)) Text(text = "Data 2",modifier = Modifier.weight(2f).padding(8.dp))}}
}

七、ScrollViewModifier.verticalScrollLazyColumn

1. 簡單滾動
Column(modifier = Modifier.fillMaxSize().verticalScroll(rememberScrollState())
) {repeat(50) { index ->Text("Item $index", modifier = Modifier.padding(8.dp))}
}
2. 惰性滾動(大數據集用 LazyColumn
LazyColumn {items(1000) { index ->Text("Item $index", modifier = Modifier.padding(8.dp))}
}

八、SpaceSpacer

Row {Text("Left")Spacer(modifier = Modifier.weight(1f)) // 占滿剩余空間Text("Right")
}

九、include 標簽 → @Composable 函數

1. 定義可復用組件
@Composable
fun Header(title: String) {Text(text = title,style = MaterialTheme.typography.h4,modifier = Modifier.padding(16.dp))
}// 在父布局中調用
Column {Header("Settings")// 其他內容...
}


總結對比表

傳統布局Compose 替代方案關鍵特性
LinearLayout(垂直)ColumnverticalArrangement 控制垂直間距
LinearLayout(水平)RowhorizontalArrangement 控制水平間距
FrameLayoutBoxalign 控制子項對齊方式
RelativeLayoutConstraintLayout通過 linkTo 定義約束關系
GridLayoutLazyVerticalGrid固定列數或自適應列寬
TableLayout嵌套 RowColumn通過 weight 實現單元格比例
ScrollViewModifier.verticalScroll簡單滾動內容
ListView/RecyclerViewLazyColumn/LazyRow惰性加載 + 自動復用
SpaceSpacer空白占位
include@Composable 函數直接調用自定義組件

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

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

相關文章

RAG測試數據集資源

一、通用問答基準數據集 HotpotQA 特點:包含11萬+多跳問答對最佳用途:測試復雜推理能力數據示例:{"question": "Were Scott Derrickson and Ed Wood of the same nationality?","answer": "Yes, both are American" }MS MARCO 特點…

快速掌握MCP——Spring AI MCP包教包會

最近幾個月AI的發展非常快&#xff0c;各種大模型、智能體、AI名詞和技術和框架層出不窮&#xff0c;作為一個業余小紅書博主的我最近總刷到MCP這個關鍵字&#xff0c;看著有點高級我也來學習一下。 1.SpringAI與functionCall簡單回顧 前幾個月我曾寫過兩篇關于SpringAI的基礎…

學習筆記--(6)

import numpy as np import matplotlib.pyplot as plt from scipy.special import erfc# 設置參數 rho 0.7798 z0 4.25 # 確保使用大寫 Z0&#xff0c;與定義一致def calculate_tau(z, z_prime, rho, s_values):return np.log(rho * z * z_prime * s_values / 2)# 定義 chi_…

【AI4CODE】5 Trae 錘一個基于百度Amis的Crud應用

【AI4CODE】目錄 【AI4CODE】1 Trae CN 錐安裝配置與遷移 【AI4CODE】2 Trae 錘一個 To-Do-List 【AI4CODE】3 Trae 錘一個貪吃蛇的小游戲 【AI4CODE】4 Trae 錘一個數據搬運工的小應用 1 百度 Amis 簡介 百度 Amis 是一個低代碼前端框架&#xff0c;由百度開源。它通過 J…

認識 Promise

認識 Promise 前言&#xff1a;為什么會出現 Promise&#xff1f; 最常見的一個場景就是 ajax 請求&#xff0c;通俗來說&#xff0c;由于網速的不同&#xff0c;可能你得到返回值的時間也是不同的&#xff0c;這個時候我們就需要等待&#xff0c;結果出來了之后才知道怎么樣…

純c++實現transformer 訓練+推理

項目地址 https://github.com/freelw/cpp-transformer C 實現的 Transformer 這是一個無需依賴特殊庫的 Transformer 的 C 實現&#xff0c;涵蓋了訓練與推理功能。 本項目使用C復刻了《Dive into Deep Learning》中關于 Transformer 的第 11 章11.7小節點內容。構建了一個英…

Go 語言規范學習(7)

文章目錄 Built-in functionsAppending to and copying slicesClearCloseManipulating complex numbersDeletion of map elementsLength and capacityMaking slices, maps and channelsMin and maxAllocationHandling panicsBootstrapping PackagesSource file organizationPac…

Python Cookbook-5.1 對字典排序

任務 你想對字典排序。這可能意味著需要先根據字典的鍵排序&#xff0c;然后再讓對應值也處于同樣的順序。 解決方案 最簡單的方法可以通過這樣的描述來概括:先將鍵排序&#xff0c;然后由此選出對應值: def sortedDictValues(adict):keys adict.keys()keys.sort()return …

Git Rebase 操作中丟失提交的恢復方法

背景介紹 在團隊協作中,使用 Git 進行版本控制是常見實踐。然而,有時在執行 git rebase 或者其他操作后,我們可能會發現自己的提交記錄"消失"了,這往往讓開發者感到恐慌。本文將介紹幾種在 rebase 后恢復丟失提交的方法。 問題描述 當我們執行以下操作時,可能…

C語言基礎要素(019):輸出ASCII碼表

計算機以二進制處理信息&#xff0c;但二進制對人類并不友好。比如說我們規定用二進制值 01000001 表示字母’A’&#xff0c;顯然通過鍵盤輸入或屏幕閱讀此數據而理解它為字母A&#xff0c;是比較困難的。為了有效的使用信息&#xff0c;先驅者們創建了一種稱為ASCII碼的交換代…

鴻蒙定位開發服務

引言 鴻蒙操作系統&#xff08;HarmonyOS&#xff09;作為面向萬物互聯時代的分布式操作系統&#xff0c;其定位服務&#xff08;Location Kit&#xff09;為開發者提供了多場景、高精度的位置能力支持。本文將從技術原理、開發流程到實戰案例&#xff0c;全面解析鴻蒙定位服務…

rknn_convert的使用方法

rknn_convert是RKNN-Toolkit2提供的一套常用模型轉換工具&#xff0c;通過封裝上述API接口&#xff0c;用戶只需編輯模型對應的yml配置文件&#xff0c;就可以通過指令轉換模型。以下是如何使用rknn_convert工具的示例命令以及支持的指令參數&#xff1a; python -m rknn.api.…

解決 axios get請求瞎轉義問題

在Vue.js項目中&#xff0c;axios 是一個常用的HTTP客戶端庫&#xff0c;用于發送HTTP請求。qs 是一個用于處理查詢字符串的庫&#xff0c;通常與 axios 結合使用&#xff0c;特別是在處理POST請求時&#xff0c;將對象序列化為URL編碼的字符串。 1. 安裝 axios 和 qs 首先&a…

【XTerminal】【樹莓派】Linux系統下的函數調用編程

目錄 一、XTerminal下的Linux系統調用編程 1.1理解進程和線程的概念并在Linux系統下完成相應操作 (1) 進程 (2)線程 (3) 進程 vs 線程 (4)Linux 下的實踐操作 1.2Linux的“虛擬內存管理”和stm32正式物理內存&#xff08;內存映射&#xff09;的區別 (1)Linux虛擬內存管…

torch 拆分子張量 分割張量

目錄 unbind拆分子張量 1. 沿著第n個維度拆分&#xff08;即按“批次”拆分&#xff09; split分割張量 常用用法&#xff1a; 總結&#xff1a; unbind拆分子張量 import torchquaternions torch.tensor([[1, 2, 3, 4], [5, 6, 7, 8]]) result torch.unbind(quaternio…

【Linux】內核驅動學習筆記(二)

7、framebuffer驅動詳解 7.1、什么是framebuffer (1)裸機中如何操作LCD (2)OS下操作LCD的難點 (3)framebuffer幀緩沖&#xff08;簡稱fb&#xff09;是linux內核中虛擬出的一個設備 (4)framebuffer向應用層提供一個統一標準接口的顯示設備 (5)從驅動來看&#xff0c;fb是一個…

用 Docker Compose 與 Nginx 反向代理部署 Vikunja 待辦事項管理系統

在高效管理日常任務和項目的過程中&#xff0c;開源待辦事項工具 Vikunja 以其簡潔、直觀的設計和多視圖支持受到越來越多用戶的青睞。本文將詳細介紹如何使用 Docker Compose 快速部署 Vikunja&#xff0c;并通過 Nginx 反向代理實現 HTTPS 訪問&#xff0c;從而確保服務安全穩…

使用Python快速接入DeepSeek API的步驟指南

使用Python快速接入DeepSeek API的步驟指南 1. 前期準備 注冊DeepSeek賬號 訪問DeepSeek官網注冊賬號 完成郵箱驗證等認證流程 獲取API密鑰 登錄后進入控制臺 → API管理 創建新的API Key并妥善保存 安裝必要庫 pip install requests # 可選&#xff1a;處理復雜場景 pip…

Redis 主要能夠用來做什么

Redis&#xff08;Remote Dictionary Server&#xff09;是一種基于內存的鍵值存儲數據庫&#xff0c;它的性能極高&#xff0c;廣泛應用于各種高并發場景。以下是 Redis 常見的用途&#xff1a; 1. 緩存&#xff08;Cache&#xff09; 作用&#xff1a;存儲熱點數據&#xf…

印度股票實時數據API接口選型指南:iTick.org如何成為開發者優選

在全球金融數字化浪潮中&#xff0c;印度股票市場因其高速增長潛力備受關注。對于量化交易開發者、金融科技公司而言&#xff0c;穩定可靠的股票報價API接口是獲取市場數據的核心基礎設施。本文將深度對比主流印度股票API&#xff0c;并揭示iTick在數據服務領域的獨特優勢。 一…