封装View的时候怎么知道view的大小

onMeasure():决定View的大小

分两种方法:

(1)如果测量的是一个View:可以getDefaultSize()方法来获取测量宽高。

setMeasuredDimension(getDefaultSize(getSuggestedMinimumHeight(),heightMeasureSpec),...)

在源码中onMeasure()只调用了setMeasuredDimension()来存储测量的宽,高值,其两个宽高参数都是通过getDefaultSize()获得的

getDefaultSize()中有两个参数,第一个是getSuggestedMinimumWidth()/getSuggestedMinimumHeight(), 第二个是widthMeasureSpec/heightMeasureSpec。

getDefaultSize()返回的结果就是用MeasureSpec中模式(mode)、大小(size)、getSuggestedMinimumWidth()/getSuggestedMinimumHeight()大小三者进行测量后的大小

其中getSuggestedMinimumWidth()/getSuggestedMinimumHeight(),就是获取最小宽度作为默认值,原理是先查看View有没有设背景来设置参数,如无则默认为0

 

(2)如果是多个View或者ViewGroup嵌套我们就需要循环遍历视图中的所有View

在子类中重写的onMeasure:

调用measureChildren()来设置widthMeasureSpec以及 heightMeasureSpec,然后再执行super.onMeasure(widthMeasureSpec,heightMeasureSpec);

measureChildren() ->measureChild()->getChildMeasureSpec()

 

执行measureChildren()就是遍历所有的子View,如果View的状态不是GONE就调用measureChild()去进行下一步的测量(measureChild()先测量单个视图,将宽高和padding加在一起后交给getChildMeasureSpec()去获得最终的测量值 ,再将计算好的宽高详细测量值传入child的measure方法,完成最后的测量)

 

getChildMeasureSpec()结合父view的MeasureSpec与子view的LayoutParams信息去找到最好的结果 (也就是说子view的确切大小由两方面共同决定:1.父view的MeasureSpec 2.子view的LayoutParams属性)
---------------------
作者:门徒Cat
来源:CSDN
原文:https://blog.csdn.net/github_37130188/article/details/89111831
版权声明:本文为博主原创文章,转载请附上博文链接!

posted @ 2019-06-22 19:47  天涯海角路  阅读(1134)  评论(0)    收藏  举报