- 博客(243)
- 收藏
- 关注
原创 Compose 基础 - 重组优化
原因:调用 forEach() 遍历时,生成4个 Item(子组合项)并依次设置 Element(列表元素),LaunchEffect() 也就输出了4次,但是由于 Item 和 Element 没有一一对应,当列表头部新插入一个 Element 时,会把新 Element 设置到第一个 Item 上,其余 Element 依次设置到后面的 Item 上,最后一个 Element 设置到新生成的 Item 上,因此前四个 Item 发生了重组而最后一个是新增的就不存在重组了。这几乎是 0 CPU 开销。
2026-03-12 03:08:56
377
原创 Compose 组件 - 条目侧滑更新/删除 SwipeToDismissBox
问题一:设置阈值没用,慢划超过中线才开始触发,快划短距离就能触发20260309。问题二:对背景设置动画渐变:获取进度方法提示过时,且超过中线才开始变化。即便使用animateColorAsState()并在 Settled 时将背景色还原成白色,滑动时瞬间变为目标色,等于没有过渡效果。
2026-03-09 22:22:44
356
原创 Compose 自定义 - 可重用的视觉效果 Indication
创建应用效果的 Modifier.Node,附加后节点会观察互动来源并启动动画。然后需要实现 DrawModifierNode 重写 ContentDrawScope#draw(),使用绘制命令来呈现缩放效果。调用 drawContent() 将绘制 Indication 应用到的目标组件,因此只需在缩放转换中调用此函数。确保一定要调用 drawContent(),否则应用 Indication 的目标组件将不会绘制。scale() {
2026-03-08 02:02:38
362
原创 Compose 自定义 - 处理交互 Interaction
针对的是那些自带交互的组件,属于手势的最顶层API,更底层的自定义方式。同时关注目前处于实验性的更简单实现方式 Style API(androidx.compose.foundation.style)。
2026-03-07 17:37:17
505
原创 Compose 自定义 - 布局 SubcomposeLayout
当需要根据可用空间(约束)来动态加载子元素或布局,约束在 Layout() 中获取,但是所有子元素在布局阶段之前(也就是组合阶段)就完成了生成。这时就需要使用 SubcomposeLayout(),会将子元素的生成推迟到组合阶段再执行,让你在 measurePolicy() 中手动调用 subcompose() 来生成内容并返回 Measurables,更简单的方式是使用 BoxWithConstraints() 组件。参数 slotId 唯一标识避免重复生成子元素。
2026-03-03 22:19:41
349
原创 Android 优化 - R8 混淆
多个 jar 包包含相同的类,混淆时报错。使用-dontnote或-dontwarn压制特定包的警告,或者在中排除重复依赖。
2026-02-21 17:39:36
651
原创 Android - 清单文件 AndroidManifest
这些问题的根源在于 Manifest Merging(清单合并)。最终打包进 APK 的 Manifest,并不是你写的那一个文件,而是你的主工程 Manifest 与所有第三方依赖库(Dependencies)的 Manifest 自动合并后的产物。当你的配置与第三方库发生冲突,或者你想强行修改第三方库的行为时,Android 提供的 tools 命名空间就是你手中的“尚方宝剑”。
2026-02-17 20:45:51
566
原创 Compose 调用 - 震动 LocalHapticFeedback
执行震动GestureEnd 手势结束GestureThresholdActivate 达到阈值SegmentTick 条目、滑块SegmentFrequentTick 钟表、百分比ConfirmRejectVirtualKeyToggleOnToggleOff。
2026-02-14 16:12:39
92
原创 Kotlin - 函数的上下文参数 Context Parameters
/上下文也可以是类//定义带有上下文的函数userService.findUserById(id) //使用上下文的功能//定义带有上下文的扩展函数。
2026-02-10 17:20:23
66
原创 Kotlin - 类型别名 typealias
就是另外取个名称,解决又臭又长的命名。可用于:类、泛型类、内部类、函数类型、泛型函数。格式:typealias 别名 = 原类型名,需要声明在顶层。自 Kotlin v2.3,可以声明在类、接口、对象中,默认 private 限制在内部使用(可显式声明为 internal、public 使其能在外部被访问),作用域隔离避免顶层命名污染,因此可将基本数据类型改成更有意义的名称,如 private typealias BookName = String。
2026-02-08 20:28:20
110
原创 Multiplatform - 使用 Jetpack 组件(ViewModel、Navigation3)
在非 JVM 平台上,无法通过类型反射实例化对象。因此在公共代码中,不能直接调用无参数的 viewModel() 函数,每次创建 ViewModel 实例时,至少需提供一个初始化器作为参数。若仅提供初始化器,库会在底层创建默认工厂。但您也可以实现自己的工厂,并调用公共 viewModel(...) 函数中更显式的重载版本,这与 Jetpack Compose 中的使用方式一致。
2026-02-05 01:33:55
50
原创 Compose 基础 - 预览效果 @Preview
使用 @Preview 注解的可组合函数可以在 AndroidStudio 右上角直接预览效果和点击交互。按出prev能快速打出模板代码。一个可组合项可以添加多个注解预览不同效果。推荐命名方式:组件名+Preview。Materrial。
2026-01-29 17:15:41
681
原创 Compose 调用 - 拖动排序 Reorderable
支持列表(Column&Row)、滑动列表(LazyList)、网格(LazyGrid)、瀑布流(LazyStaggeredGrid)。key: Any,包裹可拖动的条目。= null,设置给条目中触发拖动的位置(拖动范围)。
2026-01-26 23:26:07
697
原创 Compose 适配 - 自定义主题
2.1 定义常量定义属性在各个主题下的值。//文字//背景聚合所有属性,用于创建不同的主题。) {//颜色是有状态的,发生改变时所有引用这个颜色的组合项都会重组。
2026-01-17 00:17:18
285
原创 Android 架构 - 组件化 Modularzation
有的业务组件需要被传入数据,或是用到的资源需要初始化,自定义一个 TestApplication 继承 lib_base 中提供的 BaseApplication。如果用不到,就直接把 BaseApplication 注册。现在都是单 Activity 的应用开发,业务模块在独立模式下需要有 Activity 承载显示,因此 debug 包下创建一个 LauncherActivity。) {
2026-01-12 15:25:08
929
原创 AndroidStudio - TOML
在项目上右键→New→File→Vewsion Catalogs,取名 libs,会自动加后缀 .version.toml(没有就直接创建文件取完整名称)。在 settings.gradle 中的 <dependencyResolutionManagement> 标签下使用 <versionCatalogs> 引入所创建的文件。将 Project 的 build.gradle 中 application 和 library 还原成默认书写方式。
2026-01-06 20:45:49
375
原创 Compose 调用 - 导航 Navigation3 正式版
路径可以是任何类型但通常是简单的可序列化数据类。使用密封接口方便调用和限制结构。路径无参用 data object,有参用 data class。添加 @Serializable 注解,使其可以序列化。继承 NavKey 接口,作为可以被数据持久化的标记。//无参//有参//嵌套路径。
2025-12-27 02:21:54
984
原创 Android Studio - 解决 Using ‘jvmTarget: String‘ is an error. Please migrate to the compilerOptions DSL
kotlinOptions {} 在 Kotlin v2.0 废弃了,v2.2.0之前还能用,之后需要迁移到新语法 compilerOptions {}。
2025-12-26 18:14:04
461
原创 Compose 调用 - 媒体播放 Media3(ExoPlayer)
如果上面没有需要的组件,可以自行通过状态来构建自定义组件。状态获取方式播放暂停上一项下一项重复模式随机模式播放速度Icon(),
2025-12-20 02:57:25
895
原创 测试 - 概览
AndroidStudio 中的项目结构有三个目录:main(我们的业务代码)、test、androidTest。测试中能访问app中的代码,app中不能访问测试中的代码。仪器化测试 / 插桩测试。本地测试 / 单元测试。
2025-12-13 23:00:01
254
原创 测试 - 单元测试(JUnit)
assertArrayEquals(expectedArray, actualArray) 数组。assertNotSame(unexpected, actual) 对象。assertEquals(expected, actual) 值。assertSame(expected, actual) 对象。
2025-12-13 22:59:15
410
原创 设计模式 - 组合模式 Composite Pattern
将对象组合成树形结构以表示"部分-整体"的层次结构,以一致的方式处理树形结构中的所有对象。Component组件Composite复合节点Leaf叶子节点。
2025-12-03 14:10:34
223
原创 设计模式 - 责任链模式 Chain of Responsibility Pattern
通过将多个处理器(处理对象)以链式结构连接起来,使得请求沿着这条链传递,直到有一个处理器处理该请求为止。Handler处理器接口具体处理器。
2025-12-03 12:49:56
236
原创 设计模式 - 享元模式 Flyweight Pattern
尝试重用现有的同类对象,如果未找到匹配的对象,则创建新对象。当程序中存在大量相似对象,每个对象之间只是根据不同的使用场景有些许变化时。Flyweight享元接口具体享元类Flyweight享元工厂。
2025-12-03 11:10:27
278
原创 设计模式 - 适配器模式 Adapter Pattern
就像电源适配器一样,让手里的两孔插头可以用在目标三孔插座上,两孔插头→电源适配器→三孔插座。
2025-11-25 22:59:32
332
原创 设计模式 - 单例模式 Singleton Pattern
确保一个类只有一个实例,并提供全局访问点,该类负责创建自身对象,同时保证仅单个对象被创建,且可直接访问(无需实例化)。
2025-11-19 23:33:24
213
原创 网络 - 监听与优化
Android监测网络连接状态主要依赖ConnectivityManager,分为主动查询和被动监听两种方式,其中NetworkCallback(Android 5.0+)是推荐的监听方式,支持更细粒度的网络变化回调。Android 10(API 29)后,NetworkInfo(如getType())被标记为过时,推荐使用NetworkCapabilities判断网络类型,支持区分Wi-Fi、4G、5G等。通过注册NetworkCallback,监听网络连接/断开、网络类型变化等事件,无需频繁查询。
2025-11-06 05:00:03
647
原创 网络 - 缓存
当某些网络访问获取的内容不是每次都变的,而是短时间不变的(每月榜单)或长时间不变的(歌曲的信息),每次访问都联网获取的话,可能响应慢,不支持离线浏览,浪费用户和公司的流量费用和带宽占用。因此将已请求的内容存储在本地(内存或磁盘)用于后续复用。
2025-11-06 03:33:53
1079
原创 Compose 调用 - 生命周期 Lifecycle
LifecycleEventEffect 可自由指定需要监听的生命周期,LifecycleStartEffect 和 LifecycleResumeEffect 监听特定声明周期,还可以指定 key 来再次触发,必须回调指定方法可用来清理资源。
2025-11-02 00:55:51
389
原创 Jetpack - Media3(ExoPlayer 播放器控制)
将起始索引 fromIndex(包含) 到目标索引 toIndex(不包含) 之间的条目,移动到目标索引newIndex。fromIndex超出范围请求会被忽略,toIndex超出范围则一直截取到尾部,newIndex超出截取后剩余的范围则为列表尾部。播放列表中的项之间可以无缝切换,无格式相同要求,甚至无媒体类型相同要求,也就是播放列表可以同时包含图片、视频、音频。调整速率(不改变音调),参数 speed 必须大于 0,1.0 为正常速率,2.0 为两倍速,0.5 为半速。
2025-10-27 04:01:12
1202
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅