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="
(注:如果被拿來做限制參考的View是它的父布局的話,那麼就不是寫id,而是寫parent)
t="match_parent">
View的(Left、Top、Right、Bottom、Start、End、BaseLine):
nt"android:textSize="24sp"app:layout_constraintLeft_toRightOf="@+id/tv1"/>
這個東西特别好用,使得我們可以代替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
可以看出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
舉例運作
比如以下代碼,讓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
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
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
如果還想單獨限制寬度或者高度的話,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
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用法則
可以通過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是一個相對簡
可以看出,這個效果其實是相當于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
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
可以看到,我們利用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的限制規則,一個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"?>
可以看到左邊有一條黑邊屏障,這裡隻是看設計效果,實際上并不會顯示在螢幕上的。
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