這篇文章呢我們談一談,約束佈局常用的一些需求和坑
一、如果我想讓一個控制元件在父佈局裡左右填充怎麼辦(上下填充,上下左右都填充同理)
- match_parent 方式
<View
android:id="@+id/a"
android:layout_width="match_parent"
android:layout_height="60dp"
android:background="@android:color/holo_red_light" />
複製程式碼
- 相對佈局的方式(
android:layout_width="0dp"
是關鍵)
<View
android:id="@+id/a"
android:layout_width="0dp"
android:layout_height="60dp"
android:background="@android:color/holo_red_light"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent" />
複製程式碼
ConstraintLayout 沒有 match_parent 所以推薦使用第二種方式,雖然看效果是沒啥事,但是官方的坑我表示不踩
二、替代百分比佈局
有時候想把控制元件按照比例填充父佈局,Android 螢幕適配這麼複雜,好像不容易實現
這時候約束佈局有兩個屬性 layout_constraintWidth_percent layout_constraintHeight_percent
這豈不是把一直不溫不火的百分比佈局給革命了
<View
android:id="@+id/a"
android:layout_width="0dp"
android:layout_height="50dp"
android:background="@android:color/holo_red_light"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintWidth_percent="0.3" />
複製程式碼
我只放這麼一段程式碼大家應該就知道怎麼用了,我也就不多了說了。
預設是居中的如果想調整位置請結合
app:layout_constraintHorizontal_bias="0.3"
食用
三、控制元件寬度一定,我想左右居中顯示怎麼辦(上下居中同理)
<View
android:id="@+id/a"
android:layout_width="120dp"
android:layout_height="60dp"
android:background="@android:color/holo_red_light"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent" />
複製程式碼
與左右填充相似,只不過寬度固定了而已,兩條繩子拉著一個控制元件居中
四、控制元件寬度一定,左右按百分比顯示怎麼辦,我就是不想居中(上下同理)
<View
android:id="@+id/a"
android:layout_width="120dp"
android:layout_height="60dp"
android:background="@android:color/holo_red_light"
app:layout_constraintHorizontal_bias="0.3"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent" />
複製程式碼
app:layout_constraintHorizontal_bias="0.3"
一個屬性就搞定了
上下使用
app:layout_constraintVertical_bias
來實現
五、我想兩個控制元件左右平分空間,對沒錯就是搶 LinearLayout 的飯碗(上下居中同理)
<View
android:id="@+id/a"
android:layout_width="0dp"
android:layout_height="60dp"
android:background="@android:color/holo_red_light"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toLeftOf="@+id/b" />
<View
android:id="@+id/b"
android:layout_width="0dp"
android:layout_height="60dp"
android:background="@android:color/holo_blue_light"
app:layout_constraintLeft_toRightOf="@+id/a"
app:layout_constraintRight_toRightOf="parent" />
複製程式碼
因為有個約束鏈的存在所以這個稍微有點複雜,先來一張約束示意圖看一下,約束鏈下邊在講
六、我想兩個控制元件左右按比例平分空間,平分多沒有意思啊(上下同理)
<View
android:id="@+id/a"
android:layout_width="0dp"
android:layout_height="60dp"
android:background="@android:color/holo_red_light"
app:layout_constraintHorizontal_weight="1"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toLeftOf="@+id/b" />
<View
android:id="@+id/b"
android:layout_width="0dp"
android:layout_height="60dp"
android:background="@android:color/holo_blue_light"
app:layout_constraintHorizontal_weight="2"
app:layout_constraintLeft_toRightOf="@+id/a"
app:layout_constraintRight_toRightOf="parent" />
複製程式碼
上面的例子是 1:2 看寫法是不是和 LinearLayout 的權重寫法簡直一毛一樣
上下權重設定
app:layout_constraintVertical_weight=""
一定記得android:layout_width="0dp"
是 0dp
坑點
-
寬高在需要自動控制長度的時候一定是設定為 0dp,不然沒什麼效果,甚至達不到預期,我也推薦約束佈局中只是用 0dp 、wrap_content 、固定的值。切記 match_parent 是沒啥卵用,雖然看著有效果,但是我也不敢碰,說多了都是淚。
-
切記只有約束過的邊設定 margin 才能看出效果,注意我說的是能看出,雖然設定了 margin 也是有意義的但是看不出來
-
平時我們摞控制元件的時候一定記得處理右邊和底部的約束,好多人控制元件顯示不全就是這個問題