Android ConstraintLayout使用指南
由於知乎文章不支持顯示gif動態圖片,為了你有更好的閱讀體驗,推薦你到我的個人博客閱讀本文:http://blog.coderclock.com/2017/04/09/android/android-constraintlayout/
升級Android Studio 2.3之後,IDE默認生成的Activity布局都是以ConstraintLayout做為根布局,體驗了一把這個Google去年就開始力推的ConstraintLayout後,覺得非常不錯,本文用於記錄ConstraintLayout各個方面的使用知識。
平台支持
- ConstraintLayout最低兼容Android 2.3;
- 目前Android Studio 2.3默認使用ConstraintLayout作為布局文件的根布局;
- 想要使用ConstraintLayout,需在項目的build.gradle添加com.android.support.constraint:constraint-layout:XXX版本號依賴;
基礎使用
ConstraintLayout翻譯成中文也稱為約束布局,在整個使用體驗過程中真的是貫穿約束二字,這一節先來介紹一些基礎使用,後面你就會慢慢感受到約束布局的魅力。創建完工程後打開布局文件,底部切換Design的Tab上,可以看到整個操作界面

左上角的面板是放置了系統內置各種各樣的控制項,想要布局直接拖到到布局文件中即可(所見即所得),右邊的面板是選中布局文件中的控制項時期各種各樣的空間屬性,ConstraintLayout最大的好處在於讓我們通過拖控制項的形式進行布局,並且不用擔心適配問題。所以,先來拖個控制項試試看,將一個Button拖動到屏幕正中央,然後運行顯示看看效果。









介紹完上下左右的依賴設置後,下面介紹一些Margin屬性,除了Android常見的各種android:layout_marginXXX外,ConstraintLayout自行添加了如下屬性
聊完Margin後,再來介紹一下Bias,ConstraintLayout新增了如下兩個屬性用於控制控制項在水平和垂直方向在屏幕上的偏移比例

進階使用
看完基本使用,再來學習一些進階技巧,這裡先補充一個關於ConstraintLayout的知識點,與其他Layout不同之處在於,它的layout_width和layout_height不支持設置match_parent,其屬性取值只有以下三種情況:
- wrap_content;
- 指定具體dp值;
- 0dp(match_constraint),代表填充約束之意,注意不要以為和match_parent是一樣的;
想想如果沒有ConstraintLayout,我們要讓一個控制項的寬高按某個比例進行布局應該怎麼做?有了ConstraintLayout後,我們可以使用layout_constraintDimentionRatio屬性設置寬高比例,前提是目標控制項的layout_width和layout_height至少有一個設置為0dp,如下讓一個ImageView寬高按照2:1的比例顯示

ConstraintLayout的鏈條(Chains)特性非常強大,在沒有ConstraintLayout之前,線性布局我們主要都依靠LinearLayout來完成,有了ConstraintLayout之後,它把LinearLayout的活也幹了,例如要把按鈕水平排成一行,可以這樣操作

這樣ButtonA、B、C就在水平方向形成了一條Chain,並且底部對齊。回去看xml文件,會見到ButtonA新增app:layout_constraintHorizontal_chainStyle的屬性設置,這個屬性在一條Chain中只會出現在第一個控制項中,這個控制項是整條Chain的Head。



從操作上我們可以看到Guideline也分為垂直和水平兩種,並且支持設置在屏幕中所處的位置,可以使用layout_constraintGuide_begin和layout_constraintGuide_end設置具體dp值,也可以使用layout_constraintGuide_percent來設置比例。實際上它也只是一個輔助我們布局的View而已,其源碼內部實現也非常簡單,並且默認設置了visibility為gone,關於ConstraintLayout的進階使用便介紹到這裡。
使用優勢
關於ConstraintLayout的使用優勢,我個人體驗總結如下:
- 高效布局,Android這麼多年以來真正意義上的實現了所見即所得的拖曳方式布局,極大的提高開發效率;
- 輕鬆靈活的實現複雜的布局;
- 解決多重布局嵌套問題,通過前面介紹你會發現ConstraintLayout真的是非常靈活,可以很大程度的避免Layout之間的嵌套;
- 滿足屏幕適配的需求,想想沒有ConstraintLayout之前的拖曳式布局,你就知道有多噁心;
最佳實踐
ConstraintLayout最開始出來就有很多開發者盼著完全依賴於拖曳方式實現布局,而在實際操作過程中,完全通過拖曳其實效率反倒是會打折扣,在此建議是拖曳方式和xml編碼相結合才是最佳實踐的方式。
喜歡我的文章,可以關注我的知乎專欄!
我的微信公眾號:技術視界
我的個人博客:http://blog.coderclock.com/
我的Diycode:https://www.diycode.cc/d_clock
我的知乎:https://www.zhihu.com/people/d_clock
新浪微博:D_clock愛吃蔥花
推薦閱讀:
※五月份,掘金翻譯計劃有這些乾貨
※教你寫一個炫酷的Material Design 風格的登錄和註冊頁面
※Android之視圖動畫Animation
※Google Pixel,這個兒子不一樣
※高效Android開發者必須知道的4個工具





