Android ConstraintLayout進階:Chain的使用及實例

chain

Android里的ConstraintLayout是個非常強大的工具蒜田,它有效的解決了Android里Layout的層級嵌套的問題魂毁。使用一個ConstraintLayout可以實現(xiàn)之前多個Layout才能實現(xiàn)的效果玛迄。

本篇文章就介紹下ConstraintLayout里比較進階用法之一:Chain婚苹。

Chain簡介

顧名思義中符,Chain就是把幾個控件像鏈條一樣連接起來配阵,實現(xiàn)一系列的效果冗澈。這個概念看上去有些深奧钦勘,其實并不復(fù)雜。熟悉js/css等技術(shù)的同學(xué)會發(fā)現(xiàn)這些概念很熟悉亚亲。就拿Android來說彻采,使用Chain可以很大程度上在ConstraintLayout里替代原有的LinearLayout和RelativeLayout捏悬。

Chain實例

假設(shè)我們在UI上有三個控件损合,橫著排成一排。要想應(yīng)用Chain的效果麸拄,需要把這3個控件用“鏈子連接起來”惜索。

Chain其實并沒有定義新的控件特笋,只是使用原來的依賴方式。代碼如下:

    <Button
        android:id="@+id/btn_a"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="這是控件A"
        app:layout_constraintEnd_toStartOf="@+id/btn_b"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />


    <Button
        android:id="@+id/btn_b"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="這是控件B"
        app:layout_constraintEnd_toStartOf="@+id/btn_c"
        app:layout_constraintStart_toEndOf="@+id/btn_a"
        app:layout_constraintTop_toTopOf="parent" />

    <Button
        android:id="@+id/btn_c"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="這是控件C"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toEndOf="@+id/btn_b"
        app:layout_constraintTop_toTopOf="parent" />

對照代碼巾兆,我們來看看具體的鏈接是如何實現(xiàn)的:

  1. 控件A猎物,左端依賴父容器,右端依賴控件B角塑。
  2. 控件B蔫磨,左端依賴控件A,右端依賴控件C圃伶。
  3. 控件C堤如,左端依賴控件B蒲列,右端依賴父容器。

通過3個控件的兩兩互相依賴煤惩,我們實現(xiàn)了把他們鏈接起來的目的嫉嘀,接下來就可以應(yīng)用Chain的各種效果了。應(yīng)用的方式也很簡單魄揉,就是在鏈頭(所謂鏈頭剪侮,就是水平鏈中最左側(cè)的控件以及垂直鏈中最頂部的控件),也就是控件A上加上一句:app:layout_constraintHorizontal_chainStyle="XXX"洛退,其中XXX就是想要的效果瓣俯,可能的取值有:Spread、Spread inside兵怯、Packed幾種彩匕。

    <Button
        android:id="@+id/btn_a"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="這是控件A"
        app:layout_constraintEnd_toStartOf="@+id/btn_b"
        app:layout_constraintHorizontal_chainStyle="spread"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

接下來我們來看看各種取值具體的效果:

spread:

spread的效果

這種效果很簡單,就是3個控件把整個橫向空間平分媒区。

spread_inside:

spread_inside效果

這種效果也是非常常見的驼仪,兩端兩個控件靠邊對齊,中間的控件平分剩下的空間袜漩。

weighted:

在使用spreadspread_inside模式的時候绪爸,可以通過layout_constraintHorizontal_weightlayout_constraintVertical_weight來設(shè)置某個控件的權(quán)重值。這和LinearLayout里的layout_weight很相似宙攻。不過此時需要把控件的layout_width(水平排列)layout_height(垂直排列)設(shè)置為0dp奠货。

比如我們修改下這個例子里的控件B:

    <Button
        android:id="@+id/btn_b"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:text="這是控件B"
        app:layout_constraintHorizontal_weight="1"
        app:layout_constraintEnd_toStartOf="@+id/btn_c"
        app:layout_constraintStart_toEndOf="@+id/btn_a"
        app:layout_constraintTop_toTopOf="parent" />

此時的效果是這樣的:


控件B的weight設(shè)置為1

此時,控件B占滿了剩余的空間座掘。

packed:

packed的效果

packed就是把控件都擠在中間顯示递惋。這時候,可以通過修改控件A的layout_marginLeft值來控制3個控件的整體位置溢陪。比如:

<Button
        android:id="@+id/btn_a"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="這是控件A"
        android:layout_marginLeft="100dp" 
        app:layout_constraintEnd_toStartOf="@+id/btn_b"
        app:layout_constraintHorizontal_chainStyle="packed"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

此時3個控件整體向右移動了100dp:


整體向右偏移100dp

其他

關(guān)于Chain還有幾個小知識點:

  • 一個控件既可以放在水平鏈里也可以放在垂直鏈里萍虽,因此可以輕松構(gòu)建靈活的網(wǎng)格布局。

  • 雖然鏈的方向為垂直或水平形真,但使用其中一個方向不會沿該方向與控件對齊贩挣。因此,我們必須使用其他約束條件没酣,以保證控件在另外的方向上對齊王财。比如上面的例子,我們需要app:layout_constraintTop_toTopOf="parent"來指定垂直方向的約束裕便。


以上就是ConstraintLayout里Chain基本用法绒净,希望對您有所幫助。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末偿衰,一起剝皮案震驚了整個濱河市挂疆,隨后出現(xiàn)的幾起案子改览,更是在濱河造成了極大的恐慌,老刑警劉巖缤言,帶你破解...
    沈念sama閱讀 206,602評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件宝当,死亡現(xiàn)場離奇詭異,居然都是意外死亡胆萧,警方通過查閱死者的電腦和手機庆揩,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,442評論 2 382
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來跌穗,“玉大人订晌,你說我怎么就攤上這事“鑫” “怎么了锈拨?”我有些...
    開封第一講書人閱讀 152,878評論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長羹唠。 經(jīng)常有香客問我奕枢,道長,這世上最難降的妖魔是什么佩微? 我笑而不...
    開封第一講書人閱讀 55,306評論 1 279
  • 正文 為了忘掉前任缝彬,我火速辦了婚禮,結(jié)果婚禮上喊衫,老公的妹妹穿的比我還像新娘。我一直安慰自己杆怕,他們只是感情好族购,可當我...
    茶點故事閱讀 64,330評論 5 373
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著陵珍,像睡著了一般寝杖。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上互纯,一...
    開封第一講書人閱讀 49,071評論 1 285
  • 那天瑟幕,我揣著相機與錄音,去河邊找鬼留潦。 笑死只盹,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的兔院。 我是一名探鬼主播殖卑,決...
    沈念sama閱讀 38,382評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼坊萝!你這毒婦竟也來了孵稽?” 一聲冷哼從身側(cè)響起许起,我...
    開封第一講書人閱讀 37,006評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎菩鲜,沒想到半個月后园细,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,512評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡接校,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,965評論 2 325
  • 正文 我和宋清朗相戀三年猛频,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片馅笙。...
    茶點故事閱讀 38,094評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡伦乔,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出董习,到底是詐尸還是另有隱情烈和,我是刑警寧澤,帶...
    沈念sama閱讀 33,732評論 4 323
  • 正文 年R本政府宣布皿淋,位于F島的核電站招刹,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏窝趣。R本人自食惡果不足惜疯暑,卻給世界環(huán)境...
    茶點故事閱讀 39,283評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望哑舒。 院中可真熱鬧妇拯,春花似錦、人聲如沸洗鸵。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,286評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽膘滨。三九已至甘凭,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間火邓,已是汗流浹背丹弱。 一陣腳步聲響...
    開封第一講書人閱讀 31,512評論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留铲咨,地道東北人躲胳。 一個月前我還...
    沈念sama閱讀 45,536評論 2 354
  • 正文 我出身青樓,卻偏偏與公主長得像纤勒,于是被迫代替她去往敵國和親泛鸟。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 42,828評論 2 345

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

  • 我不知道矛盾是否還會爆發(fā) 我怕已成習慣 我怕自己變得冷漠 自私 無情 正因如此 我撕心裂肺般的吼叫 我有想法 我怕...
    阿拉小姐閱讀 213評論 0 0
  • 溝通大師就要畢業(yè)了刚操,回顧這一年多來的歷程,頗有感觸再芋。 感動菊霜,感動,感動济赎。鉴逞。。 記得前年吧司训,我和他的感情早已貌合神離...
    懶懶的媽閱讀 160評論 0 1
  • 俞敏洪:讀書旅行 是我這棵樹成長的土壤肥料 (12月5日在第七屆書香中國·北京閱讀季閱讀盛典上的講話) 各位親愛的...
    大道行者_閱讀 158評論 0 0
  • 健康是我們追求的第一目標 有了健康的身體我們還差啥
    一切順心閱讀 191評論 0 1
  • 對于我來說壳猜, 找人幫忙是一件很困難的事情勾徽。 一句請你幫忙,往往比說一句我愛你還難统扳。 面對越是關(guān)系親密的人喘帚,越是不好...
    好小孩兒玩汽球閱讀 906評論 0 51