ConstraintLayout詳解與使用方法

ConstrainLayout 是 AndroidStudio2.2 的新特性,能夠很方便的用于可視化開(kāi)發(fā),有點(diǎn)類似于 ios 的 storyboard咳焚,解決了 xml 過(guò)于復(fù)雜的問(wèn)題泉哈。


約束

相對(duì)定位(Relative positioning)

也就是我們之前常用的relativelayout,屬性也與其一致肖粮,使用方法如:layout_constraintLeft_toLeftOf孤页,位置用一張圖片解釋。


邊距(Margins)

同之前的margin使用方法涩馆。

  • goneMargin

    簡(jiǎn)單的解釋行施,就是當(dāng)位置約束的目標(biāo)可見(jiàn)性為View.Gone時(shí),可以調(diào)整它的邊距值變?yōu)榕c父布局的margin值魂那。下文將有示例解釋蛾号。


居中定位(Centering positioning)

通過(guò)定義上下左右的相鄰控件或父容器來(lái)設(shè)置居中⊙难牛可以形象的理解為兩個(gè)大小相同鲜结,方向相反的力作用在控件上。

如下活逆,通過(guò)定義top, bottom, start, end就可以使textview在parent居中顯示精刷。

<TextView
 android:id="@+id/textView"
 android:layout_width="wrap_content"
 android:layout_height="wrap_content"
 android:text="TextView"
 app:layout_constraintBottom_toBottomOf="parent"
 app:layout_constraintEnd_toEndOf="parent"
 app:layout_constraintStart_toStartOf="parent"
 app:layout_constraintTop_toTopOf="parent" />

傾向(bias)

搭配bias,就像兩個(gè)力大小不相等蔗候,使其往一個(gè)方向靠攏怒允。
bias = 0.3
  • layout_constraintHorizontal_bias:水平偏向

  • layout_constraintVertical_bias:垂直偏向

  • 0為最左上,1為最右下琴庵,默認(rèn)為0.5误算。


圓定位(Circular positioning)(1.1新特性)

可以理解為以一個(gè)控件為圓心,設(shè)定半徑和角度迷殿,決定另一個(gè)控件的位置儿礼。如圖
  • layout_constraintCircle : 參照的控件id(圓心)

  • layout_constraintCircleRadius : 距離參照物的距離(兩控件中心點(diǎn)間距離)

  • layout_constraintCircleAngle : 偏移角度(0為正上方,0~360)


可見(jiàn)性行為(Visibility behavior)

這是針對(duì)View.GONE的特定處理庆寺。Gone隱藏的控件蚊夫,會(huì)被當(dāng)成一個(gè)點(diǎn),同時(shí)忽略margin懦尝。如圖知纷。

  • 當(dāng)A消失時(shí)壤圃,B的邊距將為原來(lái)與A的約束邊距。

  • 另一種方法琅轧,用goneMargin生成新的邊距伍绳,而原來(lái)與A的約束邊距將不起作用。

  • 這種特定的行為可以做到特殊的布局乍桂,比如上圖A消失時(shí)B位置不變冲杀,設(shè)A寬度為100,邊距為10睹酌,B對(duì)A約束為20权谁,那么goneMargin=100+10+20=130,則可以實(shí)現(xiàn)A隱藏后B位置不變憋沿。


尺寸約束(Dimensions constraints)
  • 可以定義ConstraintLayout布局的尺寸

  • 可以定義控件的尺寸旺芽,有三種方式:

    1. 確定尺寸:123dp
    1. WRAP_CONTENT

    2. 0dp

  • 0dp,相當(dāng)于match_constraint辐啄,意思就是填滿約束的空間采章。如果設(shè)置了margin值,也需要去掉margin的空間壶辜。


比例(Ratio)
  • 可以按比例設(shè)置控件的寬高共缕,定義其中一個(gè)維度為0dp,并設(shè)置屬性layout_constraintDimensionRatio士复,值可以為0~1的浮點(diǎn)數(shù)或比例x:x图谷。

  • 可以設(shè)置兩個(gè)維度均為0dp,同時(shí)在ratio值前加W或H分別約束寬度或高度阱洪。

     <Button android:layout_width="0dp"
     android:layout_height="0dp"
     app:layout_constraintDimensionRatio="H,16:9"
     app:layout_constraintBottom_toBottomOf="parent"
     app:layout_constraintTop_toTopOf="parent"/>
  • 如上便贵,將以button的最大約束寬度,16:9的比例定義button的高度

鏈條(Chains)
  • 將一個(gè)維度的一組控件組成一個(gè)鏈條冗荸,另一個(gè)維度可以單獨(dú)控制承璃,相當(dāng)于綁成一個(gè)組件。

  • 一組部件通過(guò)雙向連接就形成一個(gè)鏈條蚌本。
  • 水平鏈的最左邊和豎直鏈的最上邊成為鏈頭盔粹。
  • 如果連接中設(shè)置了margin,要考慮在內(nèi)程癌。

  • 鏈條樣式(Chain Style)

    給鏈條第一個(gè)元素設(shè)置屬性layout_constraintHorizontal_chainStylelayout_constraintVertical_chainStyle舷嗡,則鏈條會(huì)根據(jù)樣式更改。(默認(rèn)CHAIN_SPREAD

    • spread:元素間分散開(kāi)

    • spread_inside:端點(diǎn)除外嵌莉,元素間分散開(kāi)进萄,如上圖區(qū)別

    • packed:元素間打包,即貼在一起

  • 權(quán)重鏈(Weighted chains)

    類似LinearLayout里的WEIGHT屬性,若元素使用MATCH_CONSTRAINT中鼠,就是這些元素使用約束后的空間可婶。

    • layout_constraintHorizontal_weight

    • layout_constraintVertical_weight


虛擬輔助元素(Virtual Helper objects)

可以使用輔助對(duì)象來(lái)創(chuàng)建相對(duì)約束,可以通過(guò)水平或垂直的Guideline來(lái)定位控件援雇。

  • Guideline

    • 不會(huì)被顯示矛渴,只會(huì)輔助布局

    • 定位Guideline有三種方式:

      layout_constraintGuide_begin:距離左側(cè)或頂部的固定距離

      layout_constraintGuide_end:距離右側(cè)或底部的固定距離

      layout_constraintGuide_percent:父控件的高度或?qū)挾鹊陌俜直?/p>


可視化操作

約束控鍵類型
  • 調(diào)整尺寸大小:正方形四角

  • 側(cè)邊約束:四邊圓形惫搏,約束四邊的位置

  • 基線約束:文字下方條狀曙旭,用于對(duì)齊文字

添加約束
  • 點(diǎn)擊控鍵,選中圓點(diǎn)拖動(dòng)到要約束的位置晶府。如圖,要將控件放于左上角钻趋,將左邊和上邊分別拉到屏幕邊緣即可川陆。
  • 兩個(gè)控件間添加約束,要將第二個(gè)textview放于第一個(gè)的下方蛮位,只需要將左邊約束對(duì)齊较沪,上邊約束到第一個(gè)textview的下方即可。要注意的是失仁,添加完約束后尸曼,會(huì)有一個(gè)默認(rèn)margin值,導(dǎo)致左邊沒(méi)對(duì)齊萄焦,此時(shí)在右側(cè)的Attributes中將margin調(diào)為0即可控轿。
刪除約束
  • 刪除單個(gè)約束:點(diǎn)擊具體的約束發(fā)起點(diǎn)即可刪除。

  • 刪除單個(gè)控件的所有約束:點(diǎn)擊控件拂封,在左下方有刪除所有約束的按鈕茬射,點(diǎn)擊即可。

  • 刪除整個(gè)界面的所有約束:在上方工具欄找到

    按鈕即可刪除冒签。

Inspector的使用

這個(gè)界面就是控件的屬性在抛。我們除了可以修改一些基本屬性,還有一些新的功能萧恕。

  • 修改尺寸

    這里有三種尺寸描述方式:


    • :wrap_content


    • :固定數(shù)值(100dp)


    • :match_constraint

    關(guān)于這三個(gè)屬性的區(qū)別上面已經(jīng)解釋過(guò)刚梭,大家看動(dòng)圖可以觀察出區(qū)別。

  • 調(diào)整bias

    滑動(dòng)那個(gè)滑塊調(diào)節(jié)即可票唆。

  • 使用guideline

    可以使用guideline進(jìn)行百分比布局朴读,再不用擔(dān)心適配問(wèn)題了。

  • 自動(dòng)添加約束

    在上方的工具欄找到

    走趋,就可以開(kāi)啟AutoConnect磨德,雖然有時(shí)候可能不能達(dá)到你想要的布局,但大部分時(shí)候可以減輕你的工作量。


總結(jié)

參考官方文檔
用constraintLayout可以完全替換掉之前的linearLayout和relativeLayout典挑,使用也很方便酥宴,希望能幫大家快速上手。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末您觉,一起剝皮案震驚了整個(gè)濱河市拙寡,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌琳水,老刑警劉巖肆糕,帶你破解...
    沈念sama閱讀 211,948評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異在孝,居然都是意外死亡诚啃,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,371評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門私沮,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)始赎,“玉大人,你說(shuō)我怎么就攤上這事仔燕≡於猓” “怎么了?”我有些...
    開(kāi)封第一講書人閱讀 157,490評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵晰搀,是天一觀的道長(zhǎng)五辽。 經(jīng)常有香客問(wèn)我,道長(zhǎng)外恕,這世上最難降的妖魔是什么杆逗? 我笑而不...
    開(kāi)封第一講書人閱讀 56,521評(píng)論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮鳞疲,結(jié)果婚禮上髓迎,老公的妹妹穿的比我還像新娘。我一直安慰自己建丧,他們只是感情好排龄,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,627評(píng)論 6 386
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著翎朱,像睡著了一般橄维。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上拴曲,一...
    開(kāi)封第一講書人閱讀 49,842評(píng)論 1 290
  • 那天争舞,我揣著相機(jī)與錄音,去河邊找鬼澈灼。 笑死竞川,一個(gè)胖子當(dāng)著我的面吹牛店溢,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播委乌,決...
    沈念sama閱讀 38,997評(píng)論 3 408
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼床牧,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了遭贸?” 一聲冷哼從身側(cè)響起戈咳,我...
    開(kāi)封第一講書人閱讀 37,741評(píng)論 0 268
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎壕吹,沒(méi)想到半個(gè)月后著蛙,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,203評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡耳贬,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,534評(píng)論 2 327
  • 正文 我和宋清朗相戀三年踏堡,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片咒劲。...
    茶點(diǎn)故事閱讀 38,673評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡顷蟆,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出缎患,到底是詐尸還是另有隱情,我是刑警寧澤阎肝,帶...
    沈念sama閱讀 34,339評(píng)論 4 330
  • 正文 年R本政府宣布挤渔,位于F島的核電站,受9級(jí)特大地震影響风题,放射性物質(zhì)發(fā)生泄漏判导。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,955評(píng)論 3 313
  • 文/蒙蒙 一沛硅、第九天 我趴在偏房一處隱蔽的房頂上張望眼刃。 院中可真熱鬧,春花似錦摇肌、人聲如沸擂红。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 30,770評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)昵骤。三九已至,卻和暖如春肯适,著一層夾襖步出監(jiān)牢的瞬間变秦,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 32,000評(píng)論 1 266
  • 我被黑心中介騙來(lái)泰國(guó)打工框舔, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留蹦玫,地道東北人赎婚。 一個(gè)月前我還...
    沈念sama閱讀 46,394評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像樱溉,于是被迫代替她去往敵國(guó)和親挣输。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,562評(píng)論 2 349

推薦閱讀更多精彩內(nèi)容