- 博客(133)
- 收藏
- 关注
原创 Compose 实践与探索十七 —— 多指手势与自定义触摸反馈
前面我们讲了很多半自动化 API 进行手势识别,那些 API 可以覆盖绝大多数的使用场景。本节我们来介绍,如何通过底层 API 实现完全自定义的触摸算法。
2025-03-28 16:43:52
963
原创 大数据判存算法
布隆过滤器(英语:Bloom Filter)是 1970 年由布隆提出的,布隆过滤器可以用于检索一个元素是否在一个集合中,因此它是一个空间效率极高的概率型算法;它实际上是一个很长的二进制向量和一系列随机映射函数;上面给出了布隆过滤器的两个核心:二进制向量和一系列随机映射函数。我们说,数据结构的两个必备要素,一是数据,二是算法。二进制向量就是 bit 数据,可以简单的理解为一个只保存 01 的数组;而算法就是这些随机映射函数,可以简单理解成哈希函数。
2025-03-26 11:14:14
825
原创 排序算法总结
快速排序(Quick Sort)是一种常用的高效排序算法,它采用分治的思想来进行排序。快速排序的核心思想是通过选择一个基准元素(Pivot),将待排序的元素划分为两个子序列,使得左边的子序列都小于等于基准元素,右边的子序列都大于等于基准元素,然后对子序列进行递归排序,最终实现整个序列的有序排列。下面是快速排序的一般步骤:选择基准元素:从待排序序列中选择一个元素作为基准元素。通常选择第一个元素、最后一个元素或者随机选择一个元素作为基准。
2025-03-25 23:36:41
1218
原创 Compose 实践与探索十一 —— ParentDataModifier
)但是这样的话,在实现 modifyParentData() 的具体内容时,你需要去查阅 Box 的父组件 Row 的内部都用到了哪些 parentData,这是一件很麻烦的事情。因此,这种方式不可行。@Stable。
2025-03-25 16:08:13
1235
原创 图相关知识总结
图是由顶点(vertex)和边(edge)组成的一种结构。顶点的集合 V,边的集合是 E,所以图记为 G = (V,E)。图的权:连通图:上图左侧就不是连通图,而右侧的是。度:图的数据存储结构:使用邻接矩阵表示图这种数据结构,无向图是一个对称矩阵:有向图的邻接矩阵:边数组中,每行表示该顶点的出度,每列表示该顶点的入度。
2025-03-24 17:53:25
780
原创 树相关知识总结
树这种数据结构可以让层次管理具有更高的效率:树是指 N 个节点构成的有限集合,该集合具有如下特点:比如对于如下这棵树来说:A 是根,它有如下三棵子树:树的常用基本术语:判断树与非树的标准:如下这三个数据结构都不是树,前两个很明显是因为子树之间相交了,第三个是因为子节点 G 有 A 和 D 两个父节点:如下的这个树除了满足前两个条件外,也满足第三个条件,它有 8 个节点 7 条边:二叉树是度为 2 的树(树中所有结点中最大的度),并且子树有左右之分:树的经典应用就是用来进行编码(图片、视频)以压缩数据占用空间
2025-03-24 17:51:16
953
原创 栈与队列知识总结
栈(Stack)又名后进先出表,它是一种运算受限的线性表。其限制是仅允许在表的一端进行插入和删除运算。这一端被称为栈顶,相对地,把另一端称为栈底。顺序结构:使用数组实现链式结构:使用链表实现链式栈的进栈与出栈操作:让新入栈元素的 next 指向原来的栈顶让栈的 top 指针指向新的栈顶栈元素计数加 1获取栈顶的引用 p将栈顶指针 top 指向 p.next,然后让 p.next = null 断开出栈节点与栈的连接,当然为了促进 GC 回收也可以再加一个 p = null。
2025-03-23 22:15:26
946
原创 链表相关知识总结
首先是三种表的知识总结与应用场景:访问和尾插可以用顺序表(ArrayList),涉及到数据的增删改则使用链表,双向链表(LinkedList)的效率比单向链表更高。List 总结图:Iterator 迭代器接口定义了向后迭代的接口方法 hasNext() 和 next(),一个容器想要拥有迭代功能都应该实现该接口。
2025-03-23 22:12:55
1096
原创 Kotlin 协程官方文档知识汇总(一)
Kotlin 是一门仅在标准库中提供最基本底层 API 以便其他库能够利用协程的语言。与许多其他具有类似功能的语言不同,async与await在 Kotlin 中并不是关键字,甚至都不是标准库的一部分。此外,Kotlin 的挂起函数概念为异步操作提供了比 future 与 promise 更安全、更不易出错的抽象。kotlinx.coroutines 是由 JetBrains 开发的功能丰富的协程库。使用协程需要添加对 kotlinx-coroutines-core 模块的依赖,如。
2025-03-22 23:53:56
1153
原创 Compose 实践与探索十九 —— Compose 显示原理浅析
Compose 的组件都是放在 setContent() 之后才能显示的,那需要先看看这个函数的作用。先看 ComponentActivity 的扩展函数 setContent():setContent() 的主要任务是将用户写的 Compose 组件设置为 Activity 的显示内容。具体说来,就是将 Compose 组件封装进 ComposeView 中,然后用 ComponentActivity 的 setContentView() 设置当前 Activity 显示这个 ComposeView。在
2025-03-22 23:47:19
633
原创 Compose 实践与探索十八 —— Compose 与 View 混用
Compose 发展初期的几年,会是新的模块用 Compose 写,然后逐渐的把老界面从 View 替换成 Compose 组件,直到全部或几乎全部是 Compose 代码的模式。原生的 SurfaceView 与 TextureView 的重点是在它们底层的 Surface API,而不是 View 本身。Compose 并没有给出对等的实现,因此倘若你的项目中用到了它们,就仍需继续使用它们。这也是 View 到 Compose 的迁移到“几乎全部是 Compose 代码”的原因。
2025-03-21 23:11:19
435
原创 Compose 实践与探索十六 ——滑动检测与嵌套滑动
这里对以上内容就不再赘述了,直接去讲解更复杂的 Modifier 实现更复杂的触摸反馈效果。在传统的 View 体系中,在自定义触摸反馈的内容时,对于 View 我们通常都是重写它的 onTouchEvent(),对于 ViewGroup 可能还需要重写 onInterceptTouchEvent(),极少数时候会更深入地去重写 dispatchTouchEvent()。
2025-03-21 23:09:47
975
原创 Compose 实践与探索十五 —— 自定义布局
自定义布局在 Compose 中相对于原生的需求已经小了很多,先讲二者在本质上的逻辑,再说它们的使用场景,两相对比就知道为什么 Compose 中的自定义布局的需求较小了。原生是在 xml 布局文件不太方便或者无法满足需求时才会在代码中通过自定义 View 的方式,重写 onMeasure() 或 onLayout(),或添加其他功能方法来实现需求。
2025-03-17 23:23:30
1209
原创 Compose 实践与探索十四 —— 自定义绘制
不论是在传统的 View 体系下,还是在 Compose 中,“自定义 View” 都包含视图的测量、布局、绘制、触摸反馈以及动画。说到 Compose 的自定义绘制,Compose 提供了更加上层的 API,相比于原生的绘制 API 会更简单、更直接一些。比如原生的 Canvas 和 Paint 在 Compose 中进行正常绘制时是用不到的,只有在使用原生独有的绘制功能(比如多维旋转)时才需要下沉到原生这一层去使用它们。
2025-03-17 23:22:02
1446
原创 Compose 实践与探索十三 —— 附带效应
Google 官方文档对 side effect 有两种翻译,简体中文翻译为附带效应,繁体中文翻译为副作用。本篇文章将全面介绍 Compose 的附带效应 API 的用法以及原理,帮助你区分不同 API 的使用场景。
2025-03-16 22:42:47
791
原创 Compose 实践与探索十二 —— 其他 Modifier
addBeforeLayoutModifier() 与 addAfterLayoutModifier() 并不是指在 Modifier 链上先处理哪个或者后处理哪个具体的 Modifier,而是指同一个 Modifier 具有多重“身份”时,先/后处理哪个“身份”。
2025-03-16 22:40:44
596
原创 Compose 实践与探索十 —— PointerInputModifier 与 SemanticsModifier
作用:ParentDataModifier 用于给子组件附加一些属性,让父组件可以利用用法:只有在通过 Layout() 写自定义函数时才会用到 ParentDataModifier,在测量与布局的算法中通过 Measurable 的 parentData 属性拿到这个数据后根据具体需求使用即可,最后要提供一个 Modifier 函数实现 ParentDataModifier,在 modifyParentData() 中根据需求提供附加数据。
2025-03-15 23:04:30
731
原创 Compose 实践与探索九 —— DrawModifier 解析
每个 LayoutNodeWrapper 中的 entities 数组中的 DrawModifier 是伪造的,要不写在 Box() 的示例代码中会很占篇幅。LayoutNode 的 draw() 调用 outerLayoutNodeWrapper,也就是 LayoutNodeWrapper,在上面的层级图中的 ModifiedLayoutNode1 的 draw() 开始绘制。
2025-03-15 23:02:22
868
原创 Compose 实践与探索八 —— LayoutModifier 解析
前面几节讲的 Modifier 都是起辅助作用的,比如 Modifier 的伴生对象、CombinedModifier、 ComposedModifier 以及几乎所有 Modifier 的父接口 Modifier.Element。本篇我们开始讲具有直接功效的 Modifier,分为几个大类:LayoutModifier、DrawModifier 等。
2025-03-14 22:38:19
1090
原创 Compose 实践与探索七 —— Modifier 基础
从本篇文章开始我们要讲解 Modifier 修饰符,它是一个很精妙的东西,允许我们通过链式调用的方式为组件应用一系列的样式设置,如边距、字体、位移等。在 Compose 中,每个基础的 Composable 组件都有一个 modifier 参数,通过传入自定义的 Modifier 修改组件的样式。此外,前面我们还提过 Modifier 调用链对顺序敏感,不同的调用顺序会产生不同的 Modifier 链从而影响最终的 UI 效果,这是 Compose 按照 Modifier 链来顺序完成页面布局与绘制的结
2025-03-14 22:35:32
868
原创 Compose 实践与探索六 —— Transition 及其关联 API
本篇是动画的最后一篇,我们先介绍 Transition API,然后再介绍与 Transition 相关的三个上层 API:AnimatedVisibility()、Crossfade()、AnimatedContent()。
2025-03-13 23:29:16
986
原创 Compose 实践与探索四 —— 单值动画
现在在 Android 开发领域说的动画几乎就是属性动画。这节以 animateDpAsState() 为代表,介绍 animateXxxAsState() 这一系列函数。animateDpAsState() 已经包含了 mutableStateOf() 这种数据改变通知监听者的功能,同时还包含 remember() 防止多次初始化的功能,因此创建动画属性就不用 remember() 和 mutableStateOf() 了。
2025-03-11 03:23:38
1473
原创 Compose 实践与探索三 —— 深入理解重组
CompositionLocal 按照字面意思可直译为 Composition 的局部变量。User(name)name 变量只在 setContent() 后的代码块内有效,并且不能穿透到代码块调用的 User 函数之内。User()// 这里会报错的,User 函数的内部访问不到 name 变量Text(name)Compose 提供的 CompositionLocal 可以帮助我们突破这个限制,让通过 CompositionLocal 创建的局部变量具备穿透函数的能力。
2025-03-11 03:20:29
600
原创 Compose 实践与探索二 —— 状态订阅与自动更新
Compose 官方称其是无状态的(Stateless),这个状态是指组件属性。比如说 TextView 内保存的文字内容就是一个状态,你可以通过 getText() 与 setText() 获取与设置文字。但在 Compose 中,组件没有状态,也就是其内部不会保存这些数据,在将数据设置到 UI 上之后,它们就被“扔掉了”。但需要注意的是,无状态作为 Compose 的一个特点,它是允许组件无状态,而不是说组件绝对没有状态。
2025-03-10 22:45:36
1222
原创 Kotlin 协程基础十 —— 协作、互斥锁与共享变量
本节将介绍在协程间如果有先后执行、互相等待的需求时,应该怎样去处理这种等待和协作的工作。更会与 Java 的线程的协作工作对比,从而说明,在线程中通常不太简单的协作操作,在协程中很容易实现。
2025-01-12 23:49:17
1166
1
原创 Kotlin 协程基础九 —— SharedFlow 与 StateFlow
SharedFlow 与 StateFlow 是 Flow 的两个变种,它们把 Flow 的功能从数据流的收集改成了事件流和状态的订阅,这就把适用场景切换到了一个非常实用的范围。
2025-01-12 23:48:43
1351
原创 Kotlin 协程基础八 —— Flow 操作符(二)
本篇是 Flow 操作符的第二篇文章,会讲解异常相关操作符、流程监听操作符、flowOn、buffer 操作符、Flow 合并操作符以及将 Flow 转换为其他类型的操作符。
2025-01-12 23:47:51
695
原创 Kotlin 协程基础七 —— Flow 操作符(一)
Flow 的操作符指的是用一个或多个 Flow 对象,来创建出另一个新的 Flow 对象的函数。接下来我们会用两篇的篇幅来介绍 Flow 的常用操作符。
2025-01-12 23:47:17
1107
原创 Kotlin 协程基础六 —— Flow
上一篇我们讲解了 Channel 的相关知识。Channel 是一个跨协程传递数据的工具,属于底层工具,不是拿来直接用的,尤其是在近些年 Flow API 被推出并逐渐完善之后,Channel 都不太适合当做一个上层的功能性工具来用了。如果需要事件流或数据流,还是用 Flow 比较好。Channel 现在更多是作为 Flow API 的一个关键的底层支撑而存在,它给 Flow 提供了跨协程的能力。从功能上说,Flow 更完整,使用体验更顺畅。本篇我们就开始了解 Flow 的相关内容。
2025-01-12 23:46:22
972
原创 Kotlin 协程基础五 —— Channel
前面我们讲解的 Channel 的相关知识。Channel 是一个跨协程传递数据的工具,属于底层工具,不是拿来直接用的,尤其是在近些年 Flow API 被推出以及逐渐完善之后,Channel 都不太适合当做一个上层的功能性工具来用了。如果需要事件流或数据流,还是用 Flow 比较好。Channel 现在更多是作为 Flow API 的一个关键的底层支撑而存在,它给 Flow 提供了跨协程的能力。从功能上说,Flow 更完整,使用体验更顺畅。这一篇我们就开始了解 Flow 的相关内容。
2025-01-12 23:42:41
934
原创 Kotlin 协程基础四 —— CoroutineScope 与 CoroutineContext
协程提供了多种 CoroutineContext:ContinuationInterceptor、Job、CoroutineExceptionHandler、CoroutineName。如果上述内容都不能满足要为 CoroutineContext 附加专属信息或专属功能的需求,就需要自定义 CoroutineContext。// 自定义的功能。
2025-01-12 23:41:32
936
原创 Kotlin 协程基础二 —— 结构化并发(一)
结构化并发实际上就是父子协程关系的管理,管理父子协程之间生命周期的关联,包括正常的生命周期,以及取消和异常这些特殊情况下的生命周期。接下来我们会用两篇文章的篇幅来介绍结构化并发,第一篇介绍协程的取消,第二篇介绍协程的异常管理。本篇我们会先用代码将协程具象化,然后明确父子协程的关系是如何形成的,最后以线程结束的方式作为引导,对比引出协程的取消。
2025-01-11 23:48:43
1278
2
原创 Kotlin 协程基础一 —— 总体知识概述
本系列文章作为 Kotlin 协程的基础讲解,会介绍协程的概念、用法与适用场景,此外还会介绍与协程紧密相关的 Flow 的相关知识。首篇会先介绍协程的基本概念与使用方法。
2025-01-11 23:24:54
981
1
原创 设计模式总览
介绍 10 种常用的设计模式,包括单例模式、建造者模式、适配器模式、装饰模式、外观模式、组合模式、策略模式、模板方法模式、观察者模式、责任链模式。
2025-01-06 14:17:29
1284
原创 Jetpack Compose 学习笔记(四)—— CompositionLocal 与主题
Jetpack Compose 的主题是基于 Material Design 的,需要先了解一下。使用 Material Theme 就可以获取到 Material Design 的设计元素,如想使用其他设计风格需要自己定义主题。颜色:定义了许多语义命名的颜色,可在整个应用程序中使用。如 Color Scheme、Primary、Secondary 和 On Primary。
2025-01-04 23:08:00
794
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人