View 的事件分发

事件分发的伪代码

1
2
3
4
5
6
7
8
9
10
11
12
13
boolean dispatchTouchEvent(MomentEvent ev){
boolean consume = false;
if(onInterceptTouchEvent(ev)){
//该 View 进行拦截
consume = onTouchEvent(ev);
}else{
consume = child.dispatchTouchEvent(ev);
}

returen consume;

}

阅读更多

Android Apk 签名机制

META-INF/CERT.RSA 是 apk 文件的证书

  • 检查 apk 文件中 META-INF/CERT.RSA 证书的指纹信息

keytool -printcert -file xxxx

阅读更多

Canvas 笔记

Path

  • arcTo 方法
    在 path 中的arcTo()方法只画弧形,不画扇形,所以没有 useCenter 这个参数
    其中的 arcTo(float left, float top, float right, float bottom, float startAngle,float sweepAngle, boolean forceMoveTo) 中的最后一个参数代表是否将画笔抬起,即强制将画笔的移到圆弧的起点再开始进行绘制

  • addArc() 方法
    这个方法与上一个方法的区别在于没有 forceMoveTo 这个参数,实际上等同于 arcTo(...,true) 方法

阅读更多

解决 Gradle 依赖冲突

版本冲突

当依赖两个库时,这两个库(A,B)中又同时依赖于另一个库(C),如果这个时候 A,B 中依赖的 C 库版本不同,Gradle 会自动使用最新的版本,比如

1
2
3
4
5
dependencies {
androidTestCompile('com.android.support.test:runner:0.4')
androidTestCompile('com.android.support.test:rules:0.2')
androidTestCompile('com.android.support.test.espresso:espresso-core:2.1')
}
阅读更多

Kotlin 中的懒加载 lazy

两者都是 Kotlin 中用来延迟加载类属性的方法

lateinit var 不能用来修饰基本类型,因为 Kotlin 中用来判断变量是否初始化是通过判断该变量是否为 null 来作为依据的,而基本类型在初始化的时候会默认赋值,所以 lateinit var 不能修饰基本类型

阅读更多

去除 Apk 中的重复资源文件

在 Android Apk 包体积治理的项目中,对于资源文件的治理是其中很重要的一部分,其中,做好前期的压缩删除等工作是前提条件,但在后续的开发迭代过程中,如何进行长期的治理、预警和自动化,是值得深入探讨的问题

在包体积治理的过程中,我们知道对于 apk 的组成,其中资源文件占了很大的一部分,需要对其进行处理

阅读更多

ViewModel 原理

ViewModel 类旨在以注重生命周期的方式存储和管理界面相关的数据。ViewModel 类让数据可在发生屏幕旋转等配置更改后继续留存。

如何使用

1
private val viewModel = ViewModelProvider(this).get(MyCustomViewModeClass::class.java)
阅读更多

Java 并发编程之 ReentrantLock


ReentrantLock,可重入锁,基于 AQS 的机制,实现了公平锁和非公平锁,给开发者提供了一个更为灵活的锁实现,既然是个锁,ReentrantLock 也实现了 Lock 接口

阅读更多

Java 并发编程之 AQS


AQS,全称为 AbstractQueuedSynchronizer,是 JUC 包中的一个抽象类,为开发者提供了编写同步锁的机制
其中封装了 FIFO(first in first out) 的队列

阅读更多