文章目錄
- 前言
- 用法
-
- 相對定位
-
- 語句
- 解釋
- 運用舉例
- 邊距(Margin)
-
- 語句
- 解釋
- bias與居中處理
-
- 語句
- 解釋
- 圓弧定位
-
- 語句
- 解釋
- 舉例運作
- View的尺寸大小
-
- 語句
- 解釋
- View的尺寸比例
-
- 語句
- 解釋
- View的最大最小尺寸
-
- 語句
- View鍊
-
- 語句
- 解釋
- 輔助布局
-
- GuideLine
- Group
- Placeholder
- Barrier
-
- 結束語
前言
在ConstraintLayout出現之前,我們編寫布局往往少不了多層嵌套,很多效果需要結合Relativelayout、LinearLayout等容器的互相嵌套來完成,雖然頁面的效果實作了,但卻帶來很大的性能消耗,而往往還因為适配問題而帶來更多的麻煩。
而ConstraintLayout神奇的地方在于,它不僅能夠實作Relativelayout的相對定位,也能實作像LinearLayout一樣的比例配置設定,而且比它們還更優秀。除此之外,ConstraintLayout還提供了很多屬性和輔助類,讓我們更輕松的實作布局效果。
使用ConstraintLayout之後往往能把之前嵌套好幾層的布局幹掉。進而大大減少了布局嵌套層次,提高了性能。
ConstraintLayout也不是個什麼新鮮的東西了,google最早在16年I/O大會上就釋出了這個全新的布局,而實際上據我在各個技術群上的了解,貌似實際把ConstraintLayout用在項目裡的人相對較少,也可能是受項目限制,不友善重構布局。也有一部分因為不熟悉這個布局的使用,進而不敢輕易用在項目中,筆者在一開始使用這個布局的時候,就被它的靈活性驚豔到了。而且容易用以前布局的思維來用在了ConstraintLayout中,這是不可取的。是以深感ConstraintLayout需要适應一段時間後就會慢慢的适應這種布局方式,在适應後也會很不想用其它的布局了。
為此我總結了以下用法,希望能夠幫助到你們,也為自己知識做一個總結。
用法
本篇文章講解的是ConstraintLayout的基礎用法,基本上ConstraintLayout的要點已經在這裡了。
相對定位
語句
- 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)
效果類似于RelativeLayout的layout_toLeftOf、layout_alignParentLeft這些。
直白的了解就是:你想這個View的哪條邊去對齊另外一個View的哪一條邊的時候,就可以用這個。
運用舉例
舉個栗子,我們寫個Button A,它居中父布局(水準和垂直),然後寫第二個Button B,讓它處于第一個Button下方。
代碼如下:
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
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"
>
<Button
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"
/>
<Button
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"
/>
</android.support.constraint.ConstraintLayout>
運作結果如圖:
(注:如果被拿來做限制參考的View是它的父布局的話,那麼就不是寫id,而是寫parent)
View的(Left、Top、Right、Bottom、Start、End、BaseLine):
這個東西特别好用,使得我們可以代替RelativeLayout來做相對位置的處理
邊距(Margin)
語句
- android:layout_marginStart
- android:layout_marginEnd
- android:layout_marginLeft
- android:layout_marginTop
- android:layout_marginRight
- android:layout_marginBottom
解釋
在ConstraintLayout裡,也支援layout_marginLeft這種格式。隻是區分的一點是,在使用這句代碼時比必須先指定下Left是相對于哪個View哪個位置
比如我們想讓上面的bButton B距離左邊50dp,那麼必須要先聲明它的left相對于父布局的left:
app:layout_constraintLeft_toLeftOf="parent"
android:layout_marginLeft="50dp"
這樣才能起作用。
值得注意的是,margin确定的邊距并不會因為做為錨點的View被設定成GONE了而失效。
比如有以下代碼:
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
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"
>
<Button
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"
/>
<Button
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"
/>
</android.support.constraint.ConstraintLayout>
結果:
可以看出Button C還是可以以Button B作為錨點,它的constrain依舊生效。
那如果我們想根據錨點View是否GONE而來确定margin生不生效,要怎麼做呢。
google提供了另外一套方案:
- layout_goneMarginStart
- layout_goneMarginEnd
- layout_goneMarginLeft
- layout_goneMarginTop
- layout_goneMarginRight
- layout_goneMarginBottom
這樣我們可以設定layout_goneMarginLeft=“0dp”,進而當錨點View被設定GONE的時候,marginLeft屬性失效。
當然,我們也可以設定另外一個數值,來表示當錨點View被GONE之後,margin才生效。
bias與居中處理
語句
- layout_constraintHorizontal_bias
- layout_constraintVertical_bias
解釋
在文章一開頭,我們有實作過了居中的效果。一開始接觸的時候其實有點不習慣,ConstraintLayout并沒有像RelativeLayout的居中效果的語句
而是使用(水準居中):
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
設定了這個屬性的View,會被左右兩邊“拉”着,結果大家用力都一樣,那麼就水準居中了
在水準居中了後,我們同樣可以使用margin來調整位置,而往往我們又需要根據比例來調整這個位置關系,這是bias屬性就用上了
在使用constrain屬性使得View水準居中後,比如想讓View水準開始位于螢幕寬度20%的位置,那麼可以:
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintHorizontal_bias="0.2"
圓弧定位
語句
- layout_constraintCircle
- layout_constraintCircleAngle
- layout_constraintCircleRadius
解釋
這個屬性就高大上了,畢竟是其它布局所不能直接支援的。
它的作用就是你可以相對于錨點View的中心位置,聲明一個角度和距離(半徑)來确定View的位置
- layout_constraintCircle 是關聯的錨點View的id
- layout_constraintCircleRadius View的中心點與關聯的錨點View的中心點的距離(圓弧半徑)
- layout_constraintCircleAngle View的中心點與關聯的錨點View的中心點的角度關系(0到360度)
關于角度和半徑的說明,這裡貼一張官方圖:
舉例運作
比如以下代碼,讓Button B位于Button A的45度角,并且距離Button A中心點為150dp
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
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"
>
<Button
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" />
<Button
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"
></Button>
</android.support.constraint.ConstraintLayout>
效果:
View的尺寸大小
語句
- layout_constraintWidth_default
- layout_constraintWidth_percent
- layout_constraintHeight_percent
解釋
ConstraintLayout也一樣,可以用layout_width、layout_height來确定View大小。
然而值得注意的是,它額外的提供給了一個0dp的屬性(MATCH_CONSTRAINT ),這不是說讓寬或高位0dp,而是一種标記。
它标記的含義會随着不同的constrain設定而有不同的展現。
layout_constraintWidth_default語句有三個不同的值:
- 預設是spread,意思是占用所有的符合限制的空間
比如寬度鋪滿:
...
android:layout_width="0dp"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent"
...
這樣的話則就會鋪滿整個寬度。 (google不推薦使用match_parent,有這個高大上的屬性來代替)
- percent, 顧名思義就是按照百分比來表示寬度
比如,水準居中後View的寬度為總寬度的50%,則可以這麼寫:
...
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"
...
運作:
- wrap
比對内容大小但不會超過限制的限制。(和指定寬度為wrap_content的差別是不會超過限制限制)
這個跟直接指定寬度為wrap_content有相似之處,不同的是:
指定layout_constraintWidth_default="wrap"時不會超過限制限制的大小,而直接指定寬度為wrap_content則可以超過限制限制的大小
然而google又提供了一對屬性
- app:layout_constrainedWidth=”true|false”
- app:layout_constrainedHeight=”true|false”
當直接指定寬度為wrap_content時,可以指定layout_constrainedWidth="true"則不會超過限制大小。
但是這樣看來感覺有點多此一舉了,感覺wrap屬性沒大用處了
由上,ConstraintLayout的強大之處真不是一點兩大點。我們現在可以輕松自由的根據比例來指定View的寬高了。
雖然說LinearLayout也能做到一點,但是使用LinearLayout往往使得布局有更多的嵌套,而ConstraintLayout的出發點就是位了減少嵌套。
View的尺寸比例
語句
- layout_constraintDimensionRatio
解釋
ConstraintLayout不僅支援寬高比例的配置,還是配置寬高比例根據其中的一個而根據比例計算出另外一個的
當寬度高度有一個為0dp時,另外一個可以根據指定的ratio來确認自己的大小。
layout_constraintDimensionRatio指定的格式可以是"width:height"的形式,也可以是width/height的比例值
比如寬度為100dp radio指定了“2:1”,那麼高度就是50dp。
代碼如下:
...
android:layout_width="0dp"
android:layout_height="100dp"
app:layout_constraintDimensionRatio="2:1"
...
上面的2:1 也可以寫成 2, 也就是寬和 高的比值
如果兩個都為0dp,那麼尺寸就是滿足限制限制的最大尺寸了。
比如我在根布局ConstraintLayout裡想指定一個View,它居中螢幕,鋪滿寬度,并且高度很寬度一樣大小,那麼可以這麼寫:
<Button
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"
...
/>
運作效果:
如果還想單獨限制寬度或者高度的話,layout_constraintDimensionRatio可以這麼寫:
在layout_constraintDimensionRatio寫比例的時候前面加個W或H,來表示要限制的是寬還是高
比如高度鋪滿,而寬度是高度是二分之一:
<Button
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的最大最小尺寸
語句
- 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之間兩兩互相限制,則為鍊
如圖:
可以通過layout_constraintHorizontal_chainStyle來設定這條鍊
- spread
預設的方式,也就是上圖的樣子
- spread_inside
和spread的差別是沒算兩端的限制
- packed
所有元素擠在中間,可以使用bias來改變位置偏移
具體可以看下官方提供的圖:
可以看出,這個效果其實是相當于Linearlayout的鍊。它也一樣和LinearLayout一樣用weight來表示權重
比如在水準方向上使用layout_constraintHorizontal_weight來配置設定剩餘的空間。
但是它不是和layout_weight屬性全部一樣,因為在LinearLayout中,layout_weight屬性是不管寬高怎麼設定它都會生效的
而layout_constraintHorizontal_weight使用的前提下必須chainStyle是spread的形式(預設就是了),還有需要設定0dp後才會有效果的
輔助布局
GuideLine
GuideLine就是指導線,參考線的意思,有水準參考線和豎直參考線兩種。在ConstraintLayout裡面View的定位往往需要找到對應參考的錨點View,而有時候我們并不好找到這個View,或者說一定要先建一個參考的錨點View出來後才行,在這種情況下,GuideLine就有很大用途了。
GuideLine就是一個虛拟的輔助線,友善其它的View以此作為錨點,而它自身并不會參與繪制。
GuideLine有以下幾個重要的屬性:
- orientation
- layout_constraintGuide_percent
- layout_constraintGuide_begin
- layout_constraintGuide_end
orientation用法則和在linearLayout中一樣,當作為水準參考線時需指定:android:orientation=“horizontal”,想做為垂直參考線時指定:android:orientation=“vertical”
layout_constraintGuide_percent則是指定參考線的百分比位置,根據orientation指定的方向調整位置。
layout_constraintGuide_begin和 layout_constraintGuide_end則是參考線距離開始或結束的具體數值
舉個例子,我們的定義一條垂直居中的參考線,再定義一個Button A貼在這條參考線的下方:
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
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.support.constraint.Guideline
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"
/>
<Button
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"
/>
</android.support.constraint.ConstraintLayout>
效果截圖:
Group
Group同樣是一個虛拟的View,并不參與實際繪制。它可以用來控制多個View同時hide or show,
之前我們往往對多個View需要同時顯示和隐藏的時候往往需要一個一個去控制。而Group則提供了這個便利,它可以通過指定一組View,來達到控制這一組View的顯示狀态。
Group有兩個重要屬性:
- android:visibility
- app:constraint_referenced_ids
比如同時控制Button A 和 B 為GONE狀态。(當然,這裡隻是舉例了XML,但一般是寫在代碼裡)
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
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.support.constraint.Group
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:visibility="invisible"
app:constraint_referenced_ids="btn1,btn2"
/>
<Button
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"
/>
<Button
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" />
</android.support.constraint.ConstraintLayout>
上面這樣就什麼也沒看到了,因為Button A 和B被同時隐藏了。
需要注意的是,Group在寫一組控件id的時候是逗号隔開,然後隻寫id的名字。
Placeholder
Placeholder是一個占位布局,同樣它本身不會參與繪制.
它有一個app:content屬性,可以通過綁定一個View,當綁定了一個View之後,被綁定的View會相當于被GONE掉,而顯示到Placeholder中來。
是以,它适合用來編寫一些模版布局,在适當的情況下利用Placeholder先提前占位,然後再來替換成目标View。
Placeholder有一個重要屬性:
- app:content
比如我們來寫一個模版布局,這個布局分成上下兩個部分。
<?xml version="1.0" encoding="utf-8"?>
<merge xmlns:android="http://schemas.android.com/apk/res/android"
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.support.constraint.Placeholder
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.support.constraint.Placeholder
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>
(注:我們用一個merge标簽來避免模版布局帶來的備援嵌套,利用tools:parentTag="android.support.constraint.ConstraintLayout"使之按照ConstraintLayout的限制規則來處理)
其後,我們有了模版布局之後,假如我們想把這兩個模版布局替換成兩個ImageView,則可以這麼做:
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
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">
<include layout="@layout/template_layout" />
<ImageView
android:id="@+id/top"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@color/colorPrimary"
/>
<ImageView
android:id="@+id/bottom"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@color/colorAccent"
/>
</android.support.constraint.ConstraintLayout>
效果截圖:
可以看到,我們利用include标簽引入的模版布局,兩個Placeholder實際上被替換成了ImageView,而原來定義的ImageView則不會顯示。
需要注意的是include标簽需要放在要替換Placeholder的View的前面,不然不會被替換。
而且定義的ImageView已經沒必要再配置那些限制屬性了,因為這些限制屬性已經在Placeholder裡面聲明了。
有了這個東西之後,我們可以很輕松的根據模版布局填充不同的View。
Barrier
沒錯,他就是一個屏障器。它可以阻止View越過自己,當某個View要越過自己的時候,Barrier會自動移動,進而避免被覆寫
它也是通過constraint_referenced_ids屬性指定需要添加屏障的View,進而這些View就不會超越這個屏障(跟個準确來說這個屏障會随着View的擴張而移動,使之不會讓View越過自己)
Barrier有兩個重要屬性:
- app:barrierDirection
- app:constraint_referenced_ids
描述的不夠好,我們來舉個例子。
假如我有這麼一個需求,左邊有兩個TextView表示兩個單行的文字,右邊是一個Textview表示多行的。
代碼如下:
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
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">
<TextView
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"
/>
<TextView
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"
/>
<TextView
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"
/>
</android.support.constraint.ConstraintLayout>
效果圖大緻是這樣:
由于ConstraintLayout的限制規則,一個View隻可以指定另外一個View作為錨點。是以這裡右邊的TextView無論是指tv1還是tv2的時候,都有可能因為tv1或者tv2中文字太長而遮擋到tv3
從效果圖可以看到,由于錨點View指定的是tv1,而tv2的文字更長,它便重疊在tv3。
這個時候Barrier的作用就來了,我們可以通過Barrier可以指定tv1、tv2使這兩個View不會越過Barrier。
而tv3可以設定這個Barrier為錨點,限制在它的右邊。 代碼如下:
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
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">
<TextView
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"
/>
<TextView
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.support.constraint.Barrier
android:id="@+id/barrier"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:barrierDirection="right"
app:constraint_referenced_ids="tv1,tv2" />
<TextView
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" />
</android.support.constraint.ConstraintLayout>
效果圖如下:
可以看到左邊有一條黑邊屏障,這裡隻是看設計效果,實際上并不會顯示在螢幕上的。
結束語
終于結束了,其實一直很懶得寫部落格,因為總結一篇實在太耗費精力和時間了。但是換來的是對知識的總結,是以還是有必要堅持寫下去。
如果你也看到了最後,請給我一個贊支援一下吧! 。