自定义View---widthMeasureSpec和heightMeasureSpec是从哪来?

周末等Typhoon。。。还是放鸽子了,吃屎的有关部门

首先了解一下Android界面的绘制过程:

自定义View---widthMeasureSpec和heightMeasureSpec是从哪来?_第1张图片

整体流程(别人的图,就不画了,转载一下)
自定义View---widthMeasureSpec和heightMeasureSpec是从哪来?_第2张图片

自定义View---widthMeasureSpec和heightMeasureSpec是从哪来?_第3张图片

widthMeasureSpec和heightMeasureSpec是从哪来?

是从其父View传递过来的
那么它的父View的这两个参数又是从哪来,这样一步一步我们就需要知道View绘制的时候是从这开始的,其实担任此重任的是ViewRootImpl,绘制开始是从ViewRootImpl中的performTraversals()这个方法开始的

自定义View---widthMeasureSpec和heightMeasureSpec是从哪来?_第4张图片

MeasureSpec

measurespec封装了父类传递给子类的测量要求,每个measurespec代表宽度或者高度的要求以及大小,也就是说一个measurespec包含size和mode。它有三种mode(模式)

①UNSPECIFIED:父View没有对子View施加任何约束。它可以是任何它想要的大小。
②EXACTLY:父View已经确定了子View的确切尺寸。子View将被限制在给定的界限内,而忽略其本身的大小。
③AT_MOST:子View的大小不能超过指定的大小

三个主要的方法:

①getMode(imeasureSpec)它的作用就是根据规格提取出mode,这里的mode是上面的三种模式之一
②getSize(int measureSpec)它的作用就是根据规格提取出size,这里的size就是我们所说的大小
③makeMeasureSpec(int size, int mode)根据size和mode,创建一个测量要求。

具体源码分析见原文对MeasureSpec的介绍

总结图:
自定义View---widthMeasureSpec和heightMeasureSpec是从哪来?_第5张图片

参考:
http://blog.csdn.net/dmk877/article/details/49558367

你可能感兴趣的:(Android)