Android中View的绘制流程
---
title: View的绘制流程
config:
theme: base
themeVariables:
primaryColor: "#dae8fc"
primaryTextColor: '#000'
primaryBorderColor: '#000'
secondaryColor: '#dae8fc'
fontSize: '28px'
---
sequenceDiagram
autonumber
%% ZygoteServer
participant wm as WindowManagerImpl
participant wmg as WindowManagerGlobal
participant root as ViewRootImpl
participant SS as Session
participant wms as WindowManagerService
participant view as View
participant viewgroup as ViewGroup
wm ->> wmg:addView
wmg ->> root: setView
root ->> root: setView
root ->> root: requestLayout
root ->> root: scheduleTraversals
root ->> SS: addToDisplayAsUser
Note right of root: 第一步addWindow
SS ->> wms: addWindow
root ->> root: doTraversal
root ->> root: performTraversals
root ->> root: relayoutWindow
Note right of root: 第二步relayoutWindow
root ->> root: performMeasure
root ->> view: measure
view ->> view: onMeasure
root ->> root: performLayout
root ->> view: layout
view ->> view: onLayout
root ->> root: performDraw
root ->> root: draw
root ->> root: drawSoftware
root ->> +view: draw
view ->> view: onDraw
view ->> +viewgroup: dispatchDraw
viewgroup ->> viewgroup: drawChild
viewgroup ->> -view: draw
Note right of view: child.draw
view -->> -root: return
root ->> root: createSyncIfNeeded
Android中Window相关类的关系
classDiagram
ViewManager <|-- WindowManager:继承
WindowManager <|.. WindowManagerImpl:实现
Window <|-- PhoneWindow:继承
WindowManager <-- Window:关联
WindowManagerGlobal <-- WindowManagerImpl:关联
class ViewManager{
<<interface>>
+addView()
+updateViewLayout()
+removeView()
}
class WindowManager{
<<interface>>
}
class Window{
-WindowManager mWindowManager
}
class PhoneWindow{
}
class WindowManagerImpl{
-WindowManagerGlobal mGlobal
}
class WindowManagerGlobal{
}
public interface ViewManager {
public void addView(...);
public void updateViewLayout(...);
public void removeView(...);
}
public interface WindowManager extends ViewManager { ... }
public final class WindowManagerImpl implements WindowManager {
private final WindowManagerGlobal mGlobal = WindowManagerGlobal.getInstance();
}
public final class WindowManagerGlobal { ... }
public abstract class Window {
private WindowManager mWindowManager;
}
public class PhoneWindow extends Window { ... }
UML类图(继承、实现、依赖、关联、组合、聚合)
classDiagram
%% 1.继承
classB父类 <|-- classA子类: Inheritance
%% 2.实现
classN接口类 <|.. classM实现类: Realization
%% 3.依赖
classL被依赖类 <.. classK引用类: Dependency
%% 4.关联
classH被引用类 <-- classG引用类: Association
%% 5.组合
classD整体类 *-- classC部分类: Composition
%% 6.聚合
classF整体类 o-- classE部分类: Aggregation
1. 继承
「继承」 是面向对象语言的三大特性(封装,继承,多态)之一。子类继承父类。
---
title: Animal example
---
classDiagram
Animal <|-- Dog:继承
Animal <|-- Bird:继承
Animal : +int age
Animal : +eat()
class Dog{
+run()
}
class Bird{
+fly()
}
java源码如下:
public class Animal {
int age;
public void eat() {
// do sth
}
}
public class Dog extends Animal {
public void run() {
// do sth
}
}
public class Bird extends Animal {
public void fly() {
// do sth
}
}
2. 实现
「实现」 与继承类似,实现类继承接口中的方法。
---
title: Shape example
---
classDiagram
Shape <|.. Rectangle:实现
note for Shape "这是Shape\n的备注"
class Shape{
<<interface>>
draw()
}
class Rectangle{
+draw()
}
java源码如下:
public interface Shape {
void draw();
}
public class Rectangle implements Shape {
@Override
public void draw() {
// do sth
}
}
3. 依赖
「依赖」 关系体现为局部变量、方法的形参,或者对静态方法的调用。
---
title: Programmer example
---
classDiagram
%% This whole line is a comment classDiagram class Shape <<interface>>
Computer <.. Programmer:依赖
class Programmer{
+work()
}
class Computer{
}
java源码如下:
public class Programmer {
public void work(Computer computer) {
// do sth
}
}
4. 关联
「依赖」通常表现为类的私有属性。
---
title: Shape example
---
classDiagram
%% This whole line is a comment classDiagram class Shape <<interface>>
Climate <-- Penguin:关联
class Penguin{
}
class Climate{
}
java源码如下:
// 企鹅类
public class Penguin {
// 天气类
private Climate climate;
}
5. 组合
「组合」 是关联关系的一种,表示一种强的“拥有”关系。体现了严格的部分和整体的关系。部分和整体的生命周期一样。
---
title: Wing example
---
classDiagram
Bird *-- Wing:组合
class Bird{
}
class Wing{
}
java源码如下:
public class Bird {
private Wing wing;
public Bird() {
this.wing = new Wing();
}
}
6. 聚合
「聚合」 是关联关系的一种,表示一种弱的“拥有”关系。 如大雁是群居动物,每只大雁都属于一个雁群,一个雁群可以有多只大雁。
---
title: WildGooseAggregate example
---
classDiagram
WildGooseAggregate o-- WildGoose:聚合
class WildGooseAggregate{
}
class WildGoose{
}
java源码如下:
public class WildGooseAggregate {
private List<WildGoose> wideGooses;
}