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