Android中View的绘制流程

106 阅读1分钟

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;
}