天天看點

constraintlayout嵌套_Android開發知識(二十六)強大的限制布局 - ConstraintLayout的用法總結...

th="0dp"android:layout_height="0dp"app:layout_constraintHeight_percent="0.5"app:layout_constraintHei

oid:layout_height="0dp"app:layout_constraintDimensionRatio="W,1:2"app:layout_constraintBottom_toBott

th="0dp"android:layout_height="0dp"app:layout_constraintHeight_percent="0.5"app:layout_constraintHei

oid:layout_height="0dp"app:layout_constraintDimensionRatio="W,1:2"app:layout_constraintBottom_toBott

前言

在ConstraintLayout出現之前,我們編寫布局往往少不了多層嵌套,很多效果需要結合Relativelayout、LinearLayout等容器的互相嵌套來完成,雖然頁面的效果實作了,但卻帶來很大的性能消耗,而往往還因為适配問題而帶來更多的麻煩。

而ConstraintLayout神奇的地方在于,它不僅能夠實作Relativelayout的相對定位,也能實作像LinearLayout一樣的比例配置設定,而且比它們還更優秀。除此之外,ConstraintLayout還提供了很多屬性和輔助類,讓我們更輕松的實作布局效果。

使用ConstraintLayout之後往往能把之前嵌套好幾層的布局幹掉。進而大大減少了布局嵌套層次,提高了性能。

結束語終于結束了,其實一直很懶得寫部落格,因為總結一篇實在太耗費精力和時間了。但是換來的是對知識的總結,是以還是有必要堅持寫下去。如果你也看到了最後,請給我一個贊支援一下吧!。版權聲明:本文為部落客原創文

ConstraintLayout也不是個什麼新鮮的東西了,google最早在16年I/O大會上就釋出了這個全新的布局,而實際上據我在各個技術群上的了解,貌似實際把ConstraintLayout用在項目裡的人相對較少,也可能是受項目限制,不友善重構布局。也有一部分因為不熟悉這個布局的使用,進而不敢輕易用在項目中,筆者在一開始使用這個布局的時候,就被它的靈活性驚豔到了。而且容易用以前布局的思維來用在了ConstraintLayout中,這是不可取的。是以深感ConstraintLayout需要适應一段時間後就會慢慢的适應這種布局方式,在适應後也會很不想用其它的布局了。

p://schemas.android.com/apk/res-auto"xmlns:tools="http://schemas.android.com/tools"android:layout_wi

為此我總結了以下用法,希望能夠幫助到你們,也為自己知識做一個總結。

就是滿足限制限制的最大尺寸了。比如我在根布局ConstraintLayout裡想指定一個View,它居中螢幕,鋪滿寬度,并且高度很寬度一樣大小,那麼可以這麼寫:

用法

本篇文章講解的是ConstraintLayout的基礎用法,基本上ConstraintLayout的要點已經在這裡了。

eholder先提前占位,然後再來替換成目标View。Placeholder有一個重要屬性:app:content比如我們來寫一個模版布局,這個布局分成上下兩個部分。<?xmlversion ="

相對定位

語句

layout_constraintLeft_toLeftOf

layout_constraintLeft_toRightOf

layout_constraintTop_toTopOf

layout_constraintTop_toBottomOf

layout_constraintRight_toLeftOf

layout_constraintRight_toRightOf

layout_constraintBottom_toTopOf

layout_constraintBottom_toBottomOf

layout_constraintBaseline_toBaselineOf

layout_constraintStart_toEndOf

layout_constraintStart_toStartOf

layout_constraintEnd_toStartOf

layout_constraintEnd_toEndOf

解釋

google為我們提供了這麼多個這種xxx to yyy of 的格式,

這裡的xxx就是使用這條限制語句的View的某個位置(Left、Top、Right、Bottom、Start、End、BaseLine)

這裡的yyy就是被用來做錨點的View的某個位置(Left、Top、Right、Bottom、Start、End、BaseLine)

tv1"/>

效果類似于RelativeLayout的layout_toLeftOf、layout_alignParentLeft這些。

代替RelativeLayout來做相對位置的處理邊距(Margin)語句android:layout_marginStartandroid:layout_marginEndandroid:layou

直白的了解就是:你想這個View的哪條邊去對齊另外一個View的哪一條邊的時候,就可以用這個。

idth="true"則不會超過限制大小。但是這樣看來感覺有點多此一舉了,感覺wrap屬性沒大用處了  由上,ConstraintLayout的強大之處真不是一點兩大點。我們現在可以輕松自由的根據比例

運用舉例

舉個栗子,我們寫個Button A,它居中父布局(水準和垂直),然後寫第二個Button B,讓它處于第一個Button下方。

android:layout_height="200dp"android:layout_marginTop="4dp"android:layout_marginBottom="8dp"android:

代碼如下:

otocol」,這是來自百度百科的解釋:SMTP是一個相對簡單的基于文本的協定。在其之上指定了一條消息的一個或多個接收者(在大多數情況下被确認是存在的),然後消息文本會被傳輸。可以很簡單地通過teln

entthisiscontentthisiscontent"android:textSize="24sp"app:layout_constraintLeft_toRightOf="@+id/tv1"/

ns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height=

xmlns:app="http://schemas.android.com/apk/res-auto"

xmlns:tools="http://schemas.android.com/tools"

android:layout_width="match_parent"

android:layout_height="match_parent"

>

android:id="@+id/btn1"

android:layout_width="200dp"

android:layout_height="200dp"

android:background="@color/colorAccent"

app:layout_constraintLeft_toLeftOf="parent"

app:layout_constraintRight_toRightOf="parent"

app:layout_constraintTop_toTopOf="parent"

app:layout_constraintBottom_toBottomOf="parent"

android:text="A"

android:textSize="50sp"

/>

android:id="@+id/btn2"

android:layout_width="200dp"

android:layout_height="200dp"

android:background="@color/colorPrimary"

app:layout_constraintTop_toBottomOf="@+id/btn1"

android:text="B"

android:textSize="50sp"

/>

運作結果如圖:

eft_toLeftOf="parent"app:layout_constraintRight_toRightOf="parent"app:layout_constraintTop_toTopOf="

constraintlayout嵌套_Android開發知識(二十六)強大的限制布局 - ConstraintLayout的用法總結...

(注:如果被拿來做限制參考的View是它的父布局的話,那麼就不是寫id,而是寫parent)

t="match_parent">

View的(Left、Top、Right、Bottom、Start、End、BaseLine):

nt"android:textSize="24sp"app:layout_constraintLeft_toRightOf="@+id/tv1"/>

constraintlayout嵌套_Android開發知識(二十六)強大的限制布局 - ConstraintLayout的用法總結...

這個東西特别好用,使得我們可以代替RelativeLayout來做相對位置的處理

;/Button>效果:View的尺寸大小語句layout_constraintWidth

邊距(Margin)

語句

android:layout_marginStart

android:layout_marginEnd

android:layout_marginLeft

android:layout_marginTop

android:layout_marginRight

android:layout_marginBottom

解釋

在ConstraintLayout裡,也支援layout_marginLeft這種格式。隻是區分的一點是,在使用這句代碼時比必須先指定下Left是相對于哪個View哪個位置

@+id/guideline1"/>效果截圖:Group  Group同樣是一個虛拟的Vi

比如我們想讓上面的bButton B距離左邊50dp,那麼必須要先聲明它的left相對于父布局的left:

ght="wrap_content"android:text="内容:"android:textSize="24sp"app:layout_constraintLeft_toLeftOf="paren

app:layout_constraintLeft_toLeftOf="parent"

android:layout_marginLeft="50dp"

這樣才能起作用。

_constraintLeft_toLeftOflayout_constraintLeft_toRightOflayout_constraintTop_toTopOflayout_constraint

值得注意的是,margin确定的邊距并不會因為做為錨點的View被設定成GONE了而失效。

"100dp"android:layout_height="100dp"android:background="@color/colorAccent"android:text="A"android:t

比如有以下代碼:

match_parent"android:layout_height="match_parent">

xmlns:app="http://schemas.android.com/apk/res-auto"

xmlns:tools="http://schemas.android.com/tools"

android:layout_width="match_parent"

android:layout_height="match_parent"

>

android:id="@+id/btn2"

android:layout_width="100dp"

android:layout_height="100dp"

android:background="@color/colorPrimary"

android:text="B"

android:textSize="50sp"

app:layout_constraintTop_toBottomOf="@+id/btn1"

app:layout_constraintLeft_toLeftOf="parent"

android:visibility="gone"

/>

android:id="@+id/btn3"

android:layout_width="100dp"

android:layout_height="100dp"

android:layout_marginLeft="150dp"

android:background="@color/colorAccent"

android:text="C"

android:textSize="50sp"

app:layout_constraintLeft_toLeftOf="@+id/btn2"

app:layout_constraintTop_toBottomOf="@id/btn1"

/>

結果:

越這個屏障(跟個準确來說這個屏障會随着View的擴張而移動,使之不會讓View越過自己)Barrier有兩個重要屬性:app:barrierDirectionapp:constraint_refere

constraintlayout嵌套_Android開發知識(二十六)強大的限制布局 - ConstraintLayout的用法總結...

可以看出Button C還是可以以Button B作為錨點,它的constrain依舊生效。

,聲明一個角度和距離(半徑)來确定View的位置layout_constraintCircle是關聯的錨點View的idlayout_constraintCircleRadiusView的中心點與關聯

那如果我們想根據錨點View是否GONE而來确定margin生不生效,要怎麼做呢。

rcentlayout_constraintGuide_beginlayout_constraintGuide_endorientation用法則和在linearLayout中一樣,當作為水準參考線時

google提供了另外一套方案:

und="@color/colorPrimary"/>

layout_goneMarginStart

layout_goneMarginEnd

layout_goneMarginLeft

layout_goneMarginTop

layout_goneMarginRight

layout_goneMarginBottom

這樣我們可以設定layout_goneMarginLeft=“0dp”,進而當錨點View被設定GONE的時候,marginLeft屬性失效。

當然,我們也可以設定另外一個數值,來表示當錨點View被GONE之後,margin才生效。

無誤後回複250OK。資料發送郵件正文發送的過程:用戶端發送DATA指令;服務端回複354狀态碼,告知用戶端可以發送郵件内容;用戶端開始發送郵件正文;伺服器端回複250;用戶端發送QUIT指令結束會話

bias與居中處理

語句

layout_constraintHorizontal_bias

layout_constraintVertical_bias

解釋

在文章一開頭,我們有實作過了居中的效果。一開始接觸的時候其實有點不習慣,ConstraintLayout并沒有像RelativeLayout的居中效果的語句

而是使用(水準居中):

一開始接觸的時候其實有點不習慣,ConstraintLayout并沒有像RelativeLayout的居中效果的語句而是使用(水準居中):app:layout_constraintLeft_toLef

app:layout_constraintLeft_toLeftOf="parent"

app:layout_constraintRight_toRightOf="parent"

設定了這個屬性的View,會被左右兩邊“拉”着,結果大家用力都一樣,那麼就水準居中了

在水準居中了後,我們同樣可以使用margin來調整位置,而往往我們又需要根據比例來調整這個位置關系,這是bias屬性就用上了

pport.constraint.Groupandroid:layout_width="wrap_content"android:layout_height="wrap_content"android

在使用constrain屬性使得View水準居中後,比如想讓View水準開始位于螢幕寬度20%的位置,那麼可以:

t_constraintLeft_toRightOf="@+id/tv1"/>效果圖大緻是

app:layout_constraintLeft_toLeftOf="parent"

app:layout_constraintRight_toRightOf="parent"

app:layout_constraintHorizontal_bias="0.2"

圓弧定位

語句

layout_constraintCircle

layout_constraintCircleAngle

layout_constraintCircleRadius

解釋

這個屬性就高大上了,畢竟是其它布局所不能直接支援的。

tLeft這些。直白的了解就是:你想這個View的哪條邊去對齊另外一個View的哪一條邊的時候,就可以用這個。運用舉例舉個栗子,我們寫個ButtonA,它居中父布局(水準和垂直),然後寫第二個Butt

它的作用就是你可以相對于錨點View的中心位置,聲明一個角度和距離(半徑)來确定View的位置

nstraint.ConstraintLayout>效果:View的尺寸大小語句layout_constraintWidth_defaultlayout_constraintWidth_perc

layout_constraintCircle 是關聯的錨點View的id

layout_constraintCircleRadius View的中心點與關聯的錨點View的中心點的距離(圓弧半徑)

layout_constraintCircleAngle View的中心點與關聯的錨點View的中心點的角度關系(0到360度)

關于角度和半徑的說明,這裡貼一張官方圖:

upport.constraint.ConstraintLayout>效果截圖:Group  Group同樣是一個虛拟的View,并不參與實際繪制。它可以用來控制多個View同時hideorsh

constraintlayout嵌套_Android開發知識(二十六)強大的限制布局 - ConstraintLayout的用法總結...

舉例運作

比如以下代碼,讓Button B位于Button A的45度角,并且距離Button A中心點為150dp

traintLeft_toRightOflayout_constraintTop_toTopOflayout_constraintTop_toBottomOflayout_constraintRigh

xmlns:app="http://schemas.android.com/apk/res-auto"

xmlns:tools="http://schemas.android.com/tools"

android:layout_width="match_parent"

android:layout_height="match_parent"

>

android:id="@+id/btn1"

android:layout_width="100dp"

android:layout_height="100dp"

android:background="@color/colorAccent"

android:text="A"

android:textSize="50sp"

app:layout_constraintBottom_toBottomOf="parent"

app:layout_constraintLeft_toLeftOf="parent"

app:layout_constraintRight_toRightOf="parent"

app:layout_constraintTop_toTopOf="parent" />

android:id="@+id/btn2"

android:layout_width="100dp"

android:layout_height="100dp"

android:background="@color/colorPrimary"

android:text="B"

android:textSize="50sp"

app:layout_constraintCircle="@id/btn1"

app:layout_constraintCircleAngle="45"

app:layout_constraintCircleRadius="150dp"

>

效果:

p"android:background="@color/colorAccent"android:text="A"android:textSize="50sp"app:layout_constrain

constraintlayout嵌套_Android開發知識(二十六)強大的限制布局 - ConstraintLayout的用法總結...

View的尺寸大小

語句

layout_constraintWidth_default

layout_constraintWidth_percent

layout_constraintHeight_percent

解釋

ConstraintLayout也一樣,可以用layout_width、layout_height來确定View大小。

讓View越過自己)Barrier有兩個重要屬性:app:barrierDirectionapp:constraint_referenced_ids描述的不夠好,我們來舉個例子。假如我有這麼一個需求,

然而值得注意的是,它額外的提供給了一個0dp的屬性(MATCH_CONSTRAINT ),這不是說讓寬或高位0dp,而是一種标記。

ivelayout的相對定位,也能實作像LinearLayout一樣的比例配置設定,而且比它們還更優秀。除此之外,ConstraintLayout還提供了很多屬性和輔助類,讓我們更輕松的實作布局效果。使用

它标記的含義會随着不同的constrain設定而有不同的展現。

traintCircle是關聯的錨點View的idlayout_constraintCircleRadiusView的中心點與關聯的錨點View的中心點的距離(圓弧半徑)layout_constrai

layout_constraintWidth_default語句有三個不同的值:

yout_constraintGuide_endorientation用法則和在linearLayout中一樣,當作為水準參考線時需指定:android:orientation=“horizontal

預設是spread,意思是占用所有的符合限制的空間

比如寬度鋪滿:

mageViewandroid:id="@+id/bottom"android:layout_width="wrap_content"android:layout_height="wrap_conte

...

android:layout_width="0dp"

app:layout_constraintRight_toRightOf="parent"

app:layout_constraintTop_toTopOf="parent"

...

這樣的話則就會鋪滿整個寬度。 (google不推薦使用match_parent,有這個高大上的屬性來代替)

指令;服務端回複354狀态碼,告知用戶端可以發送郵件内容;用戶端開始發送郵件正文;伺服器端回複250;用戶端發送QUIT指令結束會話;伺服器回複221,告訴用戶端它正在關閉傳輸通道。總結以上就是一封郵

percent, 顧名思義就是按照百分比來表示寬度

比如,水準居中後View的寬度為總寬度的50%,則可以這麼寫:

像RelativeLayout的居中效果的語句而是使用(水準居中):app:layout_constraintLeft_toLeftOf="parent"app:layout_constraintRi

...

android:layout_width="0dp"

android:layout_height="100dp"

app:layout_constraintWidth_default="percent"

app:layout_constraintWidth_percent="0.5"

app:layout_constraintLeft_toLeftOf="parent"

app:layout_constraintRight_toRightOf="parent"

...

運作:

可以看下官方提供的圖:  可以看出,這個效果其實是相當于Linearlayout的鍊。它也一樣和LinearLayout一樣用weight來表示權重比如在水準方向上使用layout_constrain

constraintlayout嵌套_Android開發知識(二十六)強大的限制布局 - ConstraintLayout的用法總結...

wrap

比對内容大小但不會超過限制的限制。(和指定寬度為wrap_content的差別是不會超過限制限制)

ansferProtocol」,這是來自百度百科的解釋:SMTP是一個相對簡單的基于文本的協定。在其之上指定了一條消息的一個或多個接收者(在大多數情況下被确認是存在的),然後消息文本會被傳輸。可以很簡

這個跟直接指定寬度為wrap_content有相似之處,不同的是:

"app:layout_constraintTop_toBottomOf="@id/btn1"/>

指定layout_constraintWidth_default="wrap"時不會超過限制限制的大小,而直接指定寬度為wrap_content則可以超過限制限制的大小

traintTop_toBottomOf="@+id/tv1"/>

然而google又提供了一對屬性

d、BaseLine):這個東西特别好用,使得我們可以代替RelativeLayout來做相對位置的處理邊距(Margin)語句android:layout_marginStartandroid:la

app:layout_constrainedWidth=”true|false”

app:layout_constrainedHeight=”true|false”

當直接指定寬度為wrap_content時,可以指定layout_constrainedWidth="true"則不會超過限制大小。

但是這樣看來感覺有點多此一舉了,感覺wrap屬性沒大用處了

nt時,可以指定layout_constrainedWidth="true"則不會超過限制大小。但是這樣看來感覺有點多此一舉了,感覺wrap屬性沒大用處了  由上,ConstraintLayout的強

由上,ConstraintLayout的強大之處真不是一點兩大點。我們現在可以輕松自由的根據比例來指定View的寬高了。

雖然說LinearLayout也能做到一點,但是使用LinearLayout往往使得布局有更多的嵌套,而ConstraintLayout的出發點就是位了減少嵌套。

ndroid:layout_width="200dp"android:layout_height="200dp"android:layout_marginTop="4dp"android:layout

View的尺寸比例

語句

layout_constraintDimensionRatio

解釋

ConstraintLayout不僅支援寬高比例的配置,還是配置寬高比例根據其中的一個而根據比例計算出另外一個的

ndroid.com/apk/res-auto"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_pa

當寬度高度有一個為0dp時,另外一個可以根據指定的ratio來确認自己的大小。

cent"app:layout_constraintLeft_toLeftOf="parent"app:layout_constraintRight_toRightOf="parent"app:lay

layout_constraintDimensionRatio指定的格式可以是"width:height"的形式,也可以是width/height的比例值

上的屬性來代替)percent,顧名思義就是按照百分比來表示寬度比如,水準居中後View的寬度為總寬度的50%,則可以這麼寫:...android:layout_width="0dp"android:

比如寬度為100dp radio指定了“2:1”,那麼高度就是50dp。

parent"android:layout_height="match_parent">

代碼如下:

otocol」,這是來自百度百科的解釋:SMTP是一個相對簡單的基于文本的協定。在其之上指定了一條消息的一個或多個接收者(在大多數情況下被确認是存在的),然後消息文本會被傳輸。可以很簡單地通過teln

entthisiscontentthisiscontent"android:textSize="24sp"app:layout_constraintLeft_toRightOf="@+id/tv1"/

ns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height=

...

android:layout_width="0dp"

android:layout_height="100dp"

app:layout_constraintDimensionRatio="2:1"

...

上面的2:1 也可以寫成 2, 也就是寬和 高的比值

BaseLine)效果類似于RelativeLayout的layout_toLeftOf、layout_alignParentLeft這些。直白的了解就是:你想這個View的哪條邊去對齊另外一個Vie

如果兩個都為0dp,那麼尺寸就是滿足限制限制的最大尺寸了。

CircleRadius="150dp">效果:View的尺

比如我在根布局ConstraintLayout裡想指定一個View,它居中螢幕,鋪滿寬度,并且高度很寬度一樣大小,那麼可以這麼寫:

_constraintTop_toBottomOf="@+id/guideline1"/>

android:id="@+id/btn1"

android:layout_width="0dp"

android:layout_height="0dp"

app:layout_constraintDimensionRatio="1"

app:layout_constraintBottom_toBottomOf="parent"

app:layout_constraintLeft_toLeftOf="parent"

app:layout_constraintRight_toRightOf="parent"

app:layout_constraintTop_toTopOf="parent"

...

/>

運作效果:

_content"android:layout_height="wrap_content"android:text="内容:"android:textSize="24sp"app:layout_con

constraintlayout嵌套_Android開發知識(二十六)強大的限制布局 - ConstraintLayout的用法總結...

如果還想單獨限制寬度或者高度的話,layout_constraintDimensionRatio可以這麼寫:

/btn1"android:layout_width="100dp"android:layout_height="100dp"android:background="@color/colorAccen

在layout_constraintDimensionRatio寫比例的時候前面加個W或H,來表示要限制的是寬還是高

比如高度鋪滿,而寬度是高度是二分之一:

ools"android:layout_width="match_parent"android:layout_height="match_parent">

android:id="@+id/btn1"

android:layout_width="0dp"

android:layout_height="0dp"

app:layout_constraintDimensionRatio="W,1:2"

app:layout_constraintBottom_toBottomOf="parent"

app:layout_constraintLeft_toLeftOf="parent"

app:layout_constraintRight_toRightOf="parent"

app:layout_constraintTop_toTopOf="parent"

...

/>

運作結果:

性指定需要添加屏障的View,進而這些View就不會超越這個屏障(跟個準确來說這個屏障會随着View的擴張而移動,使之不會讓View越過自己)Barrier有兩個重要屬性:app:barrierDir

constraintlayout嵌套_Android開發知識(二十六)強大的限制布局 - ConstraintLayout的用法總結...

View的最大最小尺寸

語句

layout_constraintWidth_min

layout_constraintWidth_max

layout_constraintHeight_max

layout_constraintHeight_min

View鍊

語句

layout_constraintHorizontal_chainStyle

layout_constraintHorizontal_weight

layout_constraintVertical_chainStyle

layout_constraintVertical_weight

解釋

如果在一個水準或者垂直方向上,一排View之間兩兩互相限制,則為鍊

支援的。它的作用就是你可以相對于錨點View的中心位置,聲明一個角度和距離(半徑)來确定View的位置layout_constraintCircle是關聯的錨點View的idlayout_constr

如圖:

onlayout_constraintGuide_percentlayout_constraintGuide_beginlayout_constraintGuide_endorientation用法則

constraintlayout嵌套_Android開發知識(二十六)強大的限制布局 - ConstraintLayout的用法總結...

可以通過layout_constraintHorizontal_chainStyle來設定這條鍊

用戶端向伺服器端發送發件箱、所有收件箱位址,伺服器驗證無誤後回複250OK。資料發送郵件正文發送的過程:用戶端發送DATA指令;服務端回複354狀态碼,告知用戶端可以發送郵件内容;用戶端開始發送郵件正

spread

預設的方式,也就是上圖的樣子

ias解釋  在文章一開頭,我們有實作過了居中的效果。一開始接觸的時候其實有點不習慣,ConstraintLayout并沒有像RelativeLayout的居中效果的語句而是使用(水準居中):app:

spread_inside

和spread的差別是沒算兩端的限制

read_inside和spread的差別是沒算兩端的限制packed所有元素擠在中間,可以使用bias來改變位置偏移具體可以看下官方提供的圖:  可以看出,這個效果其實是相當于Linearlayou

packed

所有元素擠在中間,可以使用bias來改變位置偏移

ag="android.support.constraint.ConstraintLayout"使之按照ConstraintLayout的限制規則來處理)其後,我們有了模版布局之後,假如我們想把這兩個

具體可以看下官方提供的圖:

模型中的其他協定,它們跟這種簡單約定類似,隻不過通信規則更複雜一些!SMTP協定基礎SMTP全稱為「SimpleMailTransferProtocol」,這是來自百度百科的解釋:SMTP是一個相對簡

constraintlayout嵌套_Android開發知識(二十六)強大的限制布局 - ConstraintLayout的用法總結...

可以看出,這個效果其實是相當于Linearlayout的鍊。它也一樣和LinearLayout一樣用weight來表示權重

比如在水準方向上使用layout_constraintHorizontal_weight來配置設定剩餘的空間。

但是它不是和layout_weight屬性全部一樣,因為在LinearLayout中,layout_weight屬性是不管寬高怎麼設定它都會生效的

ntDimensionRatio="W,1:2"app:layout_constraintBottom_toBottomOf="parent"app:layout_constraintLeft_toL

而layout_constraintHorizontal_weight使用的前提下必須chainStyle是spread的形式(預設就是了),還有需要設定0dp後才會有效果的

ut_constraintHeight_percent="0.5"app:layout_constraintHeight_default="percent"app:content="@+id/top"

輔助布局

GuideLine

GuideLine就是指導線,參考線的意思,有水準參考線和豎直參考線兩種。在ConstraintLayout裡面View的定位往往需要找到對應參考的錨點View,而有時候我們并不好找到這個View,或者說一定要先建一個參考的錨點View出來後才行,在這種情況下,GuideLine就有很大用途了。

的是對知識的總結,是以還是有必要堅持寫下去。如果你也看到了最後,請給我一個贊支援一下吧!。版權聲明:本文為部落客原創文章,遵循CC4.0by-sa版權協定,轉載請附上原文出處連結和本聲明。本文連結:ht

GuideLine就是一個虛拟的輔助線,友善其它的View以此作為錨點,而它自身并不會參與繪制。

tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="ma

GuideLine有以下幾個重要的屬性:

一個View,它居中螢幕,鋪滿寬度,并且高度很寬度一樣大小,那麼可以這麼寫:

orientation

layout_constraintGuide_percent

layout_constraintGuide_begin

layout_constraintGuide_end

orientation用法則和在linearLayout中一樣,當作為水準參考線時需指定:android:orientation=“horizontal”,想做為垂直參考線時指定:android:orientation=“vertical”

要屬性:app:content比如我們來寫一個模版布局,這個布局分成上下兩個部分。<?xmlversion ="1.0"encoding="utf-8"?>

layout_constraintGuide_percent則是指定參考線的百分比位置,根據orientation指定的方向調整位置。

rrierandroid:id="@+id/barrier"android:layout_width="wrap_content"android:layout_height="wrap_content

layout_constraintGuide_begin和 layout_constraintGuide_end則是參考線距離開始或結束的具體數值

id:layout_marginStartandroid:layout_marginEndandroid:layout_marginLeftandroid:layout_marginTopandroi

舉個例子,我們的定義一條垂直居中的參考線,再定義一個Button A貼在這條參考線的下方:

屬性沒大用處了  由上,ConstraintLayout的強大之處真不是一點兩大點。我們現在可以輕松自由的根據比例來指定View的寬高了。雖然說LinearLayout也能做到一點,但是使用Linea

xmlns:app="http://schemas.android.com/apk/res-auto"

xmlns:tools="http://schemas.android.com/tools"

android:layout_width="match_parent"

android:layout_height="match_parent"

>

android:id="@+id/guideline1"

android:layout_width="22dp"

android:layout_height="11dp"

android:orientation="horizontal"

app:layout_constraintLeft_toLeftOf="parent"

app:layout_constraintRight_toRightOf="parent"

app:layout_constraintGuide_percent="0.5"

/>

android:layout_width="200dp"

android:layout_height="200dp"

android:layout_marginTop="4dp"

android:layout_marginBottom="8dp"

android:background="@color/colorAccent"

android:text="A"

android:textSize="50sp"

app:layout_constraintTop_toBottomOf="@+id/guideline1"

/>

效果截圖:

己)Barrier有兩個重要屬性:app:barrierDirectionapp:constraint_referenced_ids描述的不夠好,我們來舉個例子。假如我有這麼一個需求,左邊有兩個Tex

t_marginTop="4dp"android:layout_marginBottom="8dp"android:background="@color/colorPrimary"android:te

constraintlayout嵌套_Android開發知識(二十六)強大的限制布局 - ConstraintLayout的用法總結...

Group

Group同樣是一個虛拟的View,并不參與實際繪制。它可以用來控制多個View同時hide or show,

之前我們往往對多個View需要同時顯示和隐藏的時候往往需要一個一個去控制。而Group則提供了這個便利,它可以通過指定一組View,來達到控制這一組View的顯示狀态。

Right_toRightOf="parent"app:layout_constraintTop_toTopOf="parent"app:layout_constraintBottom_toBotto

Group有兩個重要屬性:

oid:layout_width="0dp"android:layout_height="100dp"app:layout_constraintWidth_default="percent"app:l

android:visibility

app:constraint_referenced_ids

比如同時控制Button A 和 B 為GONE狀态。(當然,這裡隻是舉例了XML,但一般是寫在代碼裡)

nstraint.Groupandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:visibil

xmlns:app="http://schemas.android.com/apk/res-auto"

xmlns:tools="http://schemas.android.com/tools"

android:layout_width="match_parent"

android:layout_height="match_parent"

>

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:visibility="invisible"

app:constraint_referenced_ids="btn1,btn2"

/>

android:id="@+id/btn1"

android:layout_width="200dp"

android:layout_height="200dp"

android:layout_marginTop="4dp"

android:layout_marginBottom="8dp"

android:background="@color/colorAccent"

android:text="A"

android:textSize="50sp"

app:layout_constraintLeft_toLeftOf="parent"

app:layout_constraintRight_toRightOf="parent"

/>

android:id="@+id/btn2"

android:layout_width="200dp"

android:layout_height="200dp"

android:layout_marginTop="4dp"

android:layout_marginBottom="8dp"

android:background="@color/colorPrimary"

android:text="B"

android:textSize="50sp"

app:layout_constraintLeft_toLeftOf="parent"

app:layout_constraintRight_toRightOf="parent"

app:layout_constraintTop_toBottomOf="@+id/btn1" />

上面這樣就什麼也沒看到了,因為Button A 和B被同時隐藏了。

raintLeft_toRightOf="@+id/tv1"/>效果圖大緻是這樣:  由于

需要注意的是,Group在寫一組控件id的時候是逗号隔開,然後隻寫id的名字。

t.ConstraintLayout>效果:View的尺寸大小語句layout_constraintWidth_defaultlayout_constraintWidth_percentlayo

Placeholder

Placeholder是一個占位布局,同樣它本身不會參與繪制.

它有一個app:content屬性,可以通過綁定一個View,當綁定了一個View之後,被綁定的View會相當于被GONE掉,而顯示到Placeholder中來。

是以,它适合用來編寫一些模版布局,在适當的情況下利用Placeholder先提前占位,然後再來替換成目标View。

onstraint.ConstraintLayout>效果截圖:Group  Group同樣是一個虛拟的View,并不參與實際繪制。它可以用來控制多個View同時hideorshow,之前我們往

Placeholder有一個重要屬性:

d:textSize="24sp"app:layout_constraintLeft_toLeftOf="parent"app:layout_constraintTop_toTopOf="parent

app:content

比如我們來寫一個模版布局,這個布局分成上下兩個部分。

ft_toRightOflayout_constraintTop_toTopOflayout_constraintTop_toBottomOflayout_constraintRight_toLeft

xmlns:app="http://schemas.android.com/apk/res-auto"

xmlns:tools="http://schemas.android.com/tools"

android:layout_width="match_parent"

android:layout_height="match_parent"

tools:layout_editor_absoluteX="0dp"

tools:layout_editor_absoluteY="81dp"

tools:parentTag="android.support.constraint.ConstraintLayout">

android:id="@+id/template_top"

android:layout_width="0dp"

android:layout_height="0dp"

app:layout_constraintHeight_percent="0.5"

app:layout_constraintHeight_default="percent"

app:content="@+id/top"

app:layout_constraintLeft_toLeftOf="parent"

app:layout_constraintRight_toRightOf="parent" />

android:id="@+id/template_bottom"

android:layout_width="0dp"

android:layout_height="0dp"

app:layout_constraintHeight_percent="0.5"

app:content="@+id/bottom"

app:layout_constraintBottom_toBottomOf="parent"

app:layout_constraintLeft_toLeftOf="parent"

app:layout_constraintRight_toRightOf="parent" />

(注:我們用一個merge标簽來避免模版布局帶來的備援嵌套,利用tools:parentTag="android.support.constraint.ConstraintLayout"使之按照ConstraintLayout的限制規則來處理)

d:background="@color/colorAccent"android:text="A"android:textSize="50sp"app:layout_constraintBottom_

其後,我們有了模版布局之後,假如我們想把這兩個模版布局替換成兩個ImageView,則可以這麼做:

parent">

xmlns:app="http://schemas.android.com/apk/res-auto"

xmlns:tools="http://schemas.android.com/tools"

android:layout_width="match_parent"

android:layout_height="match_parent">

android:id="@+id/top"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:background="@color/colorPrimary"

/>

android:id="@+id/bottom"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:background="@color/colorAccent"

/>

效果截圖:

己)Barrier有兩個重要屬性:app:barrierDirectionapp:constraint_referenced_ids描述的不夠好,我們來舉個例子。假如我有這麼一個需求,左邊有兩個Tex

t_marginTop="4dp"android:layout_marginBottom="8dp"android:background="@color/colorPrimary"android:te

constraintlayout嵌套_Android開發知識(二十六)強大的限制布局 - ConstraintLayout的用法總結...

可以看到,我們利用include标簽引入的模版布局,兩個Placeholder實際上被替換成了ImageView,而原來定義的ImageView則不會顯示。

需要注意的是include标簽需要放在要替換Placeholder的View的前面,不然不會被替換。

而且定義的ImageView已經沒必要再配置那些限制屬性了,因為這些限制屬性已經在Placeholder裡面聲明了。

rcle是關聯的錨點View的idlayout_constraintCircleRadiusView的中心點與關聯的錨點View的中心點的距離(圓弧半徑)layout_constraintCircle

有了這個東西之後,我們可以很輕松的根據模版布局填充不同的View。

nstraintGuide_endorientation用法則和在linearLayout中一樣,當作為水準參考線時需指定:android:orientation=“horizontal”,想做為垂直

Barrier

沒錯,他就是一個屏障器。它可以阻止View越過自己,當某個View要越過自己的時候,Barrier會自動移動,進而避免被覆寫

android:id="@+id/bottom"android:layout_width="wrap_content"android:layout_height="wrap_content"andro

它也是通過constraint_referenced_ids屬性指定需要添加屏障的View,進而這些View就不會超越這個屏障(跟個準确來說這個屏障會随着View的擴張而移動,使之不會讓View越過自己)

354狀态碼,告知用戶端可以發送郵件内容;用戶端開始發送郵件正文;伺服器端回複250;用戶端發送QUIT指令結束會話;伺服器回複221,告訴用戶端它正在關閉傳輸通道。總結以上就是一封郵件所經曆的完整過

Barrier有兩個重要屬性:

尺寸語句View鍊語句解釋輔助布局GuideLineGroupPlaceholderBarrier結束語前言  在ConstraintLayout出現之前,我們編寫布局往往少不了多層嵌套,很多效果需要

app:barrierDirection

app:constraint_referenced_ids

描述的不夠好,我們來舉個例子。

的圖:  可以看出,這個效果其實是相當于Linearlayout的鍊。它也一樣和LinearLayout一樣用weight來表示權重比如在水準方向上使用layout_constraintHorizon

假如我有這麼一個需求,左邊有兩個TextView表示兩個單行的文字,右邊是一個Textview表示多行的。

限制規則來處理)其後,我們有了模版布局之後,假如我們想把這兩個模版布局替換成兩個ImageView,則可以這麼做:<?xmlversion ="1.0"encoding="utf-8"?>&

代碼如下:

otocol」,這是來自百度百科的解釋:SMTP是一個相對簡單的基于文本的協定。在其之上指定了一條消息的一個或多個接收者(在大多數情況下被确認是存在的),然後消息文本會被傳輸。可以很簡單地通過teln

entthisiscontentthisiscontent"android:textSize="24sp"app:layout_constraintLeft_toRightOf="@+id/tv1"/

ns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height=

xmlns:app="http://schemas.android.com/apk/res-auto"

xmlns:tools="http://schemas.android.com/tools"

android:layout_width="match_parent"

android:layout_height="match_parent">

android:id="@+id/tv1"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:text="内容:"

android:textSize="24sp"

app:layout_constraintLeft_toLeftOf="parent"

app:layout_constraintTop_toTopOf="parent"

/>

android:id="@+id/tv2"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:text="12345678"

android:textSize="24sp"

app:layout_constraintLeft_toLeftOf="parent"

app:layout_constraintTop_toBottomOf="@+id/tv1"

/>

android:id="@+id/tv3"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:text="this is content this is content this is content this is content this is content this is content"

android:textSize="24sp"

app:layout_constraintLeft_toRightOf="@+id/tv1"

/>

效果圖大緻是這樣:

yout_constraintTop_toBottomOf="@id/btn1"/>結果:

constraintlayout嵌套_Android開發知識(二十六)強大的限制布局 - ConstraintLayout的用法總結...

由于ConstraintLayout的限制規則,一個View隻可以指定另外一個View作為錨點。是以這裡右邊的TextView無論是指tv1還是tv2的時候,都有可能因為tv1或者tv2中文字太長而遮擋到tv3

"percent"app:content="@+id/top"app:layout_constraintLeft_toLeftOf="parent"app:layout_constraintRight

從效果圖可以看到,由于錨點View指定的是tv1,而tv2的文字更長,它便重疊在tv3。

sa版權協定,轉載請附上原文出處連結和本聲明。本文連結:https://blog.csdn.net/wojiushiwo945you/article/details/98367061背景我們常使用郵件

這個時候Barrier的作用就來了,我們可以通過Barrier可以指定tv1、tv2使這兩個View不會越過Barrier。

arent"android:layout_height="match_parent">

而tv3可以設定這個Barrier為錨點,限制在它的右邊。 代碼如下:

"android:layout_width="0dp"android:layout_height="0dp"app:layout_constraintDimensionRatio="1"app:lay

xmlns:app="http://schemas.android.com/apk/res-auto"

xmlns:tools="http://schemas.android.com/tools"

android:layout_width="match_parent"

android:layout_height="match_parent">

android:id="@+id/tv1"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:text="内容:"

android:textSize="24sp"

app:layout_constraintLeft_toLeftOf="parent"

app:layout_constraintTop_toTopOf="parent"

/>

android:id="@+id/tv2"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:text="12345678"

android:textSize="24sp"

app:layout_constraintLeft_toLeftOf="parent"

app:layout_constraintTop_toBottomOf="@+id/tv1"

/>

android:id="@+id/barrier"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

app:barrierDirection="right"

app:constraint_referenced_ids="tv1,tv2" />

android:id="@+id/tv3"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:text="this is content this is content this is content this is content this is content this is content"

android:textSize="24sp"

app:layout_constraintLeft_toRightOf="@+id/barrier" />

效果圖如下:

="utf-8"?>

constraintlayout嵌套_Android開發知識(二十六)強大的限制布局 - ConstraintLayout的用法總結...

可以看到左邊有一條黑邊屏障,這裡隻是看設計效果,實際上并不會顯示在螢幕上的。

android:layout_marginTopandroid:layout_marginRightandroid:layout_marginBottom解釋  在ConstraintLayout裡,

結束語

終于結束了,其實一直很懶得寫部落格,因為總結一篇實在太耗費精力和時間了。但是換來的是對知識的總結,是以還是有必要堅持寫下去。

雖然說LinearLayout也能做到一點,但是使用LinearLayout往往使得布局有更多的嵌套,而ConstraintLayout的出發點就是位了減少嵌套。View的尺寸比例語句layout_c

如果你也看到了最後,請給我一個贊支援一下吧! 。

@color/colorPrimary"android:text="B"android:textSize="50sp"app:layout_constraintLeft_toLeftOf="paren