viewgroup绘制流程

Posted acg88688

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了viewgroup绘制流程相关的知识,希望对你有一定的参考价值。

view 与 ViewGroup绘制流程基本相同,在ViewGroup中不仅要绘制自己,还需绘制其中的子控件,而view只需绘制自己。

view绘制流程:测量,布局,绘制

  1. onMeasure() : 测量当前控件的大小,为正式布局提供建议   (仅是建议,用不用要看onLayout() 函数)
  2. onLayout() : 使用Layout()函数为所有子控件进行布局
  3. onDraw():根据布局的位置绘图

onMeasure(int widthMeasureSpec , int heightMeasureSpec):

MeasureSpec  前2位代表模式,后30位代表数值(size)

模式分类:

  1. 00   USPECIFIED(未指定):父元素不对子元素施加任何束缚,子元素可以得到任意想要大小
  2. 01    EXACTLY(完全):父元素决定了子元素确切的大小,子元素将被限定在给定的边界里 而忽略自身大小
  3. 10    AT_MOST(至多):子元素最多达到指定大小的值

onLayout(boolean changed, int l, int t, int r, int b)

onLayout() 是实现所有子控件布局的函数        那么,关于自己的layout呢?    它自己是由自己的父控件完成的 ,,,在layout中使用setFrame设置自己的位置, 设置完再调onLayout来设置自己的子控件

onLayout()中使用child.layout(0, top, chidWidth, top+ chidHeight) 来确定子控件的位置

 

getWidth() 和 getMeasureWidth() 的区别:

  1. getMeasureWidth()在Measure过程结束就可以得到 宽度值 ,,      getWidth() 要在layout()结束之后才可以得到
  2. getMeasureWidth() 通过 setMeasureDimension() 函数进行设置,,      getWidth() 通过 layout(left, top, right, bottom) 来设置
  3. getWidth 和 getMeasureWidth  一般是一样,但是,当layout方法传入的值与getMeasureWidth不同时,getWidth 和 getMeasureWidth 的返回值就不一样了           getWidth拿的是layout的,getMeasureWidth是Measure的

获取子控件margin值的方法

如果想要自定义的ViewGroup可以支持layout_margin参数,则自定义的ViewGroup类必须重写generateLayoutParams() &&  generateDefaultLayoutParams函数,并在该函数返回一个ViewGroup.MarginLayoutParams派生类对象。

为什么要重写generateLayoutParams()?????

因为默认的generateLayoutParams() 只会提取layout_width 和 layout_height 的值,  只有MarginLayoutParams()函数才具有提取margin值的能力。因此重写generateLayoutParams() 来返回 MarginLayoutParams() 获取margin值。

 

 

 

以上是关于viewgroup绘制流程的主要内容,如果未能解决你的问题,请参考以下文章

Android - View 绘制流程

View的绘制流程源码分析

自定义View_1_关于View,ViewGroup的测量和绘制流程

android基础-viewgroup的测量,布局,绘制

View的绘制流程

Android面试收集录12 View测量布局及绘制原理