02 View的绘制

作者: 凤邪摩羯 | 来源:发表于2020-09-24 08:59 被阅读0次

1 View树的绘制流程是谁负责的?

view树的绘制流程是通过ViewRootImpl去负责绘制的,ViewRoot这个类的命名有点坑,最初看到这个名字,翻译过来是view的根节点,但是事实完全不是这样,ViewRoot其实不是View的根节点,它连view节点都算不上,它的主要作用是View树的管理者,负责将DecorView和PhoneWindow“组合”起来,而View树的根节点严格意义上来说只有DecorView;每个DecorView都有一个ViewRoot与之关联,这种关联关系是由WindowManager去进行管理的;


image.png

2 view的添加(创建)

image.png

3 view的绘制流程

*viewRootImpl.performTraversals()方法执行三大流程

image.png

(一)View的初始化
https://www.jianshu.com/p/003dc36af9db

(二) 绘制的准备
https://www.jianshu.com/p/2f4e7e9e5cc0

(三) onMeasure

  1. 系统为什么要有measure过程?
    view控件的宽高,在Android中有三种配置方式(具体值,match_parent,wrap_content),在view嵌套的时候,父控件和子控件的不同配置组合后,产生的实际结果不同,所有需要通过不断测量来计算出最终在屏幕上显示的宽高.

  2. measure过程都干了点什么事?
    由于Android有自适应尺寸机制,这样view的尺寸不好确定,通过测量view各种尺寸经过计算后换成在屏幕中显示的像素大小

image.png

1) 上图第1列分析:
DecorView本身没有measure方法,他继承自FrameLayout,FrameLayout继承自ViewGroup,ViewGroup继承自VIew,所以实际上调用的是view的measure方法

2) 上图第2列分析:
调用的是view的measure方法后,走DecorView的onMeasure方法,从而调用FrameLayout的onMeasure方法,然后通过调用measureChildWithMargins方法,该方法中通过getChildMeasureSpec方法获取参数,然后子view调用measure方法。当然measure方法可能会调用多次,因为布局的嵌套。到这里DecorView层的measure分析完了。

3) 上图第3列分析:
第三列对应我们调用的的setContentView(R.layout.xxxlinerlayout);方法,这里面以根布局为LinerLayout为例,进行后续的measure. LinearLayout会先根据mOrientation的横向排版还是竖直排版顺序,进行两个方向的测量。因为LinearLayout这个ViewGroup实际上就是把所有的子View按照横竖两个方向进行布局,最后的子view.layout,view如果是ViewGroup还需要重复该过程

onMeasure()方法中常用的方法:

  1. getChildCount():获取子View的数量;

  2. getChildAt(i):获取第i个子控件;

  3. subView.getLayoutParams().width/height:设置或获取子控件的宽或高;

  4. measureChild(child, widthMeasureSpec, heightMeasureSpec):测量子View的宽高;

  5. child.getMeasuredHeight/width():执行完measureChild()方法后就可以通过这种方式获取子View的宽高值;

  6. getPaddingLeft/Right/Top/Bottom():获取控件的四周内边距;

  7. setMeasuredDimension(width, height):重新设置控件的宽高

https://www.jianshu.com/p/4f8b5c559311

(四) onLayout

  1. 系统为什么要有layout过程?

  2. layout过程都干了点什么事?


    image.png

https://www.jianshu.com/p/577afa53ce97

  • 上图省略了addview到viewRootImpl.performTraversals()的过程

(五) onDraw

  1. 系统为什么要有draw过程?

  2. draw过程都干了点什么事?


    image.png

https://www.jianshu.com/p/a4fb6a02ad53

(六) 硬件渲染(上)
https://www.jianshu.com/p/c84bfa909810

(七) 硬件渲染(下)
https://www.jianshu.com/p/4854d9fcc55e

相关文章

网友评论

    本文标题:02 View的绘制

    本文链接:https://www.haomeiwen.com/subject/toljyktx.html