重学 Git 细节与本质
既然是重新学习,就不过多解释 Git 的基本用法,而是关注它的原理与进阶。 三大基本操作的细节 clone 大家都知道 git clone 命令是把一份远程的仓库拷贝到本地。具体来讲,clone 操作大致分为三个步骤。 假设当前远程仓库有三个提交,两个分支: 那么 clone 流程如下: 拷贝分支、
搞懂 Java 与 Kotlin 泛型
本文讨论的「泛型」只局限于 Java / Kotlin 中。 什么是泛型 泛型本质上是一个确保类型安全的手段,它属于那种没有也罢有则更佳的特性。泛型几乎没有扩展 Java 能力的边界,而是提高了编码效率与可维护性,减少模板代码并降低出错机率。这么说的原因是使用 Object 就可以传递任意数据,没有
Java 多线程与锁那些事
多线程 什么是线程 一个非常古老,但好多人都没有明确答案的问题:进程、CPU 线程、操作系统线程 有什么区别? [进程] 进程是操作系统为程序开辟的一块独立的,隔离的内存空间。科班出身的同学应该了解过 Linux Process Address Space,对于一个程序来说,它可以视为自己独享全部内
Android ConstraintLayout 约束布局使用全解析
这篇文章没有硬核,主要做一下记录。 基础 ConstraintLayout 旨在代替 RelativeLayout,但实际上不能简单地理解为加强版的相对布局,因为它加强的太多了... ConstraintLayout 主要优点如下: 提供强大的布局属性,几乎可以实现任何布局。 扁平化布局。大幅提高测
Android 拖拽 API 的选择与使用
Android 官方提供了两套拖拽 API,部分情况下它们都能实现需求。今天不仅要讨论各自的基本用法,更重要的是搞清楚它们的区别与使用场景。 OnDragListener OnDragListener 是 Android framework 提供的 API,不需要引用额外的库。它有几个默认的特性:
LeetCode452/435/135/714 贪心算法
总结 当我们感觉局部最优可以推出全局最优,一时找不到反例时就可以使用贪心算法。所谓「贪心」就是只在眼下找到最好的方法。贪心算法相对比较抽象,不像滑动窗口那么好识别有套路。局部最优有很多种表现形式:例如先处理一部分元素,再处理其他部分。或者先从一个维度处理全部元素,再从另一个维度处理。不要把「局部」狭
Android 简单 ScalableImageView 的实现
学习了 Canvas 高级绘制 和 Android 事件分发机制,是时候做个小 Demo 来练手了。今天做的是 ScalableImageView,要实现的功能如下: 默认图片居中,以 CENTER_INSIDE 的方式显示。 双击缩放,放大到比 CENTER_CROP 略大。要适配双击的位置。 放
Android 进阶 - 测量与布局
宏观流程 顾名思义,测量与布局是两个分开的流程。首先从根 View 开始递归调用子 View 的 measure() 方法来测量。然后再从根 View 开始递归逐级调用子 View 的 layout() 方法来布局。此时会把测量的结果,即子 View 的位置与尺寸传递过去,子 View 需要保存这些
Android Bitmap 与 Drawable
做了好几年 Android 开发,很惭愧地说,其实我也不太能分清这两个的区别与使用场景,直到今天。 本质与区别 Bitmap 本质上是一个位图数据,它只是单纯地存储一张图片,仅此而已。 Drawable 这是一个上层的绘制工具,有点类似 View,可以调用 Canvas 进行绘制。但 View 还承
Android 进阶 - 动画与硬件离屏缓冲
ViewPropertyAnimator 属性动画是 Android 中最基本最简单最方便的动画,自然也是限制最多的一种。它仅能使用几种内置的方式进行变换,包括:平移、缩放、透明度、旋转,没了。允许使用插值器(非线性动画)。 ViewPropertyAnimator 的使用非常简单: view.an