怎么在Android中利用视图绘制流程

  介绍

怎么在Android中利用视图绘制流程?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。

绘制流程

<李>

测量流程测量出观点的宽高尺寸。

<李>

布局流程确定角度的位置及最终尺寸。

<李>

画流程将视图绘制在屏幕上。

测量测量流程

系统是通过MeasureSpec测量的观点,在了解测量过程之前一定要了解这个MeasureSpec。

MeasureSpec

MeasureSpec是一个32位的int值打包而来的,打包为MeasureSpec主要是为了避免过多的对象内存分配。

为了方便操作,MeasureSpec提供了快捷的打包和解包的快捷方法。

<李>

MeasureSpec。makeMeasureSpec (int, int模式)

<李>

MeasureSpec。getMode (int measureSpec)

<李>

measureSpec。getSize (int measureSpec)

measureSpec其中前2位表示测量的模式SpecMode,后边30位表示某种测量模式下的尺寸SpecSize。

measureSpec中有三种测量模式

<李>

不明不指定具体尺寸,完全由视图自己发挥。

<李>

完全精确模式,这种模式下使用后边的SpecSize,一般对应于LayoutParams的match_content和设置的精确尺寸。

<李>

AT_MOST最大模式,这种模式下视图的最大尺寸不能超过后边的SpecSize,一般对应于LayoutParams的wrap_content

在测量视图的时候,系统会将自己的LayoutParams参数在父容器的measureSpec影响下转换为自己的measureSpec,然后再通过这个measureSpec测量自身的宽高。

需要注意的是视图的measureSpec不是唯一由LayoutParams决定的,是在父容器的共同影响下创建来的。

在ViewGroup的measureChild()可以看到具体的实现思路,getChildMeasureSpec()里就是将LayoutParams转换为measureSpec的实现思路。

protected  void  measureChild (View 孩子,int  parentWidthMeasureSpec,   ,,,,,,,int  parentHeightMeasureSpec), {   ,,,,,,,//拿到子元素的,LayoutParams 参数   ,,,final  LayoutParams  lp =, child.getLayoutParams ();      ,,,//创建子元素的,measureSpec    ,,,final  int  childWidthMeasureSpec =, getChildMeasureSpec (parentWidthMeasureSpec,   ,,,,,,,,,,,mPaddingLeft  +, mPaddingRight,, lp.width);   ,,,final  int  childHeightMeasureSpec =, getChildMeasureSpec (parentHeightMeasureSpec,   ,,,,,,,,,,,mPaddingTop  +, mPaddingBottom,, lp.height);      ,,,//将测量传递到子元素   ,,,child.measure (childHeightMeasureSpec childWidthMeasureSpec也);   }      public  static  int  getChildMeasureSpec (int 规范,int 填充、,int  childDimension), {   ,,,//解析父容器的,measureSpec ,解析出模式和尺寸   ,,,int  specMode =, MeasureSpec.getMode(规范);   ,,,int  specSize =, MeasureSpec.getSize(规范);      ,,,int  size =, Math.max (0,, specSize 作用;填充);      ,,,int  resultSize =, 0;   ,,,int  resultMode =, 0;      ,,,switch  (specMode), {   ,,,//,父容器是精确模式的情况,设置了精确尺寸。   ,,,case  MeasureSpec.EXACTLY:   ,,,,,,,if  (childDimension 祝辞=,0),{   ,,,,,,,//子元素本身是设置的精确尺寸,就是EXACTLY 模式,尺寸就是设置的尺寸。   ,,,,,,,,,,,resultSize =, childDimension;   ,,,,,,,,,,,resultMode =, MeasureSpec.EXACTLY;   ,,,,,,,},else  if  (childDimension ==, LayoutParams.MATCH_PARENT), {   ,,,,,,,,,,,//,子元素设置的,match_content 充满入容器,就把尺寸设置为入容器的尺寸,模式设置为完全正确   ,,,,,,,,,,,resultSize =,大小;   ,,,,,,,,,,,resultMode =, MeasureSpec.EXACTLY;   ,,,,,,,},else  if  (childDimension ==, LayoutParams.WRAP_CONTENT), {   ,,,,,,,,,,,//,包裹模式下,子元素可以自己设置尺寸,但是不能超过夫容器的尺寸。模式为AT_MOST,尺寸为父容器的尺寸。   ,,,,,,,,,,,resultSize =,大小;   ,,,,,,,,,,,resultMode =, MeasureSpec.AT_MOST;   ,,,,,,,}   ,,,,,,,休息;      ,,,//父容器是最大模式   ,,,case  MeasureSpec.AT_MOST:   ,,,,,,,if  (childDimension 祝辞=,0),{   ,,,,,,,,,,,//,设置为子元素的尺寸,为精确模式   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null

怎么在Android中利用视图绘制流程