Android 新特性,ConstraintLayout

轉載自:郭霖 ConstraintLayout完全解析

ConstraintLayout是Android Studio2.2中主要的新增功能之一,也是Google在2016年的I/O大會上重點宣傳的一個功能。我們都知道,在傳統的Android開發當中,界面基本都是靠編寫XML代碼完成的,雖然AndroidStudio也支持可視化的方式來編寫界面,但是操作起來并不方便。ConstraintLayout就是解決這個現狀而生的。

ConstraintLayout的優點:

????? 1.ConstraintLayout非常適合使用可視化的方式來編寫界面,但并不太適合使用XML的方式來進行編寫。

????? 2.它可以有效地解決布局嵌套過多的問題。我們平時編寫界面,復雜的布局總會伴隨著多層的嵌套,而嵌套越多,程序的性能也就越差。ConstraintLayout則是使用約束的方式來指定各個控件的位置和關系的,它有點類似于RelativeLayout,但遠比RelativeLayout要更強大。

使用ConstraintLayout的前提是:

????? 1.確保你的Android Studio是2.2或以上版本。

????? 2.需要在app/build.gradle文件中添加ConstraintLayout的依賴

dependencies{implementation 'com.android.support.constraint:constraint-layout:1.0.2'}

現在的新版本創建的xml文件初始布局一般都是ConstraintLayout。如果不是你可以通過下面的方法把它轉換成ConstraintLayout。

轉換完成之后,原RelativeLayout中的內容也會自動轉換到ConstraintLayout中,比如圖中的TextView。如果你不需要它的話,可以選中這個控件,然后按鍵盤上的Delete鍵即可刪除。

我們可以看到,現在主操作區域內有兩個類似于手機屏幕的界面,右邊的是預覽界面,左邊邊的是藍圖界面。右邊部分主要用于預覽最終的界面效果,左邊部分主要用于觀察界面內各個控件的約束情況,并進行布局編輯工作。 我們也可以通過右上角的小手掌,關閉右邊的預覽界面

基本操作

添加布局

ConstraintLayout的基本用法很簡單,比如我們想要向布局中添加一個按鈕,那么只需要從左側的Palette區域拖一個Button進去就可以了,如下圖所示。

添加約束

雖說現在Button已經添加到界面上了,但是由于我們還沒有給Button添加任何的約束,因此Button并不知道自己應該出現在什么位置。現在我們在預覽界面上看到的Button位置并不是它最終運行后的實際位置,如果一個控件沒有添加任何約束的話,它在運行之后會自動位于界面的左上角。

每個控件的約束都分為垂直和水平兩類,一共可以在四個方向上給控件添加約束,如下圖所示。

上圖中Button的上下左右各有一個圓圈,這圓圈就是用來添加約束的,我們可以將約束添加到ConstraintLayout,也可以將約束添加到另一個控件。比如說,想讓Button位于布局的右下角,就可以這樣添加約束,如下圖所示。

我們給Button的右邊和下邊添加了約束,因此Button就會將自己定位到布局的右下角了。類似地,如果我們想要讓Button居中顯示,那么就需要給它的上下左右都添加約束,如下圖所示。

這就是添加約束最基本的用法了。

除此之外,我們還可以使用約束讓一個控件相對于另一個控件進行定位。比如說,我們希望再添加一個Button,讓它位于第一個Button的正下方,并且間距64dp,那么操作如下所示。

刪除約束:

刪除約束的方式一共有三種,第一種用于刪除一個單獨的約束,將鼠標懸浮在某個約束的圓圈上,然后該圓圈會變成紅色,這個時候單擊一下就能刪除了,如下圖所示。

第二種用于刪除某一個控件的所有約束,選中一個控件,然后它的左下角會出現一個刪除約束的圖標,點擊該圖標就能刪除當前控件的所有約束了,如下所示。

第三種用于刪除當前界面中的所有約束,點擊工具欄中的刪除約束圖標即可,如下圖所示。

ConstraintLayout的進階


Inspector

當你選中任意一個控件的時候,在右側的Properties區域就會出現很多的屬性選項,如下圖所示。

在這里我們就可以設置當前控件的所有屬性,如文本內容、顏色、點擊事件等等。這些功能都非常簡單,小伙伴們自己點一點就會操作了。

需要我們重點掌握的是Properties區域的上半部分,這部分也被稱為Inspector。

首先可以看到,在Inspector中有一個縱向的軸和一個橫向的軸,這兩個軸也是用于確定控件的位置的。我們剛才給Button的上下左右各添加了一個約束,然后Button就能居中顯示了,其實就是因為這里縱橫軸的值都是50。如果調整了縱橫軸的比例,那么Button的位置也會隨之改變,如下圖所示。

不過,雖然我們將橫軸的值拖動到了100,但是Button并沒有緊貼到布局的最右側,這是為什么呢?實際上,AndroidStudio給控件的每個方向上的約束都默認添加了一個16dp的間距,從Inspector上面也可以明顯地看出來這些間距的值。如果這些默認值并不是你想要的,可以直接在Inspector上進行修改,如下圖所示:

可以看到,修改成0之后Button右側的間距就沒了。

接下來我們再來學習一下位于Inspector最中間的那個正方形區域,它是用來控制控件大小的。一共有三種模式可選,每種模式都使用了一種不同的符號表示,點擊符號即可進行切換。

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


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


表示any size,它有點類似于match parent,但和match parent并不一樣,是屬于ConstraintLayout中特有的一種大小控制方式,下面我們來重點講解一下。

首先需要說明,在ConstraintLayout中是有match parent的,只不過用的比較少,因為ConstraintLayout的一大特點就是為了解決布局嵌套,既然沒有了布局嵌套,那么match parent也就沒有多大意義了。

而any size就是用于在ConstraintLayout中頂替match parent的,先看一下我們怎樣使用any size實現和match parent同樣的效果吧。比如說我想讓Button的寬度充滿整個布局,操作如下圖所示。

可以看到,我們將Button的寬度指定成any size,它就會自動充滿整個布局了。當然還要記得將Button左側的間距設置成0才行。

那有的朋友可能會問了,這和match parent有什么區別呢?其實最大的區別在于,match parent是用于填充滿當前控件的父布局,而any

size是用于填充滿當前控件的約束規則。舉個例子更好理解,如果我們有一個新的Button,它的其中一個約束是添加到當前這個Button上的,那么anysize的效果也會發生改變,如下圖所示。

通過上圖的演示,相信你已經很好地理解any size的作用了。

Guidelines

其實這個需求很常見,比如說在應用的登錄界面,都會有一個登錄按鈕和一個注冊按鈕,不管它們是水平居中也好還是垂直居中也好,但肯定都是兩個按鈕共同居中的。

想要實現這個功能,僅僅用我們剛剛學的那些知識是不夠的,這需要用到ConstraintLayout中的一個新的功能,Guidelines。

下面我們還是通過實際操作來學習一下Guidelines的用法吧。比如現在已經向界面中添加了登錄和注冊這兩個按鈕,如下圖所示。

然后我們希望讓這兩個按鈕在水平方向上居中顯示,在垂直方向上都距離底部64dp,那么就需要先添加一個垂直方向上的Guideline,如下圖所示。

我來對上圖中的操作進行一下解釋。首先點擊通知欄中的Guidelines圖標可以添加一個垂直或水平方向上的Guideline,這里我們需要的是垂直方向上的。而Guideline默認是使用的dp尺,我們需要選中Guideline,并點擊一下最上面的箭頭圖標將它改成百分比尺,然后將垂直方向上的Guideline調整到50%的位置,這樣就將準備工作做好了。

接下來我們開始實現讓兩個按鈕在水平方向上居中顯示,并距離底部64dp的功能,如下圖所示。

可以看到,我們給登錄按鈕的右邊向Guideline添加約束,登錄按鈕的下面向底部添加約束,并拖動按鈕讓它距離底部64dp。然后給注冊按鈕的左邊向Guideline添加約束,注冊按鈕的下面向登錄按鈕的下面添加約束。這樣就實現了讓兩個按鈕在水平方向上居中顯示,在垂直方向上都距離底部64dp的功能了。

自動添加約束

不過如果界面中的內容變得復雜起來,給每個控件一個個地添加約束也是一件很繁瑣的事情。為此,ConstraintLayout中支持自動添加約束的功能,可以極大程度上簡化那些繁瑣的操作。

自動添加約束的方式主要有兩種,一種叫Autoconnect,一種叫Inference,我們先來看第一種。

Autoconnect

想要使用Autoconnect,首先需要在工具欄中將這個功能啟用,默認情況下Autoconnect是不啟用的,如下圖所示。

Autoconnect可以根據我們拖放控件的狀態自動判斷應該如何添加約束,比如我們將Button放到界面的正中央,那么它的上下左右都會自動地添加上約束,如下圖所示。

然后我們在這個Button的下方再放置一個Button,效果如下。

可以看到,只需要將Button拖放到界面上,Autoconnect會判斷我們的意圖,并自動給控件添加約束。不過Autoconnect是無法保證百分百準確判斷出我們的意圖的,如果自動添加的約束并不是你想要的話,還可以在任何時候進行手動修改。總之,可以把它當成一個輔助工具,但不能完全靠它去添加控件的約束。

Inference

以上是Autoconnect的用法,接下來我們看一下Inference的用法。Inference也是用于自動添加約束的,但它比Autoconnect的功能要更為強大,因為AutoConnect只能給當前操作的控件自動添加約束,而Inference會給當前界面中的所有元素自動添加約束。因而Inference比較適合用來實現復雜度比較高的界面,它可以一鍵自動生成所有的約束。

下面我們就通過一個例子來演示一下Inference的用法,比如界面上現在有兩個TextView,兩個EditText,和兩個Button,如下圖所示。

接下來我們先將各個控件按照界面設計的位置進行擺放,擺放完成之后點擊一下工具欄上的Infer Constraints按鈕,就能為所有控件自動添加約束了,如下圖所示。

現在運行一下程序,最終效果如下圖所示:

轉載自:郭霖 ConstraintLayout完全解析

?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 227,428評論 6 531
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,024評論 3 413
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 175,285評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,548評論 1 307
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,328評論 6 404
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 54,878評論 1 321
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 42,971評論 3 439
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,098評論 0 286
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,616評論 1 331
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,554評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,725評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,243評論 5 355
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 43,971評論 3 345
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,361評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,613評論 1 280
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,339評論 3 390
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,695評論 2 370

推薦閱讀更多精彩內容