二、Android View 的绘制流程

Android UI 管理系统层级关系


微信图片_20180921161117.png

其中PhoneWindow 是android 系统中最基本的窗口系统,每个Activity 都会创建一个。PhoneWindow 是 Activity和View系统交互的接口。

DecorView 本质上是一个FramLayout,是Activity中所有View 的祖先。

A、绘制的整体流程

注:绘制会从根视图ViewRoot 的 performTraversals()方法开始,从上到下遍历整个视图树,
每个View控件负责绘制自己,而ViewGroup还需要负责通知自己的子view进行绘制操作。
视图绘制的三个步骤:分别是测量(Measure)、布局(Layout)、绘制(Draw).

在源码中performTraversals()方法

      //执行测量流程
     performMeasure()
     //执行布局流程
      performLayout
      //执行绘制流程
      performDraw();

B、MeasureSpec

MeasureSpec 表示的是一个32位的整型值,他的高2位表示测量模式SpecMode,低30位表示某种测量模式下的规格大小SpecSize.MeasureSepc是View 类的一个静态内部类,用来说明应该如何测量

源码:中测量模式

微信图片_20180921161408.png

C、Measure

Measure 操作用来计算view的实际大小,由前面的分析可知,页面的测量流程是从performMeasure方法开始的,核心代码:

/**childWidthMeasureSpec 宽量规范
* childHeightMeadureSpec 高的测量规范
*/
private void performMeasure(int childWidthMeasureSpec,int childHeightMeadureSpec){
...
mView.measure(childWidthMeasureSpec,childHeightMeadureSpec);
...
}

可以看到,具体测量是分给ViewGroup的。由ViewGroup在他的measureChild方法中传递给子view,代码如下:

ViewGroup通过遍历自身中所有的子view ,并逐个调用子view

/**绘制分为6个步骤*/
//第一步:绘制view 背景
drawBackground(00);
//第二部 ,如果取药的话,保存canvas的图层,为fading做准备
canvas.getSaveCount();
canvas.saveLayerAlpha(0,0,0,0,null,0);
//第三步:绘制View内容

draw(canvas);
//第三四:绘制View的子View
dispatchDraw(canvas);
//第五步 :如果有需要的话,绘制View 的fading 边缘并恢复图层
//canvas.drawRect(left,top,right,bootom,p);
canvas.restoreToCount(saveCount);
//第六步:绘制View的装饰
onDrawScrollBars(canvas);
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容