- 博客(53)
- 资源 (5)
- 收藏
- 关注
原创 Jetpack Compose 动画AnimationSpec
Jetpack Compose 中的 AnimationSpec 是动画行为的核心,定义动画的驱动方式与数学模型。主要类型包括:tween(时间驱动,支持缓动)、spring(物理驱动,具弹性)、keyframes(关键帧精确控制)、repeatable/infiniteRepeatable(重复循环)、snap(瞬时切换)及 exponentialDecay(惯性衰减)。其中,Easing 仅用于控制 tween 等动画的速度曲线,如 FastOutSlowIn、Linear 等。
2026-11-06 15:23:48
345
原创 kotlin中的高阶函数
高阶函数是将函数作为参数或返回值的函数,源于数理逻辑中的“高阶”概念。在Kotlin中,它与Lambda表达式紧密结合,实现行为参数化,提升代码灵活性与可读性。标准库如filter、map及自定义函数均体现其应用,结合inline优化更可提升性能。高阶函数提供框架,Lambda提供具体逻辑,二者协同构建简洁、高效的函数式编程范式。
2026-11-02 17:17:03
182
原创 kotlin与函数式编程
函数式编程(FP)强调纯函数、不可变数据与声明式思维,通过高阶函数、Lambda 表达式和不可变集合实现代码的可预测性与可维护性。Kotlin 作为多范式语言,融合 OOP 与 FP,以 val、作用域函数、尾随 Lambda、内联函数等特性,实现高效、安全、简洁的代码编写,尤其在集合处理、DSL 构建与并发编程中优势显著,既保留了面向对象的结构组织能力,又提升了代码表达力与性能。
2026-10-30 18:36:48
367
原创 Jetpack Compose 动画Modifier.animateItem()
Jetpack Compose 1.7.0 引入 Modifier.animateItem(),为 LazyColumn/LazyRow 提供开箱即用的平滑动画,支持位置重排、出现(淡入)与消失(淡出)三种动态变化。使用时需在 items() 中指定稳定 key(如数据 ID),否则动画失效。可通过 fadeInSpec、fadeOutSpec 及 placementSpec 自定义动画效果,实现流畅的交互体验。
2026-10-29 00:03:58
205
原创 Jetpack Compose 动画Modifier.animateContentSize()
Modifier.animateContentSize() 为 Jetpack Compose 中组件尺寸变化提供平滑动画,避免界面突变。它自动捕获内容尺寸变化,在旧尺寸与新尺寸间插值,实现自然过渡。适用于展开/收起卡片、文字增减等场景。使用时需注意调用顺序:若需内边距参与动画,应置于 padding() 前;若仅内容区域动画,则放其后。区别于 AnimatedVisibility,它更适用于同一容器内整体尺寸变化的流畅过渡。
2026-10-28 23:57:12
224
原创 Jetpack Compose 动画Animatable
Jetpack Compose 中的 Animatable 是基于协程的低级动画 API,提供命令式精确控制。相比声明式的 animate*AsState,它支持在协程中手动驱动动画,实现多步骤串行动画(如弹性放大、抖动反馈),并可无缝响应手势与事件中断。其内置边界限制与类型安全,适用于复杂交互场景,如拖拽、惯性滑动及错误输入时的震动反馈,显著提升动画灵活性与用户体验。
2026-10-26 17:29:31
194
原创 Jetpack Compose 动画AnimatedContent
Jetpack Compose 中的 AnimatedContent 是 Crossfade 的进阶版,支持自定义入场与出场动画。它可根据状态变化动态调整动画方向(如数字增大时从下滑入,减小时从上滑入),并自动处理组件尺寸变化的平滑过渡。通过 transitionSpec 可组合滑动、缩放、透明度等效果,适用于计数器、引导页、标签切换等场景,实现高度可定制的视觉交互体验。
2026-10-25 23:27:15
180
原创 Jetpack Compose 动画Crossfade
Jetpack Compose 的 Crossfade API 用于实现不同内容间的平滑交叉淡入淡出动画。通过指定状态键(如枚举值),当状态变化时,自动触发旧内容淡出、新内容淡入的无缝过渡,代码简洁高效。相比手动控制 Visibility,Crossfade 更适合“多选一”场景,如 Tab 切换或页面状态切换,显著提升界面流畅性与开发效率。
2026-10-24 23:14:06
209
原创 Jetpack Compose 动画rememberInfiniteTransition
rememberInfiniteTransition 是 Jetpack Compose 中专为无限循环动画设计的 API,无需外部状态触发,组件进入组合即自动播放。支持多属性协同动画(如缩放、颜色),并可通过 RepeatMode.Reverse 或 Restart 实现呼吸灯、脉冲等效果。示例中通过 animateFloat 与 animateColor 配合 infiniteRepeatable,实现加载卡片的动态缩放与渐变,适用于加载指示器、骨架屏等场景。
2026-10-23 14:33:38
187
原创 Jetpack Compose 动画AnimatedVisibility
Jetpack Compose 中的 AnimatedVisibility 用于声明式控制组件的显示与隐藏动画。通过 visible 状态驱动,支持淡入淡出、滑动、展开收缩等组合动画,并自动管理布局空间与生命周期。底层基于 updateTransition,实现平滑过渡与状态机管理。示例中结合 fadeIn() 与 expandVertically() 实现流畅入场效果,简洁高效地构建动态界面。
2026-10-22 09:53:41
75
原创 Jetpack Compose 动画updateTransition
Jetpack Compose 中的 updateTransition 是管理多属性联动动画的高级 API,通过状态机实现尺寸、颜色、透明度等属性的同步平滑过渡。相比 animate*AsState,它更适合复杂状态(如折叠/展开)下的协同动画,自动处理中途状态切换的平滑过渡,代码结构更清晰,逻辑更统一,显著提升交互体验与可维护性。
2026-10-20 15:55:03
379
原创 Jetpack Compose 动画animate*AsState
Jetpack Compose 中的 animate*AsState 系列函数(如 animateDpAsState、animateColorAsState)是实现单值动画的轻量级首选方案。它支持声明式动画,无需手动管理动画流程,状态变化时自动平滑过渡,并可无缝中断重叠动画。适用于尺寸、颜色、透明度等属性的动态变化,如按钮缩放与变色,代码简洁高效,提升交互流畅性。
2026-10-19 17:51:15
177
原创 Android开发中库(Library)的选择
在 Android 开发中,库的选择需遵循“四步筛选法”:优先采用 Google 官方推荐的 Jetpack 架构(如 Compose、ViewModel、Hilt、Room 等)构建核心基座;按功能需求精准引入模块(如 Coil 处理图片,Adaptive Navigation 支持折叠屏);评估库时坚持“维护性、生态兼容性、学习成本”三原则;最后通过 BOM 管理版本,避免冲突,遵循最小化原则,提升开发效率与稳定性。
2026-10-09 15:50:08
274
原创 Kotlin 引用操作符::
Kotlin 中的 :: 操作符用于获取函数、属性或类的引用,实现延迟执行与反射。它支持属性引用(如 User::name)、类引用(如 MyActivity::class)和构造函数引用(如 Person::class.primaryConstructor),常用于依赖注入、动态调用与函数式编程。相比 { appState.navigateBack() } 的匿名函数,appState::navigateBack 不创建闭包,性能更高,但灵活性较低,适用于参数匹配且无需额外逻辑的场景。
2026-09-30 22:53:44
238
原创 jetpack compose 主题MaterialTheme
在 Jetpack Compose 中,MaterialTheme 是实现 Material Design 3 的核心组件,通过 colorScheme、typography 和 shapes 三大支柱统一应用视觉风格。它支持动态颜色、语义化排版与可扩展形状,提升个性化与一致性。开发者可通过自定义主题(如 LightColorScheme、Typography、Shapes)灵活配置样式,并在组件中通过 MaterialTheme 轻松获取当前主题属性,实现高效、一致的 UI 构建。
2026-09-22 22:37:32
374
原创 kotlin 关键字data
data 关键字在 Kotlin 中通过编译期生成 equals()、hashCode()、toString()、copy() 及 componentN() 等方法,减少模板代码,确保字段变更时自动同步,提升可维护性。它不改变内存布局,也不引入运行时开销,仅用于标注数据模型意图,便于 IDE 和库优化(如解构、序列化)。object 加 data 仅增强 toString()。核心价值在于:消除重复代码、降低出错率、明确语义。
2026-09-12 16:14:27
207
原创 kotlin 构造函数
Kotlin 中,若未显式定义构造函数,编译器会自动生成公开的无参主构造函数。一旦定义任何构造函数(主或次),则不再自动生成无参构造函数。主构造函数是类属性定义与初始化的中心,次构造函数必须通过 this() 委托给主构造函数,以确保 val 属性的唯一初始化和 init 块的正确执行顺序。相比 Java 的多构造函数重载,Kotlin 更推荐使用主构造函数的默认参数来实现灵活实例化,避免冗余次构造函数。
2026-09-11 14:38:31
288
原创 kotlin 关键字expect/actual的作用
Kotlin 多平台中,expect 与 actual 实现跨平台代码共享与原生能力结合。expect 在通用模块声明接口规范,actual 在各平台提供具体实现,编译期完成链接,零运行时开销且类型安全。支持函数、类、属性、枚举及类型别名,适用于底层平台调用或复用原生类。建议仅用于基础 API,复杂逻辑优先使用接口+依赖注入。
2026-09-10 15:28:31
308
原创 Kotlin 三类关键字
编译器不是靠"认出这个词"来区分,而是靠语法位置:出现在类型参数列表后面、声明末尾,就是约束关键字;出现在标识符该出现的地方,就是普通名字。where 是 Kotlin 声明泛型上界约束的语法,用途是限制类型参数必须是哪些类型的子类型。多个约束时:必须用 where。
2026-09-09 16:34:11
174
原创 kotlin 扩展函数的作用域
扩展函数没有“注入到类里”,它始终是外挂的静态函数;定义位置(顶层 / 类内 / 对象内)决定它的可见作用域,其中成员扩展只能在宿主类的作用域内调用——这是 Kotlin 用作用域模拟“上下文依赖 API”的核心手法。这就是为什么 minHeight.toPx() 必须包在 with(density) { } 里——toPx() 是 Density 的成员扩展,出了这个作用域就不存在。核心规则一句话:扩展函数定义在哪里,决定了它在哪里可见、在哪里可调。② 类内扩展(成员扩展)——作用域受限的“特权函数”
2026-08-29 15:41:47
259
原创 jetpack compose中使用BroadcastReceiver
在 Compose 中,推荐使用 collectAsStateWithLifecycle()(需引入 androidx.lifecycle:lifecycle-runtime-compose 依赖)代替传统的 collectAsState(),它可以根据组件的生命周期(如 App 切入后台)自动挂起和恢复 Flow 收集。利用 callbackFlow 构建冷流(Cold Flow),在观察者开始收集(collect)时注册广播,取消收集时自动注销广播。第二步:在 ViewModel 中进行状态转换。
2026-08-21 23:15:53
233
原创 Jetpack Compose 单次测量和固有特性测量
Jetpack Compose的单次测量机制解决了传统Android View系统多次测量导致的性能问题。传统View系统在复杂布局(如嵌套权重或相对布局)中会触发指数级增长的测量次数(O(2^n)),而Compose通过约束传递和单次测量原则(每个节点仅测量一次)优化了性能。对于需要依赖子组件尺寸的场景,Compose引入固有特性测量(Intrinsic Measurements),在不违反单次测量规则的前提下,通过预查询子组件尺寸实现布局协调。这一机制显著提升了UI渲染效率,尤其适用于复杂动态布局。
2026-08-15 16:59:48
342
原创 Jetpack Compose中如何实现margin
Jetpack Compose没有独立margin概念,主要通过Modifier.padding()实现类似效果。核心在于Modifier顺序:在background/size前使用padding等效于margin(产生外部间距),之后使用则是传统padding(内部间距)。常用技巧包括:1)控制Modifier链顺序;2)在父容器设置padding;3)使用Spacer组件添加间距。这种设计体现了Compose"单一修饰符多用途"的布局哲学,通过修饰符顺序而非独立属性来区分内外边距。
2026-08-07 17:38:32
237
原创 jetpack compose 副作用 rememberUpdatedState
摘要: rememberUpdatedState 是 Jetpack Compose 中解决长生命周期效应(如 LaunchedEffect)闭包引用过期的关键工具。它通过 remember 存储 MutableState 并实时更新值,确保在永不重启的效应中始终访问最新状态或回调。典型场景包括: 触发型回调(如倒计时结束后调用父组件的最新函数); 清理逻辑(在 DisposableEffect 中销毁时使用最新状态上报数据); 长周期协程(如轮询任务中动态读取最新配置); 封装工具函数(如防抖点击,避免因
2026-08-06 16:48:47
241
原创 jetpack compose 副作用 DisposableEffect
DisposableEffect 是 Jetpack Compose 中用于管理需要清理的副作用的 API,主要用于处理资源释放、监听器注销等场景。其核心机制是在组件进入/离开组合或依赖项变化时,自动执行资源清理逻辑。常见使用场景包括:监听器注册/注销(如广播接收器)、资源打开/关闭(数据库连接)、回调桥接、第三方框架集成、服务绑定/解绑等。使用时需在效果块中返回 onDispose 清理逻辑,并通过 key 参数控制重新执行的时机。DisposableEffect 能有效防止内存泄漏,确保资源及时释放。
2026-08-06 14:13:24
215
原创 jetpack compose 副作用 rememberCoroutineScope
rememberCoroutineScope 是 Jetpack Compose 中管理协程生命周期的工具,它会返回一个与组合绑定的 CoroutineScope。当 Composable 离开组合时,该 scope 及其所有协程自动取消。它默认在主线程运行,适合处理用户触发的异步操作(如按钮点击)。与之相比,LaunchedEffect 会在进入组合时立即执行协程,适合初始化操作。典型使用场景包括:用户点击后显示 Snackbar、执行网络请求等需要手动触发的异步任务。
2026-08-04 21:44:46
272
原创 jetpack compose 副作用 SideEffect
摘要:SideEffect 是 Jetpack Compose 中用于将内部状态安全同步到外部系统的工具,执行时机在组合提交后、下次重组前。典型应用场景包括状态同步(如保存滚动位置)和分析埋点(如记录页面浏览)。使用时需注意:1)避免在 SideEffect 内修改状态以防无限循环;2)仅适用于"读"操作而非"写"操作;3)异步操作应使用 LaunchedEffect。该机制确保数据单向流动,适用于组合成功后的副作用处理。
2026-08-04 10:47:57
275
原创 jetpack compose 副作用 LaunchedEffect
LaunchedEffect是Jetpack Compose中处理协程副作用的核心API,它实现了与组合生命周期绑定的协程管理。其工作原理是通过RememberObserver接口监听生命周期,在进入组合时启动协程执行任务,离开组合或key变化时自动取消协程。典型应用场景包括:1)一次性初始化(埋点、SDK初始化);2)响应式数据加载(参数变化时重新请求);3)周期性任务(倒计时/轮询);4)Flow流收集。关键特性是自动取消机制,通过CoroutineScope.isActive检查确保协程安全退出,避免
2026-08-03 23:42:46
298
原创 jetpack compose 副作用 derivedStateOf
Compose中的derivedStateOf是一个派生状态工具,具备两大核心功能:自动依赖追踪和结果缓存去重。它通过声明式方式自动收集依赖的State,无需手动维护依赖列表,并提供三种结果比较策略(结构相等、引用相等和永远不等)控制更新通知。该机制基于read-observer和apply-observer实现精确的细粒度更新,仅当依赖变化时才重新计算并通知相关观察者。典型应用场景包括:状态转换链式处理(如StateFlow风格转换)、与snapshotFlow组合实现高效副作用处理,以及在可变参数场景下
2026-08-03 11:44:41
905
原创 jetpack compose 副作用 snapshotFlow
摘要(150字): snapshotFlow 是 Jetpack Compose 中连接状态系统与 Kotlin Flow 的桥梁,将 Compose State 转换为 Flow 流,便于用 Flow 操作符处理状态变化。其核心特点是仅在状态实际变更时触发收集,不受重组影响。典型场景包括: 搜索防抖(debounce + filter) 多状态组合验证(如表单校验) 滚动位置监听(动态调整 UI) 持久化存储(如自动写入 DataStore) 高频事件节流(如地图坐标上报) 原理:通过快照系统监听 Sta
2026-07-31 17:32:17
264
原创 jetpack compose 副作用 produceState
produceState 是 Jetpack Compose 用于将外部数据源转换为可观察状态的工具,具有自动生命周期管理和键控重启特性。它适合轻量级场景(代码简洁但状态不可共享),而 ViewModel 方案则更适合复杂场景(支持状态共享、数据持久化和单元测试)。其底层通过 remember + LaunchedEffect 实现,能自动处理协程的启动/取消,简化异步状态管理。开发者应根据场景复杂度在两种方案间选择,简单逻辑用 produceState,复杂业务逻辑推荐 ViewModel 方案。
2026-07-30 16:01:15
293
原创 kotlin控制结构when
Kotlin 的 when 表达式是一个强大的控制结构,兼具 switch 和 if-else 链的功能。主要分为带主语(匹配条件)和不带主语(任意布尔表达式)两种形式,支持常量值、范围、类型检查等多种分支条件。特别适用于处理 sealed class/enum 的穷尽性检查,能触发智能类型转换。此外,when 可作为表达式返回值、函数参数或嵌套使用,在 Jetpack Compose 中常用于状态判断和界面渲染。相比传统条件语句,when 提供了更简洁清晰的语法结构。
2026-07-28 20:06:45
257
原创 kotlin中属性声明getter、setter、backing field
Kotlin支持后备属性和委托属性两种方式管理属性。后备属性通过getter/setter访问隐式的backing field(幕后字段),var属性默认有backing field,而val属性若getter是纯计算则不会生成。委托属性使用"by"关键字将属性访问逻辑委托给其他对象(如lazy、observable或Map),此时不能自定义getter/setter。反编译可见:有backing field的属性对应私有字段,而计算属性和委托属性只生成方法调用。这两种机制分别适用于需要存储数据或委托行为的
2026-07-28 14:25:45
312
原创 Kotlin 的 by 关键字用法
Kotlin委托机制总结:1)类委托(by关键字)将接口实现转发给代理对象,可选择性重写部分方法;2)属性委托通过实现ReadWriteProperty/ReadOnlyProperty接口代理属性的get/set操作;3)Map委托将属性与Map键自动关联;4)提供委托(provideDelegate)可在创建委托对象时进行拦截和校验。委托模式能有效减少样板代码,实现关注点分离。
2026-07-20 20:15:57
231
原创 Compose 中自定义布局修饰符
这篇Kotlin代码展示了Jetpack Compose中自定义布局修饰符的标准写法。通过then操作符将匿名LayoutModifier实例拼接至现有Modifier链末尾,实现布局自定义。其中object : LayoutModifier创建了一个匿名类实例,开发者可选择性重写measure和intrinsic相关方法(如minIntrinsicWidth)来实现特定布局逻辑。这种写法允许在Compose中灵活创建自定义布局修饰符。
2026-07-18 16:24:36
168
原创 白板开发中的两套坐标系
本文介绍了画布应用中世界坐标与屏幕坐标的转换逻辑。世界坐标是固定不变的画布逻辑坐标,用于存储元素位置和视口裁剪;屏幕坐标是随用户操作变化的像素坐标,用于处理手势交互。关键转换公式为:screen = (world - pan) × scale 和 world = screen / scale + pan。文中通过两个典型场景(拖动元素时的增量转换和视口裁剪检测)展示了坐标转换的实际应用,并标注了相关代码位置,帮助开发者理解如何在两种坐标系间正确转换。
2026-07-14 14:01:44
190
原创 buildAnnotatedString 多个点击事件
tag 只作标识, annotation value 可以存任意字符串(URL、手机号、邀请码等),在 onClick 里直接取 annotation.item 使用。ClickableText — 用这个 Compose 组件渲染,在 onClick { offset -> } 里通过 offset 查询命中了哪个 tag。pushStringAnnotation(“TAG”, “value”) — 给文字区域贴一个自定义 tag + 值。pop() — 必须调用,否则样式和 tag 会蔓延到末尾。
2026-06-17 14:03:02
179
原创 MVVM 和 MVI
MVVM和MVI是Android开发的两种架构模式,核心区别在于数据流和状态管理。MVVM采用双向数据绑定,ViewModel暴露多个独立状态(如StateFlow/LiveData),View直接订阅更新;MVI则是严格单向数据流,通过密封类定义用户Intent,经Reducer生成单一不可变的UiState驱动UI,适合复杂状态场景。MVVM代码简洁适合快速开发,MVI可预测性强便于调试和团队协作。实际开发中常混合使用,Compose官方推荐方案就融合了MVI的单向数据流思想(UiState+State
2026-06-08 17:58:21
216
原创 TextToSpeech 构造函数回调返回 status == -1(即 TextToSpeech.ERROR)
摘要:当TextToSpeech初始化失败(status=-1)时,主要原因是targetSdk≥30但未在AndroidManifest.xml中添加queries声明。Android 11+加强了包可见性限制,未声明queries将导致无法发现TTS引擎。解决方案是在manifest中添加<intent>声明TTS服务,格式为<queries><intent><action android:name="android.intent.action.TTS
2026-04-30 22:18:52
60
原创 单向数据流 (UDF)
摘要:单向数据流是Android开发中构建可维护UI的核心原则。Jetpack Compose通过ViewModel管理状态(StateFlow)和事件(Event)实现单向数据流,UI层仅负责渲染。反模式包括直接在UI层修改状态或ViewModel操作UI。相比双向绑定,单向数据流更易调试和测试,但需要明确定义Action/State。核心思想是UI只展示,业务逻辑集中在ViewModel。
2026-04-23 10:18:28
43
NDK toolchains mipsel-linux-android
2019-04-30
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅