Skip to content

Fix broken headings in Markdown files #66

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 1 commit into from
Apr 18, 2017
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 6 additions & 6 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -8,16 +8,16 @@ Android 开源项目源码解析

**在线网站:[www.codekk.com](http://a.codekk.com)**

###1. 如何加入
### 1. 如何加入
以`你想分析的开源库库名`作为验证信息,申请加入 QQ 群(485334692)即可

###2. 具体编写步骤
### 2. 具体编写步骤
具体步骤请见:[编写步骤](./zen/procedure.md)

###3. 开源项目源码分析
### 3. 开源项目源码分析
目前参与者 [Author](author.md)

####3.2 第二期成果
#### 3.2 第二期成果

分析文档 | 作者
:------------- | :-------------
Expand All @@ -34,7 +34,7 @@ Android 开源项目源码解析
[公共技术点之 Android 动画基础](http://a.codekk.com/detail/Android/lightSky/%E5%85%AC%E5%85%B1%E6%8A%80%E6%9C%AF%E7%82%B9%E4%B9%8B%20Android%20%E5%8A%A8%E7%94%BB%E5%9F%BA%E7%A1%80) | [lightSky](https://github.com/lightSky)
[公共技术点之 Java 反射](http://a.codekk.com/detail/Android/Mr.Simple/%E5%85%AC%E5%85%B1%E6%8A%80%E6%9C%AF%E7%82%B9%E4%B9%8B%20Java%20%E5%8F%8D%E5%B0%84%20Reflection) | [Mr.Simple](https://github.com/bboyfeiyu)

####3.2 第一期成果
#### 3.2 第一期成果

分析文档 | 作者
:------------- | :-------------
Expand All @@ -54,7 +54,7 @@ Android 开源项目源码解析
[公共技术点之依赖注入](http://a.codekk.com/detail/Android/%E6%89%94%E7%89%A9%E7%BA%BF/%E5%85%AC%E5%85%B1%E6%8A%80%E6%9C%AF%E7%82%B9%E4%B9%8B%E4%BE%9D%E8%B5%96%E6%B3%A8%E5%85%A5) | [扔物线](https://github.com/rengwuxian)
[公共技术点之 View 事件传递](http://a.codekk.com/detail/Android/Trinea/%E5%85%AC%E5%85%B1%E6%8A%80%E6%9C%AF%E7%82%B9%E4%B9%8B%20View%20%E4%BA%8B%E4%BB%B6%E4%BC%A0%E9%80%92) | [Trinea](https://github.com/Trinea)

###4 加入我们
### 4 加入我们
- 如果你在用各种开源库
- 如果你有兴趣去深挖它们优雅的实现
- 如果你希望知其然知其所以然提高自己
Expand Down
4 changes: 2 additions & 2 deletions tech/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,10 +4,10 @@

大家可直接按下面规范添加或修改已有技术点,并在群里通知下其他人。

####添加规范
#### 添加规范
以技术点英文名新建文件夹,并新建 README.md 介绍相关技术点,然后在下面列表添加链接。

####技术点列表
#### 技术点列表
技术点 | 作者
:-- |:--
[依赖注入](./dependency-injection) | [扔物线](https://github.com/rengwuxian)
Expand Down
18 changes: 9 additions & 9 deletions tech/animation/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
> 本文为 [Android 开源项目源码解析](http://a.codekk.com) 公共技术点中的 Android 动画基础 部分
分析者:[lightSky](https://github.com/lightSky),校对者:[Trinea](https://github.com/Trinea),校对状态:未完成

###一 传统 View 动画(Tween/Frame)
### 一 传统 View 动画(Tween/Frame)

#### 1.1 Tween 动画##

Expand Down Expand Up @@ -258,14 +258,14 @@ rocketAnimation.start();

### 二. Property Animation

####2.1 Property Animation 的工作方式
#### 2.1 Property Animation 的工作方式

Property Animation 动画有两个步聚:
1.计算属性值
2.为目标对象的属性设置属性值,即应用和刷新动画


####2.1.1 计算属性值
#### 2.1.1 计算属性值

![属性值计算](./image/valuecaculate.png)

Expand All @@ -283,7 +283,7 @@ Property Animation 动画有两个步聚:

![属性动画类继承关系](./image/propertyanimhirachy.png)

####2.2.1 Interpolators
#### 2.2.1 Interpolators

插值器:时间的函数,定义了动画的变化律。
插值器只需实现一个方法:`getInterpolation(float input)`,其作用就是把 0 到 1 的 elapsed fraction 变化映射到另一个 interpolated fraction。 Interpolator 接口的直接继承自`TimeInterpolator`,内部没有任何方法,而`TimeInterpolator`只有一个`getInterpolation`方法,所以所有的插值器只需实现`getInterpolation`方法即可。
Expand Down Expand Up @@ -333,7 +333,7 @@ animation.setInterpolator(new CycleInterpolator(3));
animation.start();
```

####2.2.4 ObjectAnimator
#### 2.2.4 ObjectAnimator
继承自`ValueAnimator`,允许你指定要进行动画的对象以及该对象的一个属性。该类会根据计算得到的新值自动更新属性。也就是说上 Property Animation 的两个步骤都实现了。大多数的情况,你使用`ObjectAnimator`就足够了,因为它使得目标对象动画值的处理过程变得简单,不用再向`ValueAnimator`那样自己写动画更新的逻辑。但`ObjectAnimator`有一定的限制,比如它需要目标对象的属性提供指定的处理方法,这个时候你需要根据自己的需求在`ObjectAnimator`和`ValueAnimator`中做个选择了,看哪种实现更简便。

`ObjectAnimator`的自动更新功能,依赖于属性身上的`setter`和`getter`方法,所以为了让`ObjectAnimator`能够正确的更新属性值,你必须遵从以下规范:
Expand All @@ -358,7 +358,7 @@ ObjectAnimator.ofFloat(targetObject, "propName", 1f)
当你不希望向外暴露`Setter`方法的时候,或者希望获取到动画值统一做处理的话,亦或只需要一个简单的时序机制(拥有动画的各种值)的话,那么你可以选择使用`ValueAnimator`,它更简单。如果你就是希望更新动画,为了简便,可以使用`ObjectAnimator`,但自定义的属性必须有`setter`和`getter`方法,并且它们必须都是标准的驼峰式(确保内部能够调用),必须有结束值。你可以实现`Animator.AnimatorListener`接口根据自己的需求去更新 View。


####2.2.5 AnimatorSet
#### 2.2.5 AnimatorSet
提供组合动画能力的类。并可设置组中动画的时序关系,如同时播放、有序播放或延迟播放。`Elevator`会告诉属性动画系统如何计算一个属性的值,它们会从`Animator`类中获取时序数据,比如开始和结束值,并依据这些数据计算动画的属性值。

**小结:**
Expand Down Expand Up @@ -611,15 +611,15 @@ set.setTarget(myObject);
set.start();
```

###三 View anim 与 property anim 的比较
### 三 View anim 与 property anim 的比较

####View anim 系统
#### View anim 系统
view animation system 提供的能力只能够为 View 添加动画。因此如果你想为非 View 对象添加动画,就必须自己去实现,
view animation system 在 View 动画的展现方面也是有约束的,只暴露了 View 的很少方面。比如 View 支持缩放和旋转,但不支持背景颜色的动画。
view animation system 的另一劣势是,其改变的是 View 的绘制效果,真正的 View 的属性保持不变,比如无论你在对话中如何缩放 Button 的大小,Button 的有效点击区域还是没有应用到动画时的区域,其位置与大小都不变。
但是 View animation system 只需花费很少时间创建而且只需很少的代码。如果 View 动画完成了你所有的动作,或者你存在的代码已经达到了你想要的效果,就没必要使用 property 动画系统了。

####property anim 系统
#### property anim 系统
完全弥补了 View anim System 的缺陷,你可以为一个对象的任何属性添加动画,(View 或者非 View),同时对象自己也会被修改。
并且当属性变化的时候,property Anim 系统会自动的刷新屏幕。
属性动画系统在处理动画方面也更加强劲。更高级的,你可以指定动画的属性,比如颜色,位置,大小,定义动画的插值器并且同步多个动画。
Expand Down
6 changes: 3 additions & 3 deletions tech/dependency-injection/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
> 本文为 [Android 开源项目源码解析](http://a.codekk.com) 公共技术点中的 依赖注入 部分
分析者:[扔物线](https://github.com/rengwuxian),校对者:[Trinea](https://github.com/Trinea),校对状态:完成

###1. 依赖
### 1. 依赖
如果在 Class A 中,有 Class B 的实例,则称 Class A 对 Class B 有一个依赖。例如下面类 Human 中用到一个 Father 对象,我们就说类 Human 对类 Father 有一个依赖。

```java
Expand All @@ -21,7 +21,7 @@ public class Human {
(2). 如果想测试不同 Father 对象对 Human 的影响很困难,因为 father 的初始化被写死在了 Human 的构造函数中;
(3). 如果`new Father()`过程非常缓慢,单测时我们希望用已经初始化好的 father 对象 Mock 掉这个过程也很困难。

###2. 依赖注入
### 2. 依赖注入
上面将依赖在构造函数中直接初始化是一种 Hard init 方式,弊端在于两个类不够独立,不方便测试。我们还有另外一种 Init 方式,如下:

```java
Expand All @@ -40,7 +40,7 @@ public class Human {
(1). 解耦,将依赖之间解耦。
(2). 因为已经解耦,所以方便做单元测试,尤其是 Mock 测试。

###3. Java 中的依赖注入
### 3. Java 中的依赖注入

依赖注入的实现有多种途径,而在 Java 中,使用注解是最常用的。通过在字段的声明前添加 @Inject 注解进行标记,来实现依赖对象的自动注入。

Expand Down
12 changes: 6 additions & 6 deletions tech/minutiae/minutiae.md
Original file line number Diff line number Diff line change
Expand Up @@ -3,16 +3,16 @@ Android 开源项目源码解析细节点
> 本文为 [Android 开源项目源码解析](http://a.codekk.com) 中 细节点 部分
> 分析者:[Trinea](https://github.com/trinea),校对者:[Trinea](https://github.com/trinea),校对状态:未完成

###1. Volley 细节点
####(1) HttpURLConnection 与 HttpClient
### 1. Volley 细节点
#### (1) HttpURLConnection 与 HttpClient

###2. Android Universal Image Loader 细节点
####(1) FlushedInputStream.java
### 2. Android Universal Image Loader 细节点
#### (1) FlushedInputStream.java
为了解决早期 Android 版本`BitmapFactory.decodeStream(…)`在慢网络情况下 decode image 异常的 Bug。
主要通过重写`FilterInputStream`的 skip(long n) 函数解决,确保 skip(long n) 始终跳过了 n 个字节。如果返回结果即跳过的字节数小于 n,则不断循环直到 skip(long n) 跳过 n 字节或到达文件尾。
见:http://code.google.com/p/android/issues/detail?id=6066

###(2). BaseImageDownloader.getStreamFromNetwork(String imageUri, Object extra)
### (2). BaseImageDownloader.getStreamFromNetwork(String imageUri, Object extra)
通过`HttpURLConnection`从网络获取图片的`InputStream`。支持 response code 为 3xx 的重定向。这里有个小细节代码如下:
```java
try {
Expand All @@ -26,7 +26,7 @@ try {
在发生异常时会调用`conn.getErrorStream()`继续读取 Error Stream,这是为了利于网络连接回收及复用。但有意思的是在 Froyo(2.2) 之前,HttpURLConnection 有个重大 Bug,调用 close() 函数会影响连接池,导致连接复用失效,不少库通过在 2.3 之前使用 AndroidHttpClient 解决这个问题。
见:http://docs.oracle.com/javase/6/docs/technotes/guides/net/http-keepalive.html

####(3). ViewAware.ViewAware(View view, boolean checkActualViewSize)
#### (3). ViewAware.ViewAware(View view, boolean checkActualViewSize)
构造函数。
`view`表示需要显示图片的对象。
`checkActualViewSize`表示通过`getWidth()`和`getHeight()`获取图片宽高时返回真实的宽和高,还是`LayoutParams`的宽高,true 表示返回真实宽和高。
Expand Down
10 changes: 5 additions & 5 deletions tech/viewdrawflow/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
分析者:[lightSky](https://github.com/lightSky)

#### View 绘制机制
#####1. View 树的绘图流程
##### 1. View 树的绘图流程
当 Activity 接收到焦点的时候,它会被请求绘制布局,该请求由 Android framework 处理.绘制是从根节点开始,对布局树进行 measure 和 draw。整个 View 树的绘图流程在`ViewRoot.java`类的`performTraversals()`函数展开,该函数所做 的工作可简单概况为是否需要重新计算视图大小(measure)、是否需要重新安置视图的位置(layout)、以及是否需要重绘(draw),流程图如下:
![viewdrawflow img](image/view_mechanism_flow.png)

Expand All @@ -13,7 +13,7 @@
图片来自 https://plus.google.com/+ArpitMathur/posts/cT1EuBbxEgN
需要说明的是,用户主动调用 request,只会出发 measure 和 layout 过程,而不会执行 draw 过程

#####2. 概念
##### 2. 概念

**measure 和 layout**

Expand Down Expand Up @@ -52,7 +52,7 @@ MeasureSpecs
- AT_MOST
父视图为子视图指定一个最大尺寸。子视图必须确保它自己所有子视图可以适应在该尺寸范围内,对应的属性为 wrap_content,这种模式下,父控件无法确定子 View 的尺寸,只能由子控件自己根据需求去计算自己的尺寸,这种模式就是我们自定义视图需要实现测量逻辑的情况。

#####3. measure 核心方法
##### 3. measure 核心方法
- measure(int widthMeasureSpec, int heightMeasureSpec)
该方法定义在`View.java`类中,为 final 类型,不可被复写,但 measure 调用链最终会回调 View/ViewGroup 对象的 `onMeasure()`方法,因此自定义视图时,只需要复写 `onMeasure()` 方法即可。

Expand Down Expand Up @@ -142,7 +142,7 @@ MeasureChild 的方法调用流程图:
```


#####4. layout 相关概念及核心方法
##### 4. layout 相关概念及核心方法
首先要明确的是,子视图的具体位置都是相对于父视图而言的。View 的 onLayout 方法为空实现,而 ViewGroup 的 onLayout 为 abstract 的,因此,如果自定义的 View 要继承 ViewGroup 时,必须实现 onLayout 函数。

在 layout 过程中,子视图会调用`getMeasuredWidth()`和`getMeasuredHeight()`方法获取到 measure 过程得到的 mMeasuredWidth 和 mMeasuredHeight,作为自己的 width 和 height。然后调用每一个子视图的`layout(l, t, r, b)`函数,来确定每个子视图在父视图中的位置。
Expand Down Expand Up @@ -195,7 +195,7 @@ MeasureChild 的方法调用流程图:
...
}
```
#####5. 绘制流程相关概念及核心方法
##### 5. 绘制流程相关概念及核心方法
先来看下与 draw 过程相关的函数:

- View.draw(Canvas canvas):
Expand Down
2 changes: 1 addition & 1 deletion tool-lib/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ Android 开源项目源码解析 Tool 部分

对于自定义控件及完整 App 解析放到 [view](../view)、[app](../app) 文件夹合适子文件夹内。

###1. 文件夹与相关工具库对应关系如下
### 1. 文件夹与相关工具库对应关系如下

文件夹名 | 相关 View
:------------- | :-------------
Expand Down
Loading