知識背景
名稱:ConstraintLayout
出身:Android Studio 2.2新增功能
成就:2016年Google I/O大會黑馬獎;可視化Android界面編寫領軍角色
關鍵詞:約束
ConstraintLayout是Android Studio 2.2中具有亮點的新功能之一,相比于RelativeLayout、LinearLayout等傳統布局,它打破了開發者使用XML編寫布局的依賴。
雖然傳統布局也可以使用可視化界面拖動控件來搭建布局,但是因為不夠靈活,大多數開發者還是會選擇通過XML代碼來搭建布局。而ConstraintLayout的出現將開發者帶入可視化布局編程的新紀元,通過建立控件之間的約束,實現布局的構建。這樣做有一個很大的優點,就是減少了布局的嵌套,減少了布局渲染的層數,降低了CPU的消耗,提高了程序的性能。
ConstraintLayout與RelativeLayout相似,都是通過建立控件與控件之間的位置關系來搭建布局,但是ConstraintLayout遠遠比RelativeLayout強大很多,接下來看一下ConstraintLayout的使用。
建立依賴
ConstraintLayout布局是Android Studio 2.2的新增功能,所以在建立依賴前需要將Android Studio更新至2.2版本或以上。
在app/build.gradle文件中添加依賴,如下:
dependencies {
compile 'com.android.support.constraint:constraint-layout:1.0.0-beta4'
}
修改布局為ConstraintLayout
打開AndroidStudio,新建一個工程,找到布局文件activity_main.xml,打開讓其以Design
方式顯示,如下圖所示。界面中央有兩塊區域,左邊是預覽界面,右邊的藍色區域是控件拖動操作界面。
默認創建的activity_main文件的根布局是一個RelativeLayout,接下來將RelativeLayout布局改為ConstraintLayout布局,找到Component Tree
,在其下方右鍵單擊activity_main(RelativeLayout),在彈出的列表中選擇Convert RelativeLayout to ConstraintLayout
,如下圖所示:
刪除一個控件
完成轉換后,可以在Component Tree
下方看到ConstraintLayout里面有原來存在的TextView控件,如果不需要,可以在藍色區域選中TextView控件,單擊鍵盤delete
按鈕刪除該控件。
切換視圖
點擊菜單欄的中的Show Design
、Show Blueprint
和Show Design + Blueprint
按鈕可以對操作視圖進行切換,如下圖所示:
添加約束
百聞不如一見,先來看看添加約束的操作。按鈕控件有四個方向的約束,如下圖所示,按鈕的上、下、左、右邊上各有一個小圓圈,鼠標可拖動小圓圈到ConstraintLayout,與其添加約束。
如將按鈕下邊圓圈拖至ConstraintLayout底部,則按鈕移動至底部;再將按鈕上邊圓圈拖動至ConstraintLayout頂部,垂直方向上有兩個約束的按鈕控件就會實現垂直居中。
約束位置比例調整
當然如果ConstraintLayout添加約束僅僅能實現水平、垂直居中,那么它在功能上與RelativeLayout就沒有差別了。除了居中,約束還可以設置控件兩邊到邊界之間的距離比例,通過在右側屬性面板中,拖動水平和垂直方向的進度條來調整兩邊距離的比例。
控件之間添加約束
除了與ConstraintLayout添加約束,控件與控件之間同樣可以添加約束。如下圖所示,在調整按鈕寬度后,將兩個按鈕的左右兩邊添加約束,然后將下方按鈕的上邊與上方按鈕的下邊添加約束,拖動下方的按鈕,可設置兩個按鈕之間的外邊距。
通過控件之間添加約束和調整約束距離比例,開發者可實現較為復雜的約束。
調整控件外邊距及尺寸
細心的讀者們或許會發現,在調整控件位置比例的時候,當進度條滑動至100時,控件未能完全貼上布局的右邊界,這是因為控件存在外邊距。
這時候可以修改屬性面板中的數值來調整控件的外邊距大小,如下圖所示:
在控件尺寸調整上,ConstraintLayout提供了三種模式,在屬性面板中點擊下圖紅色框框區域實現模式的切換。
這三種分別為:
-
wrap content
wrap_content
wrap content模式就是平時常用的根據內容來設定控件尺寸。 -
固定值
固定值
固定值模式也是平時常用的,通過設定具體數值來確定控件的大小。如下圖所示,切換為固定模式后,在下方的layout_width
一欄填寫具體的寬度數值。
設置控件大小 -
any size
any size
any size與match parent類似,都是充滿整個范圍,但是不同點在于match parent充滿相對于父容器,而any size是相對于約束條件,即在約束條件下,能填充的范圍全部充滿,如下圖所示:
設置為any size
這里說明一下,ConstraintLayout其實也有match parent模式,但是因為ConstraintLayout不存在多層嵌套關系,所以match parent這種相對于父容器的模式在ConstraintLayout中很少會使用。
刪除約束
學習了添加約束后,來看看如何刪除約束?刪除約束有三種方式:
-
刪除單個約束
將鼠標移動到要刪除的約束對應的小圓圈,待小圓圈出現閃爍的紅色圈圈時,點擊小圓圈即可刪除約束。
刪除單個約束
除了上面這種刪除方法,也可以在屬性面板中,將鼠標移動到下圖紅色框框標記的位置,待出現叉叉圖標,點擊可刪除該約束。
刪除單個約束
-
刪除單個控件的所有約束
用鼠標點擊控件,在其左下方會出現一個小叉叉圖標,點擊小圖標即可刪除當前控件的所有約束。
刪除單個控件的所有約束 -
刪除當前界面的所有約束
點擊工具欄中刪除所有約束
圖標的按鈕,即可刪除當前界面所有的約束。
刪除當且界面的所有約束
Guidelines
學完基本的依賴操作,來看一下ConstraintLayout的進階用法。這里有一個需求,要求將兩個控件合在一起,實現水平居中。如果不使用ConstraintLayout,讀者們或許會想到用RelativeLayout嵌套LinearLayout來實現。那么在ConstraintLayout這樣不存在多布局嵌套的情況下該怎么實現呢?
這時候就提出了Guidelines,GuideLines就如同Photoshop中參考線的概念一樣。如下圖,創建一個垂直方向的參考線,將其切換至百分比模式,拖動到50%的位置,再將兩個控件在左右兩側分別與Guidelines添加約束,然后兩個控件的底邊相互添加約束即可實現合并居中的效果。此時ConstraintLayout展現了其強大的優勢,通過其特性優雅地完成需求。
這里說明一下,創建完Guidelines后,讀者們會發現它很難拖動,這里有一個小技巧:將鼠標按住劃過Guidelines,然后放到Guidelines的位置,按住鼠標即可輕松實現拖動。
Autoconnect
或許因為我們是第一次接觸ConstraintLayout,所以感覺添加約束的操作很有趣,但是在項目中,當控件數量比較多時,每個控件的每條邊都要一個一個添加約束,這樣就會拖慢開發效率,所以ConstraintLayout提出了Autoconnect
的用法。
如下圖所示,單擊打開工具欄中Autoconnect
功能按鈕,將控件拖至屏幕中心,然后約束就會自動添加了,這個相信使用過墨刀設計過APP原型的讀者們會感到很熟悉。
Autoconnect會根據我們的意圖來判斷是否添加相應的約束,當然自動添加的約束不一定全是想要的效果,這時候可以關閉Autoconnect,然后手動修改約束。
Inference
Inference與Autoconnect功能相同,都是用于自動添加約束的,但是Inference更加強大。Inference是手動添加約束后,對當前界面所有控件的位置關系添加整體約束關系,感覺和Photoshop里面不同布局中的圖像調整好位置后合并可見圖層很像。Inference操作如下圖所示:
寫在后面
本文是在拜讀郭霖大神的《Android新特性介紹,ConstraintLayout完全解析》一文后寫的,本文的案例和描述基本都是參考自這篇文章,權當是轉載來的吧!請叫我佳作搬運工!
最后附上大神原文鏈接供大家品讀:
http://blog.csdn.net/guolin_blog/article/details/53122387
更新20170311
今天簡單地翻譯了一篇關于ConstraintLayout的官方文檔,寫了一篇《從官方文檔看ConstraintLayout》,歡迎讀者們前來指點。