未來布局之星——ConstraintLayout

知識背景

名稱: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,如下圖所示:

將布局修改為ConstraintLayout

刪除一個控件

完成轉換后,可以在Component Tree下方看到ConstraintLayout里面有原來存在的TextView控件,如果不需要,可以在藍色區域選中TextView控件,單擊鍵盤delete按鈕刪除該控件。

切換視圖

點擊菜單欄的中的Show Design、Show BlueprintShow Design + Blueprint按鈕可以對操作視圖進行切換,如下圖所示:

切換視圖

添加約束

百聞不如一見,先來看看添加約束的操作。按鈕控件有四個方向的約束,如下圖所示,按鈕的上、下、左、右邊上各有一個小圓圈,鼠標可拖動小圓圈到ConstraintLayout,與其添加約束。

Button控件約束

如將按鈕下邊圓圈拖至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,然后放到Guidelines的位置,按住鼠標即可輕松實現拖動。

拖動Guidelines

Autoconnect

或許因為我們是第一次接觸ConstraintLayout,所以感覺添加約束的操作很有趣,但是在項目中,當控件數量比較多時,每個控件的每條邊都要一個一個添加約束,這樣就會拖慢開發效率,所以ConstraintLayout提出了Autoconnect的用法。

如下圖所示,單擊打開工具欄中Autoconnect功能按鈕,將控件拖至屏幕中心,然后約束就會自動添加了,這個相信使用過墨刀設計過APP原型的讀者們會感到很熟悉。

Autoconnect

Autoconnect會根據我們的意圖來判斷是否添加相應的約束,當然自動添加的約束不一定全是想要的效果,這時候可以關閉Autoconnect,然后手動修改約束。

Autoconnect

Inference

Inference與Autoconnect功能相同,都是用于自動添加約束的,但是Inference更加強大。Inference是手動添加約束后,對當前界面所有控件的位置關系添加整體約束關系,感覺和Photoshop里面不同布局中的圖像調整好位置后合并可見圖層很像。Inference操作如下圖所示:

4.gif

寫在后面

本文是在拜讀郭霖大神的《Android新特性介紹,ConstraintLayout完全解析》一文后寫的,本文的案例和描述基本都是參考自這篇文章,權當是轉載來的吧!請叫我佳作搬運工!
最后附上大神原文鏈接供大家品讀:
http://blog.csdn.net/guolin_blog/article/details/53122387


更新20170311

今天簡單地翻譯了一篇關于ConstraintLayout的官方文檔,寫了一篇《從官方文檔看ConstraintLayout》,歡迎讀者們前來指點。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 173,269評論 25 708
  • 最全面的ConstraintLayout教程 原創微信公眾號郭霖 WeChat ID: guolin_blog 本...
    木木00閱讀 10,467評論 4 63
  • 前言 Google 在推出 Android Studio 2.2預覽版時,為開發者提供了一種新的布局,那就是 Co...
    ListenerGao閱讀 8,661評論 3 19
  • 步驟: 通過小車問題想讓大家記住的東西 1 居中問題。絕對是居中,我認為這個比較簡單 而且想調位置上下左右哪都能調...
    Cyril丶閱讀 178評論 0 0
  • 麻布樹,樹干中空,不能作木材,也談不上有觀賞的價值,但卻可以入藥。 最近,常聽同學在談論自己找工作的經歷,多...
    龍諼閱讀 336評論 0 1