一、線性布局LinearLayout
1、排列方向:orientation設(shè)置
2、weight屬性:占比
剩余空間的占比。
比如,如果有text1和text2,假設(shè)每個(gè)text的寬度是120px,那么在1080px的屏幕上,剛開始剩余空間是840px,假設(shè)text1占比1,text2占比2,那么text1的寬度是120+840/3=400排序,text2寬度=120+840/32=680px,顯示效果text2比text1寬度大。
如果text1和text2均設(shè)置為match_parent,假設(shè)text1占比1,text2占比2,此時(shí)text1則會(huì)比text2大。因?yàn)?,一開始text1和text2占用的都是1080px,剩余的空間就是1080-10802=-1080px,是負(fù)數(shù),因此text1的寬度是1080+(-1080)/3=720px,text2的寬度為1080+(-1080)/3*2=360px,所以text1的寬度比text2的還大。
3、layout_gravity
linearLayout中設(shè)置layout_gravity無效,因?yàn)閘inearLayout是線性布局,必須從左到右或從上到下排列。
注意:match_parent指占用父控件剩下的空間的全部。
所以,
當(dāng)text1和text2都占用match_parent時(shí),text1將獲得父控件剩余的全部空間,text2將占用0;結(jié)果是text1可見且占滿這個(gè)父控件而text2不可見。
當(dāng)text1占用wrap_content時(shí),text1先占用一部分空間,text2占用剩下的父控件的全部空間,結(jié)果是text1和text2均可見且text1大小小于text2的大小。
4、weightSum——子控件weight的最大占比
例如父控件weight_sum為n,子控件A的layout_weight為a,子控件B的layout_weight為b,則
子控件A占用空間為= 子控件A原本大小+a/n*剩余空間大小。
如果子控件長度最后大于父控件長度,將超出父控件的范圍,子控件無法顯示全部。
5、設(shè)置分割線
android:showDividers="middle"
android:divider="@android:color/black"
二、幀布局FrameLayout
1、特點(diǎn)
往里面添加控件時(shí)默認(rèn)添加到左上角,且沒有任何的定位方式可以定位(layout_gravity除外),其大小由最大的子控件決定。
2、常用屬性
android:foreground:幀布局的前景圖像
android:foregroundGravity:幀布局的前景圖像的顯示位置
三、相對(duì)布局RelativeLayout
四、約束布局ConstraintLayout
[參考]https://juejin.im/entry/5bb18966f265da0aea698c58
1、簡介
ConstrainLayout是一個(gè)允許開發(fā)者靈活地設(shè)置控件的位置和大小的ViewGroup。 只要你使用的Android系統(tǒng)版本在9以上,你便可以通過添加依賴的方式來使用ConstrainLayout.
2、使用
添加依賴
implementation 'com.android.support.constraint:constraint-layout:1.1.3'
3、常用約束
-相對(duì)定位(Relative positioning)
相對(duì)定位是ConstrainLayout構(gòu)建布局的一種基本方式。相對(duì)定位約束可以幫助我們通過一個(gè)給定的Widget來擺放另外一個(gè)Widget。我們可以在橫縱兩個(gè)方向上約束Widget。
橫向: left, right, start and end sides 縱向: top, bottom sides and text baseline
<Button android:id="@+id/buttonA" ... />
<Button android:id="@+id/buttonB" ...
app:layout_constraintLeft_toRightOf="@+id/buttonA" />
總結(jié):LinearLayout線性布局內(nèi)部實(shí)現(xiàn)時(shí)必定是鏈表或隊(duì)列的形式;FrameLayout幀布局采用棧的數(shù)據(jù)存儲(chǔ)格式,所以每次添加新的組件都會(huì)覆蓋顯示;