码迷,mamicode.com
首页 > 其他好文 > 详细

viewgroup绘制流程

时间:2019-11-16 11:09:38      阅读:83      评论:0      收藏:0      [点我收藏+]

标签:ondraw   boolean   params   分类   amp   自定义   获取   控件   The   

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绘制流程

标签:ondraw   boolean   params   分类   amp   自定义   获取   控件   The   

原文地址:https://www.cnblogs.com/acg88688/p/11870590.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!