自定義ViewGroup問題解決
·為什么測量父要先測量子?
父需要確定給不給得起。
·為什么測量子需要父的測量規(guī)格?measureChild(child, widthMeasureSpec, heightMeasureSpec);
父布局分三種:知道多大,很大但不知道多大,還沒分配。相應(yīng)的子控件也分三種:知道要多少(子控件一樣大),有多少全給,控件多大就要多少(子控件不一樣大)。
·layoutParams是什么?
layoutParams代表xml里設(shè)置的寬高,但它不是int,API里有相應(yīng)方法轉(zhuǎn)化為int。
?
·getMeasuredWidth和getWidth的區(qū)別?
前者在measure()結(jié)束后就有,后者是布局結(jié)束后才有
·寬和高的測量模式和wrap、match、具體值是什么關(guān)系?
width:
Match-exactly-1080
Wrap-at_most-1080
100dp-exactly-300px
height:
Match-unspecified-0
Wrap-unspecified-0
100dp-exactly-300px
·對子控件設(shè)置ViewGroup.MarginLayoutParams layoutParams = new ViewGroup.MarginLayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);
和xml里對子控件的設(shè)置的是什么關(guān)系?認(rèn)哪個?
認(rèn)java代碼。條目樣式xml里的最外層設(shè)置的大小和間距是沒用的,它相當(dāng)于畫布,條目真正的大小、背景最好從第二層開始,大小會被java覆蓋,但是間距是直接不認(rèn),java不設(shè)置那就會默認(rèn)0?
·總結(jié):大小和間距都只認(rèn)優(yōu)先java設(shè)的,寫java的時候可以照著xml寫
·上面可以看到自定義view繼承的是ViewGroup,必須至少雙參構(gòu)造,即必須用代碼設(shè)置并傳入子控件的layoutParam。繼承LinearLayout可以單參構(gòu)造,認(rèn)xml設(shè)置的子控件大小,但是不認(rèn)xml里的間距,所以意義不大。
·注意事項:在自定義布局的代碼中,getLayoutParam和child.getLayoutParam分別獲取的是父與子的布局參數(shù)。