Android Jetpack Compose 高級開發核心技術

Android Compose 高級技術總結

1. 性能優化

1.1 狀態管理優化

  • 狀態提升原則:將狀態提升到共享的最近共同父組件
  • derivedStateOf:當需要基于多個狀態計算派生狀態時使用
val scrollState = rememberScrollState()
val showButton by remember {derivedStateOf { scrollState.value > 0 }
}

1.2 重組優化

  • remember:緩存計算結果避免不必要的重組
  • key 參數:幫助 Compose 識別列表項的唯一性
items(items = list, key = { it.id }) { item ->ItemView(item)
}

1.3 延遲加載

  • LazyColumn/LazyRow:僅渲染可見項
  • LazyLayout:自定義懶加載布局

2. 自定義布局

2.1 Layout 修飾符

fun Modifier.customLayout() = layout { measurable, constraints ->val placeable = measurable.measure(constraints)layout(placeable.width, placeable.height) {placeable.placeRelative(x, y)}
}

2.2 自定義布局

@Composable
fun CustomLayout(modifier: Modifier = Modifier,content: @Composable () -> Unit
) {Layout(content = content,modifier = modifier) { measurables, constraints ->// 測量和定位邏輯}
}

3. 動畫高級用法

3.1 自定義動畫

val transition = updateTransition(targetState = isSelected)
val borderColor by transition.animateColor { state ->if (state) Color.Green else Color.White
}

3.2 AnimatedVisibility 擴展

AnimatedVisibility(visible = visible,enter = slideInHorizontally() + fadeIn(),exit = slideOutHorizontally() + fadeOut()
) {// 內容
}

3.3 手勢動畫

val offset = remember { Animatable(Offset(0f, 0f), Offset.VectorConverter) }
LaunchedEffect(offset) {offset.animateTo(targetValue, spring())
}

4. 高級狀態管理

4.1 狀態容器

class MyViewModel : ViewModel() {private val _state = mutableStateOf(MyState())val state: State<MyState> = _statefun update() {_state.value = _state.value.copy(...)}
}

4.2 狀態恢復

@Composable
fun RememberSaveableExample() {var state by rememberSaveable { mutableStateOf(initialValue) }
}

5. 主題與樣式

5.1 動態主題

@Composable
fun MyTheme(darkTheme: Boolean = isSystemInDarkTheme(),content: @Composable () -> Unit
) {val colors = if (darkTheme) DarkColors else LightColorsMaterialTheme(colors = colors, content = content)
}

5.2 自定義形狀和顏色

val MyShapes = Shapes(small = CutCornerShape(4.dp),medium = CutCornerShape(8.dp),large = CutCornerShape(0.dp)
)

6. 與 View 系統互操作

6.1 AndroidView 嵌入傳統 View

AndroidView(factory = { context ->CustomView(context).apply {// 初始化}},update = { view ->// 更新邏輯}
)

6.2 ComposeView 嵌入 Compose 內容

val composeView = ComposeView(context).apply {setContent {MyComposableContent()}
}

7. 測試

7.1 UI 測試

composeTestRule.setContent {MyAppTheme {MyScreen()}
}composeTestRule.onNodeWithText("Button").performClick()

7.2 狀態測試

@Test
fun testState() {val viewModel = MyViewModel()assertEquals(expectedState, viewModel.state.value)
}

8. 高級圖形繪制

8.1 Canvas 繪制

Canvas(modifier = Modifier.fillMaxSize()) {drawCircle(color = Color.Red, radius = 50f)
}

8.2 自定義繪制

@Composable
fun CustomDraw(modifier: Modifier = Modifier) {DrawModifier(modifier)
}private class DrawModifier(val modifier: Modifier) : Modifier.Element {// 實現繪制邏輯
}

9. 高級交互

9.1 多點觸控

var scale by remember { mutableStateOf(1f) }
Modifier.pointerInput(Unit) {detectTransformGestures { _, pan, zoom, _ ->scale *= zoom}
}

9.2 嵌套滾動

val nestedScrollConnection = remember {object : NestedScrollConnection {override fun onPreScroll(available: Offset, source: NestedScrollSource): Offset {// 處理滾動return Offset.Zero}}
}

10. 組合模式與架構

10.1 組合式設計模式

  • Slot API:通過 @Composable lambda 參數提供靈活性
@Composable
fun Card(modifier: Modifier = Modifier,content: @Composable () -> Unit
) {Surface(modifier) {content()}
}

10.2 分層架構

  • UI 層:純 Compose 組件
  • 狀態管理層:ViewModel/State Holder
  • 業務邏輯層:Repository/Use Cases

這些高級技術可以幫助開發者構建更高效、更靈活的 Compose 應用,同時保持良好的架構和可維護性。

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

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

相關文章

Java堆結構深度解析:原理、實現與應用全指南

一、堆的核心概念體系 1. 堆的定義與性質 graph TBROOT((最大堆)) --> A[父節點 ≥ 子節點]ROOT --> B[完全二叉樹結構]ROOT --> C[數組存儲]ROOT --> D[快速獲取極值] 2. 堆類型對比 類型特性典型應用場景最大堆父節點值 ≥ 子節點值獲取前K大元素最小堆父節點…

SpringMVC學習(請求與響應。常見參數類型接收與響應。@RequestParam、@RequestBody的使用)(詳細示例)

目錄 一、請求與響應。(RequestMapping) &#xff08;1&#xff09;使用注解RequestMapping對業務模塊區分。 StudentController。 TeacherController。 &#xff08;2&#xff09;Apifox請求與響應。 "/student/login"。 "/teacher/login"。 二、常見參數…

回溯算法+對稱剪枝——從八皇后問題到數獨問題(二)

引入&#xff1a; 本節我們進一步完善八皇后問題&#xff0c;學習剪枝、八皇后殘局問題 進一步領會邏輯編程的概念&#xff0c;深入體會回溯算法&#xff0c;回顧上一節提到的啟發搜索策略。 回顧&#xff1a; 八皇后問題&#xff1a;我們需要在一個空棋盤上放置 n 個皇后&a…

【玩泰山派】MISC(雜項)- 使用vscode遠程連接泰山派進行開發

文章目錄 前言流程1、安裝、啟動sshd2、配置一下允許root登錄3、vscode中配置1、安裝remote插件2、登錄 **注意** 前言 有時候要在開發板中寫一寫代碼&#xff0c;直接在終端中使用vim這種工具有時候也不是很方便。這里準備使用vscode去通過ssh遠程連接泰山派去操作&#xff0…

【VsCode】設置文件自動保存

目錄 一、前言 二、操作步驟 一、前言 VSCode中開啟自動保存功能可以通過訪問設置、修改settings.json文件、使用自動保存延遲功能來實現。這些方法能有效提升編程效率、避免數據丟失、實時同步更改。 二、操作步驟 在 Visual Studio Code (VS Code) 中設置自動保存功能非…

Adobe After Effects的插件--------Optical Flares之Options概述

Optical Flares插件的Options是對整個效果的組裝和設置。點擊該按鈕會彈出一個組裝室彈窗。 Options組裝室就是對每個【鏡頭對象】進行加工處理,再將其組裝在一起,拼湊成完整的光效。 接下來是我對組裝室的探索: 面板 面板中有預覽、堆棧、編輯和瀏覽按鈕,其作用是調節窗…

如何用 esProc 補充數據庫 SQL 的缺失能力

某些數據庫 SQL 缺失必要的能力&#xff0c;通常要編寫大段的代碼&#xff0c;才能間接實現類似的功能&#xff0c;有些情況甚至要改用存儲過程&#xff0c;連結構都變了。常見的比如&#xff1a;生成時間序列、保持分組子集、動態行列轉換、自然序號、相對位置、按序列和集合生…

迷你世界腳本腳本常見問題

腳本常見問題 彼得兔 更新時間: 2024-05-22 17:54:44 在查閱開發者學院中的腳本API時&#xff0c;若有任何問題或建議&#xff0c;歡迎通過問卷進行反饋&#xff01;【點我填寫問卷】 1.Block中的data在什么地方使用 data使用有具體需求,此處不建議開發者使用。開發者盡可能使…

四、Appium Inspector

一、介紹 Appium Inspector 是一個用于移動應用自動化測試的圖形化工具&#xff0c;主要用于檢查和交互應用的 UI 元素&#xff0c;幫助生成和調試自動化測試腳本。類似于瀏覽器的F12(開發者工具),Appium Inspector 的主要作用包括&#xff1a;? 1.?檢查 UI 元素? …

android11通過白名單卸載安裝應用

目錄 1.源碼路徑: 2.準備文件package.conf: 3.安裝方法installPackagesLI 4.卸載方法deletePackageX 1.源碼路徑: frameworks/base/services/core/java/com/android/server/pm/PackageManagerService.java public static final String WHITELIST_PATH="/data/misc/pa…

qt mapFrom返回的QPoint和event->pos()區別和globalPos區別

mousePressEvent 和 eventFilter 里 event.pos 不一樣&#xff0c;一定要注意 eventFilter里event.pos 直接返回相對于label左上角的坐標&#xff0c;就不要再mapFrom mousePressEvent 里event.pos 返回是相對于窗口左上角的坐標&#xff0c;需要用mapFrom返回label左上角的…

Hadoop四 Hive語法

一 數據庫操作 Hive數據庫操作&#xff0c;與MySql有很多都是一致的 創建數據庫 create database if not exists myhive; use myhive;查看數據庫詳細信息 desc database myhive;數據庫本質上就是在HDFS之上的文件夾&#xff0c;是一個以.db結尾的目錄&#xff0c;默認存…

前端VUE框架理論與應用(10)

1、記住全局注冊的行為必須在根 Vue 實例 (通過 new Vue) 創建之前發生。 2、要注意,以 / 開頭的嵌套路徑會被當作根路徑。 這讓你充分的使用嵌套組件而無須設置嵌套的路徑。 3、注意:在 Vue 實例內部,你可以通過 $router 訪問路由實例。因此你可以調用 this.$router.push…

leetcode-單調棧26

關于單調棧的順序總結&#xff1a; 尋找右邊第一個比我大的&#xff1a;從左到右遍歷&#xff0c;棧單調遞減 尋找左邊第一個比我小的&#xff1a;從左到右遍歷&#xff0c;棧單調遞增 尋找右邊第一個比我小的&#xff1a;從右到左遍歷&#xff0c;棧單調遞增 尋找左邊第一個比…

Linux:安裝 CentOS 7(完整教程)

文章目錄 一、簡介二、安裝 CentOS 72.1 虛擬機配置2.2 安裝CentOS 7 三、連接遠程服務器&#xff08;擴展&#xff09;3.1 獲取虛擬機 IP 地址3.2 連接遠程服務器 四、結語 一、簡介 CentOS&#xff08;Community ENTerprise Operating System&#xff09;是一個基于 Linux 的…

Nautilus 正式發布:為 Sui 帶來可驗證的鏈下隱私計算

作為 Sui 安全工具包中的強大新成員&#xff0c;Nautilus 現已上線 Sui 測試網。它專為 Web3 開發者打造&#xff0c;支持保密且可驗證的鏈下計算。Nautilus 應用運行于開發者自主管理的可信執行環境&#xff08;Trusted Execution Environment&#xff0c;TEE&#xff09;中&a…

Git完全指南:從入門到精通版本控制 ------- Git 工作流程 (3)

Git工作流程完全指南&#xff1a;從入門到高效協作 引言 Git作為分布式版本控制系統的行業標準&#xff0c;其高效的分支管理能力是團隊協作的基石。本文將深入解析標準Git工作流程&#xff0c;助你掌握從代碼提交到團隊協作的全鏈路實踐。 一、Git核心概念速覽 三大工作區域 …

Distortion, Animation Raymarching

這節課的主要目的是對uv進行操作&#xff0c;實現一些動畫的效果&#xff0c;實際就是采樣的動畫 struct texDistort {float2 texScale(float2 uv, float2 scale){float2 texScale (uv - 0.5) * scale 0.5;return texScale;}float2 texRotate(float2 uv, float angle){float…

《vue3學習手記3》

標簽的ref屬性 vue3和vue2中的ref屬性&#xff1a; 用在普通DOM標簽上&#xff0c;獲取的是DOM節點 ref用在組件標簽上&#xff0c;獲取的是組件實例對象 區別在于&#xff1a; 1.vue3中person子組件中的數據父組件App不能直接使用&#xff0c;需要引入并使用defineExpose才可…

List基礎與難度題

1. 向 ArrayList 中添加元素并打印 功能描述&#xff1a; 程序創建一個空的 ArrayList 集合&#xff0c;用于存儲字符串類型的元素。向該 ArrayList 中依次添加指定的字符串元素。使用增強型 for 循環遍歷 ArrayList 中的所有元素&#xff0c;并將每個元素打印輸出到控制臺。 …