Java
MeasureSpec经由过程将SpecMode和SpecSize打包成一个int值来避免过多的对象内存分派,并供给了打包和解包的办法。
SpecMode有三种类型,每一类都表示特别的含义:
UNSPECIFIED
父容器纰谬View有任何限制,要多大年夜就给多大年夜,这种情况一般用于体系内部,表示一种测量的状况;
EXACTLY
父容器已经检测出View所需的精确大年夜小,这个时刻View的最终清除就是SpecSize所指定的值。它对应于LayoutParams中的match_parent和具体数置魅这两种模式。
AT_MOST
父容器指定了一个可用大年夜小即SpecSize,View的大年夜小不克不及大年夜于这个值,具体是什么值要看不合View的具体实现。它对应于LayoutParams中wrap_content。
View的MeasureSpec是由父容器的MeasureSpec和本身的LayoutParams决定的,然则对于DecorView来说有点不合,因为它没有父类。在ViewRootImpl中的measureHierarchy办法中有如下一段代码展示了DecorView的MeasureSpec的创建过程,个中desiredWindowWidth和desireWindowHeight是屏幕的尺寸大年夜小:
ViewGroup的measure
- childWidthMeasureSpec = getRootMeasureSpec(desiredWindowWidth, lp.width);
- childHeightMeasureSpec = getRootMeasureSpec(desiredWindowHeight, lp.height);
- performMeasure(childWidthMeasureSpec, childHeightMeasureSpec);
Java
再看看getRootMeasureSpec办法:
- private static int getRootMeasureSpec(int windowSize, int rootDimension) {
- int measureSpec;
- switch (rootDimension) {
- case ViewGroup.LayoutParams.MATCH_PARENT:
- // Window can't resize. Force root view to be windowSize.
- measureSpec = MeasureSpec.makeMeasureSpec(windowSize, MeasureSpec.EXACTLY);
- break;
- case ViewGroup.LayoutParams.WRAP_CONTENT:
- // Window can resize. Set max size for root
推荐阅读
在处理矢量化数据时,记录中往往话苄很多反复数据,对进一步数据处理带来诸多不便。多余的数据一方面浪费了较多的存储空间,另一方面造成所要表达的图形不但滑或不相符标准。是以要经由过程某种规矩,在包管矢量曲线>>>详细阅读
本文标题:Android View绘制的三大流程
地址:http://www.17bianji.com/lsqh/36843.html
1/2 1

网友点评
精彩导读
科技快报
品牌展示