網(wǎng)站的風(fēng)格有哪些什么是seo
measure 用來測(cè)量 View 的寬和高,它的流程分為 View 的 measure 流程和 ViewGroup 的measure流程,只不過ViewGroup的measure流程除了要完成自己的測(cè)量,還要遍歷地調(diào)用子元素的measure()方法。
上一回說到performMeasure方法前會(huì)得到DecoreView的MeasureSpec接著調(diào)用DecoreView的measure方法攜帶寬高這兩個(gè)MeasureSpec做處理。
View的onMeasure前會(huì)計(jì)算好View的MeasureSpec接著調(diào)用onMeasure傳遞進(jìn)去,ViewGroup中也是如此遍歷子View得到子View的MeasureSpec接著在調(diào)用onMeasure。
那么接下來是干什么?,得到View自身的MeasureSpec就可以直接賦值了嗎》:
首先判斷是否有無背景:無背景情況使用view最小寬度(對(duì)應(yīng)于View的mMinWidth屬性);有背景情況下使用背景drawable的intrinsicwidth固有寬度(mBackground.getMiniumWidth)
setMinimumWidth方法
public void setMinimumWidth(int minWidth){//保存mMinWidth=minWidth;//重新布局該ViewrequestLayout();
}
getMiniumWidth方法
public int getMiniumWidth(){//獲取該屬性得到的的是這個(gè)Drawable的固有寬度final int intrinsicWidth=getIntrinsicWidth();return intrinsicWidth>0?intrinsicWidth:0
}
拿到最小寬高后結(jié)合MeasureSpec的Mode做處理:
如果SpecMode是UNSPECIFIED那么就返回這個(gè)最小值,如果是ATMOST或者EXACTLY返回MeasureSpec中自帶的寬高也就是當(dāng)前View的SpecSize
這下 寬高就知道了,但是這個(gè)寬高是原始的寬高
這里需要針對(duì)padding和margin進(jìn)行在處理View的寬高,最終的寬高其實(shí)就是View真實(shí)的寬高。
對(duì)應(yīng)于ViewGroup
其拿到自身的MeasureSpec后,需要進(jìn)行生成子View的MeasureSpec,循環(huán)遍歷可見的子view并調(diào)用measurechildren方法測(cè)量每個(gè)子view, 該方法傳入需要測(cè)量的子view實(shí)例還有自身的measurespec因?yàn)闇y(cè)量子View的真實(shí)寬高是通過父view的measurespec和自己的寬高結(jié)合處理的
父view的specmode為atmost時(shí):
1.子view給出來了具體的寬度 傳給子view的寬度就是具體的寬高spec采用精確模式
2.子viewmatch 寬度為父view的寬度減去padding,mode為精確模式
3.子元素的MeasureSpec屬性也為AT_MOST,它的SpecSize值為父容器的SpecSize減去padding的值這和子元素設(shè)置LayoutParams屬性為MATCH_PARENT效果是一樣的,但是其Mode是ATMOST。為了解決這個(gè)問題,需要在LayoutParams屬性為WRAP_CONTENT時(shí)指定一下默認(rèn)的寬和高。
ViewGroup并沒有提供onMeasure 方法,而是讓其子類來各自實(shí)現(xiàn)測(cè)量的方法,究其原因就是ViewGroup有不同布局的需要,很難統(tǒng)一
原文:自定義View之Measure(二) - 掘金 (juejin.cn)