Android-ConstraintLayout詳解

現在還不用ConstraintLayout是有點守舊了,它是studio 2.2版本主要增加的功能之一,最大的好一句話概括就是:支持可視化編輯xml文件,解決多層佈局嵌套的問題,這也就優化了我們的程序,詳情請查看:

解析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的拖拽和手動編寫代碼兩種方式,沒有使用的小夥伴趕緊嘗試吧,熟能生巧。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章