純粹是個人學(xué)習(xí)總結(jié)趣钱,如有不對的地方請吐槽蹂空。
LayoutInflater的基本用法:
LayoutInflater layoutInflater = LayoutInflater.from(context);//1
layoutInflater.inflate(resourceId, root);//2
1其實(shí)是android封裝的方法,實(shí)際調(diào)用的是:
LayoutInflater layoutInflater = (LayoutInflater) context
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
由此可見LayoutInflater是一個系統(tǒng)服務(wù)。
2除還有一個重載方法:inflate(int resource, ViewGroup root, boolean attachToRoot)
第二個和第三個參數(shù)的作用如下:
- 如果root為null骤坐,attachToRoot將失去作用,設(shè)置任何值都沒有意義油吭。
- 如果root不為null击蹲,attachToRoot設(shè)為true,則會給加載的布局文件的指定一個父布局婉宰,即root歌豺。
- 如果root不為null,attachToRoot設(shè)為false心包,則會將布局文件最外層的所有l(wèi)ayout屬性進(jìn)行設(shè)置类咧,當(dāng)該view被添加到父view當(dāng)中時,這些layout屬性會自動生效蟹腾。
- 在不設(shè)置attachToRoot參數(shù)的情況下痕惋,如果root不為null,attachToRoot參數(shù)默認(rèn)為true娃殖。
每一個視圖的繪制過程都必須經(jīng)歷三個最主要的階段值戳,即onMeasure()、onLayout()和onDraw()
onMeasure()
onMeasure(int widthMeasureSpec, int heightMeasureSpec):這個方法是確定視圖的規(guī)格和大小炉爆。
specMode的類型有三種:
1堕虹、EXACTLY
表示父視圖希望子視圖的大小應(yīng)該是由specSize的值來決定的,系統(tǒng)默認(rèn)會按照這個規(guī)則來設(shè)置子視圖的大小芬首,開發(fā)
人員當(dāng)然也可以按照自己的意愿設(shè)置成任意的大小赴捞。
- AT_MOST
表示子視圖最多只能是specSize中指定的大小,開發(fā)人員應(yīng)該知道去設(shè)置這個視圖郁稍,并且保證不會超過specSize赦政。系
統(tǒng)默認(rèn)會按照這個規(guī)則來設(shè)置子視圖的大小,開發(fā)人員當(dāng)然也可以按照自己的意愿設(shè)置成任意的大小艺晴。
- UNSPECIFIED
表示開發(fā)人員可以將視圖按照自己的意愿設(shè)置成任意的大小昼钻,沒有任何限制。這種情況比較少見封寞,不太會用到然评。
確定視圖的大小規(guī)則是:判斷是否有背景圖片,如果有就判斷控件最小尺寸和背景圖哪個大誰大返回誰狈究,如果沒有就
返回控件的最小尺寸碗淌。
public final void measure(int widthMeasureSpec, int heightMeasureSpec);
這個方法是final說明系統(tǒng)不讓開發(fā)者改變View的measure框架。
這個方法里面會調(diào)用onMeasure(widthMeasureSpec, heightMeasureSpec);
而在onMeasure方法中會調(diào)用public static int getDefaultSize(int size, int measureSpec);方法來確定控件的大
小,默認(rèn)情況控件的大小就是:根據(jù)背景和最小尺寸來確定控件大小亿眠。
然后在調(diào)用setMeasuredDimension()方法來設(shè)定測量出的大小碎罚,這樣一次measure過程就結(jié)束了
ViewGroup中定義了一個measureChildren()方法來去測量子視圖的大小
循環(huán)調(diào)用了measureChild()方法,這方法里面調(diào)用了child.measure(childWidthMeasureSpec,
childHeightMeasureSpec);
這樣來確定視圖的大小。
onLayout()
確定控件尺寸之后調(diào)用方法
onMeasure()
方法后控件的大小就確定了纳像,這時候就該執(zhí)行onLayout方法了荆烈。
調(diào)用方法:
host.layout(0, 0, host.mMeasuredWidth, host.mMeasuredHeight);
同樣在layou中調(diào)用了onLayout()方法