viewgroup绘制流程
Posted acg88688
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了viewgroup绘制流程相关的知识,希望对你有一定的参考价值。
view 与 ViewGroup绘制流程基本相同,在ViewGroup中不仅要绘制自己,还需绘制其中的子控件,而view只需绘制自己。
view绘制流程:测量,布局,绘制
- onMeasure() : 测量当前控件的大小,为正式布局提供建议 (仅是建议,用不用要看onLayout() 函数)
- onLayout() : 使用Layout()函数为所有子控件进行布局
- onDraw():根据布局的位置绘图
onMeasure(int widthMeasureSpec , int heightMeasureSpec):
MeasureSpec 前2位代表模式,后30位代表数值(size)
模式分类:
- 00 USPECIFIED(未指定):父元素不对子元素施加任何束缚,子元素可以得到任意想要大小
- 01 EXACTLY(完全):父元素决定了子元素确切的大小,子元素将被限定在给定的边界里 而忽略自身大小
- 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() 的区别:
- getMeasureWidth()在Measure过程结束就可以得到 宽度值 ,, getWidth() 要在layout()结束之后才可以得到
- getMeasureWidth() 通过 setMeasureDimension() 函数进行设置,, getWidth() 通过 layout(left, top, right, bottom) 来设置
- 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绘制流程的主要内容,如果未能解决你的问题,请参考以下文章