Android-ConstraintLayout詳解
現在還不用ConstraintLayout是有點守舊了,它是studio 2.2版本主要增加的功能之一,最大的好一句話概括就是: 支援視覺化編輯xml檔案,解決多層佈局巢狀的問題 ,這也就優化了我們的程式,詳情請檢視:
QQ" target="_blank" rel="nofollow,noindex">解析ConstraintLayout的效能優勢
由於ConstarintLayout佈局可以視覺化和程式碼編寫,我們就分別看看這兩種方式。
基本用法
基本用法之視覺化編寫佈局檔案
在高版本的studio中預設採用constraintLayout佈局,中間有一個textview,我們選中,delete刪除.開始一個新的佈局編輯。
注:介面預設的TextView的屬性有:app:layout_editor_absoluteY
app:layout_editor_absoluteX
這個是TextView在介面中的縱軸和橫軸的絕對座標,沒有,刪除就行了。
1.拖拽佈局新增約束
然後我們從左邊的Palette拖拽一個TextView,不清楚,這無關緊要。 (以下視訊存在模糊大家湊活看)
拖拽一個TextView從Palette

大家看到TextView上下左右四個小空心圓點了吧,我們就是通過這個空心圓點給每個控制元件新增約束,每個控制元件的約束都分為垂直和水平兩類,一共可以在四個方向(上下左右)上給控制元件新增約束。
比如我們想讓TextView居中:
控制元件居中顯示_騰訊視訊
位於某控制元件之下50dp處:
位於某控制元件底部50dp處_騰訊視訊
2.刪除約束
取消約束三種方式:
刪除控制元件某一具體的約束(滑鼠放在圓圈上變紅後點擊即可)
刪除控制元件某一個具體約束_騰訊視訊
刪除某一個控制元件的全部約束:選中一個控制元件,然後它的左下角會出現一個刪除約束的圖示,點選即可
刪除某個控制元件全部約束_騰訊視訊
刪除當前頁面所有約束:點選工具欄中的刪除約束圖示即可:
刪除某個頁面全部約束_騰訊視訊
3.Inspector使用
3.1. Inspector在哪裡呢?Properties區域的上半部分,被稱為Inspector。如圖:

在Inspector中有一個縱向的軸和一個橫向的軸,這兩個軸也是用於確定控制元件的位置的。如果調整了縱橫軸的比例,那麼TextView的位置也會改變.,如下:
Inspector縱橫軸_騰訊視訊
不知道我操作小夥伴注意沒,我們的寬充滿父類, 用的屬性是match_costraint,沒有match_parent,而且也找不到match_parent這個值, 這是因為google在constraintlaout佈局已經不推薦match_parent屬性了,需要手敲,且與之前的結果不一樣。

3.2.我們將Inspector橫軸的值變到了最大,為什麼還是有間距呢?
原來android預設給控制元件的每個方向上的約束都預設添加了一個16dp的間距,從Inspector上面也可以明顯地看出來這些間距的值。我們只需要直接在控制元件上改就行了。(視訊)
控制元件自帶padding_騰訊視訊
3.3.Inspector中間的正方形區域可以控制大小,有三種模式,點選即可切換。


表示wrap content,這個我們很熟悉了,不需要進行什麼解釋。

fixed表示固定值,也就是給控制元件指定了一個固定的長度或者寬度值。

match constraints,它有點類似於match parent,但和match parent並不一樣,是屬於ConstraintLayout中特有的一種大小控制方式,那我們來看一看他們的區別,看視訊:
可以看剛開始我們將下面Button的上邊和上面Button的底邊新增約束,match constraints的作用效果是充滿上邊Button以下的所有區域,當我們取消之前的約束,將下面Button的上邊的約束條件改為和parent新增約束後,下面Button直接覆蓋上面的Button,直接充滿全屏了。
總結:match constraints的實現效果和約束條件相關聯,是相對的。
4.Guidelines用法:
.Guidelines的使用_騰訊視訊
從視訊中可以看到,我們從上面的工具欄拖拽了一個垂直和水平的guidelines輔助線,然後預設單位是dp,我點選輔助線的前端設定為百分比,然後確定位置,新增約束。
5.省時省力,自動新增約束
5.1 Autoconnect

Autoconnect可以根據我們拖放控制元件的狀態自動判斷應該如何新增約束,比如我們將Button拖拽到介面中,如果接近或者位於水平方向的中央,就會出現一個水平輔助線(guidelines有些類似),Autoconnec判斷我們可能是想水平居中,所以此時你放開手就會自動幫你新增水平居中的約束,如果意圖判斷不對,建議手動了,主要是輔助作用,很不準確,下面演示一下:
Autoconnect演示_騰訊視訊
大家看到了Autoconnect新增的約束,app:layout_constraintStart_toStartOf="parent" 和app:layout_constraintEnd_toEndOf="parent" 與app:layout_constraintLeft_toLeftOf="parent" 和app:layout_constraintRight_toRightOf="parent" 是一個意思。
5.2 Inference

Inference 比Autoconnect的功能要更為強大,因為AutoConnect只能給當前操作的控制元件自動新增約束(也不是100%準確),而Inference會給當前介面中的所有元素自動新增約束,一鍵自動生成所有的約束,效果如下:
Inference演示_騰訊視訊
基本用法之程式碼編寫佈局檔案
1.手動敲相關屬性
說完了拖拽,我們看一看通常的寫法,手動敲相關屬性,敲之前,先新建一個xml,放一個Button按鈕:

那我們試試讓他居中,新增相關約束:

我們看看下面這幾個新增的屬性是啥意思:
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
拿app:layout_constraintTop_toTopOf="parent"來說明:constraintTop意思是新增Top方向的約束,toTopOf意思是去哪個控制元件的Top方向,="parent" 就是參照的控制元件。連起來的意思是:給Buton按鈕新增一個Top的約束,約束方向是其父類的Top邊。其餘三個就不說了,其次類推,其他也都類似。
2.MATCH_CONSTRAINT屬性
為了測試MATCH_CONSTRAINT屬性,我們再來一個註冊按鈕。

那我們用一下 MATCH_CONSTRAINT這個屬性,我們讓註冊按鈕的寬設定為:MATCH_CONSTRAINT,結果如下:

我為什麼設定odp呢?應為0dp就代表MATCH_CONSTRAINT的寫法,我們程式碼中的意思就相當於我不設定寬了,讓它根據我的約束自適應大小,那我在設定一下match_parent,看看效果:

3.設定寬高比(constraintDimensionRatio)
看程式碼:

也可以這樣寫:
app:layout_constraintDimensionRatio="W,16:6"
app:layout_constraintDimensionRatio="H,16:6"
4.實現LinearLayout的wedget
程式碼如下:

4.1 有三個TextView,這裡只有兩個,剩餘腦補,都一樣。到了這裡我們還是沒有用到weight,別急我們給第一個三個TextView以此設定app:layout_constraintHorizontal_weight=""的值為:2:1:1,結果如下:

4.2 還有一個layout_constraintHorizontal_chainStyle 屬性
我們剛才設定的三個TextView,兩兩添加了依賴,類似下圖:

橫向的相當於組成了一個鏈(Chains)。在這個鏈的最左側的元素成為鏈頭,我們可以在其身上設定一些屬性,來決定這個鏈的展示效果,這就是我要說的屬性layout_constraintHorizontal_chainStyle。預設為:app:layout_constraintHorizontal_chainStyle="spread"
還有另外兩個chainStyle:
packed
spread_inside
一共三個,這裡只稍微演示一下,即在預設的基礎上設定控制元件寬度非0,如下:

其餘效果,大家可以自己研究,來一張官網可以實現的效果:

5.layout_constraintHorizontal_bias 和 layout_constraintVertical_bias
layout_constraintHorizontal_bias 和 layout_constraintVertical_bias這兩個屬性來設定控制元件的間隙比例,效果圖如下:

如果沒有:app:layout_constraintHorizontal_bias="0.9"
app:layout_constraintVertical_bias="0.9"
Button應該是居中的,但我們設定之後,相當於在橫向從左往右移動了90%,縱向從上往下移動了90%。
6.Guideline
這個Guideline,我們在拖拽實現的時候講過,Guideline被用來新增一個垂直或水平方向上的輔助線,然後我們以此來確定控制元件的擺放位置,我們先說一下相關的屬性:
android:orientation取值為"vertical"和"horizontal" 分為橫向和縱向
layout_constraintGuide_begin 距離頂部多少有一個輔助線,根據orientation來決定是橫向還是縱向。
layout_constraintGuide_end 距離底部多少有一個輔助線,根據orientation來決定是橫向還是縱向。
layout_constraintGuide_percent 距離百分比,根據orientation來決定是橫向還是縱向。
我們直接上程式碼和效果,大家一看便知:

ok,我們講了ConstraintLayout的拖拽和手動編寫程式碼兩種方式,沒有使用的小夥伴趕緊嘗試吧,熟能生巧。