Compose組件轉換XML布局1.0

文章目錄

  • 學習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/pingmian/76055.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/76055.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/76055.shtml

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

相關文章

從零構建大語言模型全棧開發指南:第五部分:行業應用與前沿探索-5.2.1模型偏見與安全對齊(Red Teaming實踐)

?? 點擊關注不迷路 ?? 點擊關注不迷路 ?? 點擊關注不迷路 文章大綱 大語言模型全棧開發指南:倫理與未來趨勢 - 第五部分:行業應用與前沿探索5.2.1 模型偏見與安全對齊(Red Teaming實踐)一、模型偏見的來源與影響1. 偏見的定義與分類2. 偏見的實際影響案例二、安全對齊…

java基礎 迭代Iterable接口以及迭代器Iterator

Itera迭代 Iterable < T>迭代接口(1) Iterator iterator()(2) forEach(Consumer<? super T> action)forEach結合Consumer常見場景forEach使用注意細節 (3)Spliterator spliterator() Iterator< T>迭代器接口如何“接收” Iterator<T>核心方法迭代器的…

PyTorch構建自定義模型

PyTorch 提供了靈活的方式來構建自定義神經網絡模型。下面我將詳細介紹從基礎到高級的自定義模型構建方法&#xff0c;包含實際代碼示例和最佳實踐。 一、基礎模型構建 1. 繼承 nn.Module 基類 所有自定義模型都應該繼承 torch.nn.Module 類&#xff0c;并實現兩個基本方法&…

AI智算-K8s如何利用GPFS分布式并行文件存儲加速訓練or推理

文章目錄 GPFS簡介核心特性存儲環境介紹存儲軟件版本客戶端存儲RoCEGPFS 管理(GUI)1. 創建 CSI 用戶2. 檢查GUI與k8s通信文件系統配置1. 開啟配額2. 啟用filesetdf文件系統3. 驗證文件系統配置4. 啟用自動inode擴展存儲集群配置1. 啟用對根文件集(root fileset)配額2. igno…

gbase8s之邏輯導出導入腳本(完美版本)

該腳本dbexport.sh用于快速導出庫和導入庫&#xff08;使用多并發unload&#xff0c;和多并發dbload的方式&#xff09; #!/bin/sh #腳本功能&#xff1a;將數據導出成文本&#xff0c;遷移至其他實例 #最后更新時間&#xff1a;2023-12-19 #使用方法&#xff1a; #1.執行該腳…

springMVC-攔截器詳解

攔截器 概述 SpringMVC的處理器攔截器類似于Servlet開發中的過濾器Filter,用于對處理器進行預處理和后處理。開發者可以自己定義一些攔截器來實現特定的功能。 過濾器與攔截器的區別&#xff1a;攔截器是AOP思想的具體應用。 過濾器 servlet規范中的一部分&#xff0c;任何ja…

網絡安全應急響應-系統排查

在網絡安全應急響應中&#xff0c;系統排查是快速識別潛在威脅的關鍵步驟。以下是針對Windows和Linux系統的系統基本信息排查指南&#xff0c;涵蓋常用命令及注意事項&#xff1a; 一、Windows系統排查 1. 系統信息工具&#xff08;msinfo32.exe&#xff09; 命令執行&#x…

基于YOLO的半自動化標注方法:提升鐵路視頻缺陷檢測效率

論文地址:https://arxiv.org/pdf/2504.01010 1. 論文結構概述 本文提出了一種半自動化標注方法,旨在解決鐵路缺陷檢測中大規模圖像/視頻數據集標注成本高、耗時長的問題。論文結構清晰,分為以下核心部分: ?引言(Introduction)? 強調傳統手動標注的痛點(耗時、易錯、…

Linux驅動開發:SPI驅動開發原理

前言 本文章是根據韋東山老師的教學視頻整理的學習筆記https://video.100ask.net/page/1712503 SPI 通信協議采用同步全雙工傳輸機制&#xff0c;拓撲架構支持一主多從連接模式&#xff0c;這種模式在實際應用場景中頗為高效。其有效傳輸距離大致為 10m &#xff0c;傳輸速率…

Android Hilt 教程

Android Hilt 教程 —— 一看就懂&#xff0c;一學就會 1. 什么是 Hilt&#xff1f;為什么要用 Hilt&#xff1f; Hilt 是 Android 官方推薦的 依賴注入&#xff08;DI&#xff09;框架&#xff0c;基于 Dagger 開發&#xff0c;能夠大大簡化依賴注入的使用。 為什么要用 Hi…

【算法手記11】NC41 最長無重復子數組 NC379 重排字符串

&#x1f984;個人主頁:修修修也 &#x1f38f;所屬專欄:刷題 ??操作環境:牛客網 目錄 一.NC41 最長無重復子數組 題目詳情: 題目思路: 解題代碼: 二.NC379 重排字符串 題目詳情: 題目思路: 解題代碼: 結語 一.NC41 最長無重復子數組 牛客網題目鏈接(點擊即可跳轉):NC41 最長…

C語言:字符串處理函數strstr分析

在 C 語言中&#xff0c;strstr 函數用于查找一個字符串中是否存在另一個字符串。它的主要功能是搜索指定的子字符串&#xff0c;并返回該子字符串在目標字符串中第一次出現的位置的指針。如果沒有找到子字符串&#xff0c;則返回 NULL。 詳細說明&#xff1a; 頭文件&#xf…

在windows下安裝spark

在windows下安裝spark完成 安裝過程&#xff1a;

MongoDB常見面試題總結(上)

MongoDB 基礎 MongoDB 是什么&#xff1f; MongoDB 是一個基于 分布式文件存儲 的開源 NoSQL 數據庫系統&#xff0c;由 C 編寫的。MongoDB 提供了 面向文檔 的存儲方式&#xff0c;操作起來比較簡單和容易&#xff0c;支持“無模式”的數據建模&#xff0c;可以存儲比較復雜…

【Java設計模式】第2章 UML急速入門

2-1 本章導航 UML類圖與時序圖入門 UML定義 統一建模語言(Unified Modeling Language):第三代非專利建模語言。特點:開放方法,支持可視化構建面向對象系統,涵蓋模型、流程、代碼等。UML分類(2.2版本) 結構式圖形:系統靜態建模(類圖、對象圖、包圖)。行為式圖形:事…

【4】搭建k8s集群系列(二進制部署)之安裝master節點組件(kube-apiserver)

一、下載k8s二進制文件 下載地址&#xff1a; https://github.com/kubernetes/kubernetes/blob/master/CHANGELOG/CHANGELOG -1.20.md 注&#xff1a;打開鏈接你會發現里面有很多包&#xff0c;下載一個 server 包就夠了&#xff0c;包含了 Master 和 Worker Node 二進制文件。…

電子電氣架構 --- AUTOSAR 的信息安全架構

我是穿拖鞋的漢子,魔都中堅持長期主義的汽車電子工程師。 老規矩,分享一段喜歡的文字,避免自己成為高知識低文化的工程師: 周末洗了一個澡,換了一身衣服,出了門卻不知道去哪兒,不知道去找誰,漫無目的走著,大概這就是成年人最深的孤獨吧! 舊人不知我近況,新人不知我過…

ROS2與OpenAI Gym集成指南:從安裝到自定義環境與強化學習訓練

1.理解 ROS2 和 OpenAI Gym 的基本概念 ROS2&#xff08;Robot Operating System 2&#xff09;&#xff1a;是一個用于機器人軟件開發的框架。它提供了一系列的工具、庫和通信機制&#xff0c;方便開發者構建復雜的機器人應用程序。例如&#xff0c;ROS2 可以處理機器人不同組…

【設計模式】創建型 -- 單例模式 (c++實現)

文章目錄 單例模式使用場景c實現靜態局部變量餓漢式&#xff08;線程安全&#xff09;懶漢式&#xff08;線程安全&#xff09;懶漢式&#xff08;線程安全&#xff09; 智能指針懶漢式(線程安全)智能指針call_once懶漢式(線程安全)智能指針call_onceCRTP 單例模式 單例模式是…

C語言之九九乘法表

一、代碼展示 二、運行結果 三、代碼分析 首先->是外層循環是小于等于9的 然后->是內層循環是小于等于外層循環的 最后->就是\n讓九九乘法表的格式更加美觀(當然 電腦不同 有可能%2d 也有可能%3d) 四、與以下素數題目邏輯相似 五、運行結果