ConstraintLayout

來源:約束布局ConstraintLayout看這一篇就夠了

優(yōu)點

復(fù)雜的UI,可能會出現(xiàn)布局嵌套過多的問題土居,嵌套得越多枣购,設(shè)備繪制視圖所需的時間和計算功耗也就越多。

  • ConstraintLayout使用起來比RelativeLayout更靈活擦耀,性能更出色棉圈。- - ---- - ConstraintLayout可以按照比例約束控件位置和尺寸,能夠更好地適配屏幕大小不同的機型眷蜓。

文本基線 layout_constraintBaseline_toBaselineOf

    <TextView
        android:id="@+id/TextView1"
        .../>

    <TextView
        android:id="@+id/TextView2"
        ...
        app:layout_constraintLeft_toRightOf="@+id/TextView1" 
        app:layout_constraintBaseline_toBaselineOf="@+id/TextView1"/>
效果

角度定位

app:layout_constraintCircle="@+id/TextView1"
app:layout_constraintCircleAngle="120"(角度)
app:layout_constraintCircleRadius="150dp"(距離)

goneMargin

用于約束的控件可見性被設(shè)置為gone的時候使用的margin值

<android.support.constraint.ConstraintLayout 
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <TextView
        android:id="@+id/TextView1"
        .../>

    <TextView
        android:id="@+id/TextView2"
        ...
        app:layout_constraintLeft_toRightOf="@+id/TextView1"
        app:layout_goneMarginLeft="10dp"
        />

</android.support.constraint.ConstraintLayout>
TextView1的可見性設(shè)為gone

偏移

layout_constraintHorizontal_bias 水平偏移
layout_constraintVertical_bias 垂直偏移

要實現(xiàn)水平偏移分瘾,給TextView1的layout_constraintHorizontal_bias賦一個范圍為 0-1 的值,假如賦值為0吁系,則TextView1在布局的最左側(cè)德召,假如賦值為1,則TextView1在布局的最右側(cè)汽纤,假如假如賦值為0.5上岗,則水平居中,假如假如賦值為0.3蕴坪,則更傾向于左側(cè)肴掷。

尺寸約束

  • layout_constraintDimensionRatio 寬高比
    在設(shè)置寬高比的值的時候,還可以在前面加W或H辞嗡,分別指定寬度或高度限制捆等。 例如:
    app:layout_constraintDimensionRatio="H,2:3"指的是 高:寬=2:3
    app:layout_constraintDimensionRatio="W,2:3"指的是 寬:高=2:3

  • 使用 0dp (MATCH_CONSTRAINT)
    官方不推薦在ConstraintLayout中使用match_parent滞造,可以設(shè)置 0dp

ayout_constraintHorizontal_chainStyle來改變整條鏈的樣式续室。chains提供了3種樣式,分別是:
CHAIN_SPREAD —— 展開元素 (默認(rèn))谒养;
CHAIN_SPREAD_INSIDE —— 展開元素挺狰,但鏈的兩端貼近parent;
CHAIN_PACKED —— 鏈的元素將被打包在一起买窟。

 <TextView
        android:id="@+id/TextView1"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toLeftOf="@+id/TextView2"
        app:layout_constraintHorizontal_weight="2" />

    <TextView
        android:id="@+id/TextView2"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        app:layout_constraintLeft_toRightOf="@+id/TextView1"
        app:layout_constraintRight_toLeftOf="@+id/TextView3"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintHorizontal_weight="3" />

    <TextView
        android:id="@+id/TextView3"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        app:layout_constraintLeft_toRightOf="@+id/TextView2"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintHorizontal_weight="4" />

輔助工具

  • Optimizer
    我們使用 MATCH_CONSTRAINT 時丰泊,ConstraintLayout 將對控件進行 2 次測量,ConstraintLayout在1.1中可以通過設(shè)置 layout_optimizationLevel 進行優(yōu)化始绍,可設(shè)置的值有:
    none:無優(yōu)化
    standard:僅優(yōu)化直接約束和屏障約束(默認(rèn))
    direct:優(yōu)化直接約束
    barrier:優(yōu)化屏障約束
    chain:優(yōu)化鏈約束
    dimensions:優(yōu)化尺寸測量

  • Barrier


假設(shè)有3個控件ABC瞳购,C在AB的右邊,但是AB的寬是不固定的亏推,這個時候C無論約束在A的右邊或者B的右邊都不對学赛。當(dāng)出現(xiàn)這種情況可以用Barrier來解決年堆。Barrier可以在多個控件的一側(cè)建立一個屏障,如下所示:

這個時候C只要約束在Barrier的右邊就可以了盏浇,代碼如下:

<TextView
        android:id="@+id/TextView1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />

    <TextView
        android:id="@+id/TextView2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        app:layout_constraintTop_toBottomOf="@+id/TextView1" />

    <android.support.constraint.Barrier
        android:id="@+id/barrier"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        app:barrierDirection="right"
        app:constraint_referenced_ids="TextView1,TextView2" />

    <TextView
        android:id="@+id/TextView3"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        app:layout_constraintLeft_toRightOf="@+id/barrier" />

app:barrierDirection為屏障所在的位置变丧,可設(shè)置的值有:bottom、end绢掰、left痒蓬、right、start滴劲、top
app:constraint_referenced_ids為屏障引用的控件攻晒,可設(shè)置多個(用“,”隔開)

  • Group
    Group可以把多個控件歸為一組,方便隱藏或顯示一組控件班挖,舉個例子:
    <TextView
        android:id="@+id/TextView1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />

    <TextView
        android:id="@+id/TextView2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        app:layout_constraintLeft_toRightOf="@+id/TextView1" />

    <TextView
        android:id="@+id/TextView3"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        app:layout_constraintLeft_toRightOf="@id/TextView2" />

現(xiàn)在有3個并排的TextView炎辨,用Group把TextView1和TextView3歸為一組,再設(shè)置這組控件的可見性聪姿,如下所示:

   <android.support.constraint.Group
        android:id="@+id/group"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:visibility="invisible"
        app:constraint_referenced_ids="TextView1,TextView3" />
  • Placeholder
    Placeholder指的是占位符焰扳。在Placeholder中可使用setContent()設(shè)置另一個控件的id霜浴,使這個控件移動到占位符的位置。舉個例子:
<android.support.constraint.Placeholder
        android:id="@+id/placeholder"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        app:content="@+id/textview"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

    <TextView
        android:id="@+id/textview"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:background="#cccccc"
        android:padding="16dp"
        android:text="TextView"
        android:textColor="#000000"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

新建一個Placeholder約束在屏幕的左上角,新建一個TextView約束在屏幕的右上角超营,在Placeholder中設(shè)置 app:content="@+id/textview",這時TextView會跑到屏幕的左上角届囚。效果如下:


  • Guideline
    Guildline像輔助線一樣脏嚷,在預(yù)覽的時候幫助你完成布局(不會顯示在界面上)。
    Guildline的主要屬性:
    android:orientation 垂直vertical擎场,水平horizontal
    layout_constraintGuide_begin 開始位置
    layout_constraintGuide_end 結(jié)束位置
    layout_constraintGuide_percent 距離頂部的百分比(orientation = horizontal時則為距離左邊)
    <android.support.constraint.Guideline
        android:id="@+id/guideline1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:orientation="horizontal"
        app:layout_constraintGuide_begin="50dp" />

    <android.support.constraint.Guideline
        android:id="@+id/guideline2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:orientation="vertical"
        app:layout_constraintGuide_percent="0.5" />

guideline1為水平輔助線羽德,開始位置是距離頂部50dp,guideline2位垂直輔助線迅办,開始位置為屏幕寬的0.5(中點位置)宅静,效果如下:

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市站欺,隨后出現(xiàn)的幾起案子姨夹,更是在濱河造成了極大的恐慌,老刑警劉巖矾策,帶你破解...
    沈念sama閱讀 211,123評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件磷账,死亡現(xiàn)場離奇詭異,居然都是意外死亡贾虽,警方通過查閱死者的電腦和手機逃糟,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,031評論 2 384
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人绰咽,你說我怎么就攤上這事蛉抓。” “怎么了剃诅?”我有些...
    開封第一講書人閱讀 156,723評論 0 345
  • 文/不壞的土叔 我叫張陵巷送,是天一觀的道長。 經(jīng)常有香客問我矛辕,道長笑跛,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,357評論 1 283
  • 正文 為了忘掉前任聊品,我火速辦了婚禮飞蹂,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘翻屈。我一直安慰自己陈哑,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 65,412評論 5 384
  • 文/花漫 我一把揭開白布伸眶。 她就那樣靜靜地躺著惊窖,像睡著了一般。 火紅的嫁衣襯著肌膚如雪厘贼。 梳的紋絲不亂的頭發(fā)上界酒,一...
    開封第一講書人閱讀 49,760評論 1 289
  • 那天,我揣著相機與錄音嘴秸,去河邊找鬼毁欣。 笑死,一個胖子當(dāng)著我的面吹牛岳掐,可吹牛的內(nèi)容都是我干的凭疮。 我是一名探鬼主播,決...
    沈念sama閱讀 38,904評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼串述,長吁一口氣:“原來是場噩夢啊……” “哼执解!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起剖煌,我...
    開封第一講書人閱讀 37,672評論 0 266
  • 序言:老撾萬榮一對情侶失蹤材鹦,失蹤者是張志新(化名)和其女友劉穎逝淹,沒想到半個月后耕姊,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,118評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡栅葡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,456評論 2 325
  • 正文 我和宋清朗相戀三年茉兰,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片欣簇。...
    茶點故事閱讀 38,599評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡规脸,死狀恐怖坯约,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情莫鸭,我是刑警寧澤闹丐,帶...
    沈念sama閱讀 34,264評論 4 328
  • 正文 年R本政府宣布,位于F島的核電站被因,受9級特大地震影響卿拴,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜梨与,卻給世界環(huán)境...
    茶點故事閱讀 39,857評論 3 312
  • 文/蒙蒙 一堕花、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧粥鞋,春花似錦缘挽、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,731評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至等浊,卻和暖如春窝稿,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背凿掂。 一陣腳步聲響...
    開封第一講書人閱讀 31,956評論 1 264
  • 我被黑心中介騙來泰國打工伴榔, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人庄萎。 一個月前我還...
    沈念sama閱讀 46,286評論 2 360
  • 正文 我出身青樓踪少,卻偏偏與公主長得像,于是被迫代替她去往敵國和親糠涛。 傳聞我的和親對象是個殘疾皇子援奢,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,465評論 2 348