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.mzph.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;并将每个元素打印输出到控制台。 …