自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

tmacfrank

分享移动开发领域知识

  • 博客(133)
  • 收藏
  • 关注

原创 Compose 实践与探索十七 —— 多指手势与自定义触摸反馈

前面我们讲了很多半自动化 API 进行手势识别,那些 API 可以覆盖绝大多数的使用场景。本节我们来介绍,如何通过底层 API 实现完全自定义的触摸算法。

2025-03-28 16:43:52 963

原创 Kotlin 协程官方文档知识汇总(二)

在本教程中,将会学到如何使用协程来执行网络请求,而不会阻塞底层线程或回调。

2025-03-26 22:48:34 578

原创 大数据判存算法

布隆过滤器(英语: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 实践与探索五 —— 动画进阶

介绍 Compose 动画的各种 AnimationSpec。

2025-03-13 23:23:43 779

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

原创 Compose 实践与探索一 —— 关键知识与概念详解

本节主要概括性地介绍 Jetpack Compose 中的关键概念。

2025-03-10 22:41:40 846

原创 Compose 的集成与导航

首先我们来看如何在 View 体系中集成 Compose。

2025-01-13 23:59:45 1288

原创 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-12 23:39:54 662

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

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