自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

HugMua的博客

个人学习笔记总结

  • 博客(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 适配 - 拖放 DragAndDrop

通过 Modifier 设置拖动组件和接收组件,让数据可以在两个组件甚至两个应用中共享。

2026-03-10 17:42:22 338

原创 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

原创 Kotlin - 引用操作符 ::

将类、函数、属性、构造函数等程序元素转化为可传递的引用对象,就像给这些元素贴上标签,方便在代码中灵活调用。

2026-01-20 18:38:08 308

原创 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 封装 - 返回键监听

当界面回退不了了,系统默认逻辑是最小化到后台,不会退出APP。

2026-01-03 05:59:50 268

原创 Compose 封装 - 点击涟漪(水波纹)效果 Ripple

【代码】Compose 封装 - 去除点击涟漪(水波纹)效果。

2026-01-03 05:02:42 216

原创 Compose 封装 - 倒计时消失容器

【代码】Compose 封装 - 倒计时消失容器。

2026-01-03 04:56:12 179

原创 Compose 封装 - 点击防抖

适用于自带点击回调的组件如Button。

2026-01-02 22:45:28 260

原创 Compose 封装 - 禁止截屏、获取截屏

【代码】Compose 封装 - 禁止截屏。

2026-01-02 20:05:49 189

原创 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

原创 Jetpack - Media3(MediaController 响应外部控制)

同 ExoPlayer,都是 Player.Listener。

2025-12-23 02:51:32 223

原创 Compose 调用 - 媒体播放 Media3(ExoPlayer)

如果上面没有需要的组件,可以自行通过状态来构建自定义组件。状态获取方式播放暂停上一项下一项重复模式随机模式播放速度Icon(),

2025-12-20 02:57:25 895

原创 Compose 适配 - 全屏显示 EdgeToEdge

参考文章。

2025-12-18 23:24:38 508

原创 测试 - 概览

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 Studio - 使用 BuildConfig

可以定义全局变量,根据 debug 或 release 环境分别拿到不同的值。

2025-11-16 22:24:55 271

原创 网络 - 监听与优化

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关注的人

提示
确定要删除当前文章?
取消 删除