摘要:比如讓在父容器中左右居中豎直居中同理。相對(duì)圓周定位屬性在版本中添加,提供開發(fā)者相對(duì)控件的中心一個(gè)角度和距離上約束另外一個(gè)控件的能力。是約束布局用來控制一組控件的可見性。被引用的控件的可見性和深度屬性與相同。
介紹ConstraintLayout 在 2016 年 Google IO 中面世,它的出現(xiàn)是為了解決開發(fā)中過于復(fù)雜的頁面層級(jí)嵌套過多的問題——層級(jí)過深會(huì)增加繪制界面需要的時(shí)間,影響用戶體驗(yàn)。
在使用過程中,ConstraintLayout 可以看做是一個(gè)更強(qiáng)大的 RelativeLayout,它提供了更多的 API 來約束控件的相對(duì)關(guān)系,更容易滿足復(fù)雜的頁面布局。
布局屬性約束布局擁有更強(qiáng)大的約束能力,其擁有的布局屬性數(shù)量也非常多,筆者在這里進(jìn)行分類講解。
相對(duì)定位屬性相對(duì)定位是約束布局中創(chuàng)建布局的基本屬性之一。這些屬性和 RelativeLayout 布局屬性是類似的,用來控制控件相對(duì)于另外一個(gè)控件或者父容器的位置。
分別可以在水平軸和垂直軸上約束控件:
Horizontal: left, right, start, end
Vertical: top, bottom, text baseline
簡(jiǎn)單來說就是將給定一側(cè)需要約束的控件約束到另一個(gè)控件的另一側(cè)。 舉個(gè)例子,把按鈕 B 放到按鈕 A 的右邊:
我們可以這樣寫:
<Button android:id="@+id/buttonA" ... />
<Button android:id="@+id/buttonB" ...
app:layout_constraintLeft_toRightOf="@+id/buttonA" />
除了指定另外一個(gè)控件 id 進(jìn)行約束,我們還可以與父布局進(jìn)行約束:
<Button android:id="@+id/buttonB" ...
app:layout_constraintLeft_toLeftOf="parent" />
Margins
設(shè)置控件的間距屬性與其他布局相同,但約束布局中對(duì)應(yīng)間距值生效需要有對(duì)應(yīng)的約束條件,比如需要給控件設(shè)置左間距,那該控件它的 constraint
與其他控件不同的是新增了一系列 goneMargin 屬性,用來控制當(dāng)約束目標(biāo)可見性為 GONE 的時(shí)候,設(shè)置不同的間距值。
實(shí)踐過程中筆者能夠想到的一個(gè)場(chǎng)景需求是:
在動(dòng)畫中,A 不可見的時(shí)候,需要保證 B 的布局位置不變,這個(gè)時(shí)候設(shè)置 goneMarginStart 的值為 A 的寬度加上 B 的 marginStart ,就可以滿足該需求。
居中和 Bias跟其他布局一樣,約束布局同樣擁有子控件居中的能力,居中定位是以橫向/豎向兩端同時(shí)約束來定位布局位置。比如讓 A 在父容器中左右居中:
<android.support.constraint.ConstraintLayout ...>
<Button android:id="@+id/button" ...
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent/>
>
豎直居中同理。
上述布局約束會(huì)把控件居中對(duì)齊,使用 bias 可以進(jìn)行偏移。
layout_constraintHorizontal_bias
layout_constraintVertical_bias
如果沒有設(shè)置 bias 值,則左右兩邊取值各占有 50% 也就是居中的效果,如果把 bias 修改為 0.3 (30%),則左邊空白的邊距會(huì)減少,右邊會(huì)相應(yīng)增多。
給上述代碼增加一行 app:layout_constraintHorizontal_bias="0.3" ,就可以得到圖片的效果。
<android.support.constraint.ConstraintLayout ...>
<Button android:id="@+id/button" ...
app:layout_constraintHorizontal_bias="0.3"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent/>
>
constraintCircle 屬性在 1.1 版本中添加,提供開發(fā)者相對(duì)控件的中心一個(gè)角度和距離上約束另外一個(gè)控件的能力。
layout_constraintCircle
layout_constraintCircleRadius
layout_constraintCircleAngle
<Button android:id="@+id/buttonA" ... />
<Button android:id="@+id/buttonB" ...
app:layout_constraintCircle="@+id/buttonA"
app:layout_constraintCircleRadius="100dp"
app:layout_constraintCircleAngle="45" />
控件的尺寸約束
在 ConstraintLayout 中設(shè)置控件的高度和寬度是通過 android:layout_width 和 android:layout_height 來指定,但有三種不同類型:
使用確定的尺寸,給定數(shù)值,比如 36dp
使用 WRAP_CONTENT 該效果與其他控件相同
使用 0dp 來表示 MATCH_CONSTRAINT, 意思是根據(jù)約束規(guī)則指定高寬
(a) 設(shè)置為 WRAP_CONTENT;(b) 設(shè)置為 0dp;(c) 是設(shè)置了 margin 情況下的 (b)
在 1.1 版本之前,約束布局對(duì)于控件的 WRAP_CONTENT 是不會(huì)限制它的結(jié)果大小。所以這在你希望使用 WRAP_CONTENT 但仍然需要強(qiáng)制約束條件來限制它的結(jié)果,就可能需要添加以下屬性:
app:layout_constrainedWidth="true|false"
app:layout_constrainedHeight="true|false"
在最后業(yè)務(wù)實(shí)戰(zhàn)的第一個(gè)例子中會(huì)具體說明該屬性的使用場(chǎng)景
layout_constraintDimensionRatio 限制控件的寬高比,如果要使用寬高比來約束尺寸,則至少要設(shè)置寬高其中一個(gè)尺寸為0dp,然后再設(shè)置上 layout_constraintDimentionRatio 屬性。
<Button android:layout_width="wrap_content"
android:layout_height="0dp"
app:layout_constraintDimensionRatio="1:1" />
上述代碼會(huì)得到一個(gè)高度跟寬度相同的 Button。
關(guān)于比例的取值有兩種方式:
float 值,代表寬度/高度的比率
寬度:高度這種比率值,比如 9:16
如果寬高都是 MATCH_CONSTRAINT (0dp) 也可以是用寬高比,這種情況系統(tǒng)會(huì)使用滿足所有約束條件和寬高比率的最大尺寸。如果要根據(jù)其中一個(gè)尺寸來約束另外一個(gè)尺寸,可以在比率數(shù)值前添加 "W/H" 來分別約束寬度或者高度。 舉例:app:layout_constraintDimensionRatio="H,16:9"
這行代碼表示約束該 View 的高度,其數(shù)值需要符合 16:9 的比率。
鏈條Chains 為同一個(gè)方向(水平或者垂直)上的多個(gè)控件提供一個(gè)類似群組的概念。其他的方向則可以多帶帶控制。
多個(gè)控件相互在同一個(gè)方向上雙向引用就可以創(chuàng)建一個(gè) Chain.
以下屬性是用來控制 Chain Style 的:
– layout_constraintHorizontal_chainStyle – layout_constraintHorizontal_weight – layout_constraintVertical_chainStyle – layout_constraintVertical_weight
其中 Style 有 4 種:
CHAIN_SPREAD 這個(gè)是默認(rèn)的 Style, 里面的所有控件會(huì)分散開布局
Weighted chain,在 CHAIN_SPREAD 模式下,如果有些控件的尺寸設(shè)置為 MATCH_CONSTRAINT(0dp),則這些控件尺寸會(huì)占據(jù)所有剩余可用的空間,和 LinearLayout weight 類似。
CHAIN_SPREAD_INSIDE 和 CHAIN_SPREAD 類似,只不過兩端的兩個(gè)控件和父容器直接不占用多余空間,多余空間在控件之間分散
CHAIN_PACKED 這種模式下,所有的控件都居中聚集在一起,但是可以設(shè)置 bias 屬性來控制聚集的位置。
輔助布局
Guideline 是約束布局中一個(gè)特殊的輔助布局類,可以創(chuàng)建水平或者垂直的參考線,其他的控件可以根據(jù)這個(gè)參考線來進(jìn)行布局,它本質(zhì)是不可見的控件。
參考線的位置屬性:
orientation:vertical/horizontal
layout_constraintGuide_begin 指定距離左/上邊開始的固定位置
layout_constraintGuide_end 指定距離右/下邊開始的固定位置
layout_constraintGuide_percent 指定位于布局中所在的百分比
Barrier 在約束布局中通過 constraint_referenced_ids 引用多個(gè)控件,看作一個(gè)整體來添加一個(gè)與另外一個(gè)控件限制最大寬/高的約束。
通過 app:barrierDirection 屬性來決定 Barrier 的方向。
<android.support.constraint.Barrier
android:id="@+id/barrier"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:barrierDirection="start"
app:constraint_referenced_ids="button1,button2" />
Group 是約束布局用來控制一組控件的可見性。
<android.support.constraint.Group
android:id="@+id/group"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:visibility="visible"
app:constraint_referenced_ids="button4,button9" />
被引用 id 的控件的可見性(visibility)和深度(elevation)屬性與 Group 相同。
業(yè)務(wù)經(jīng)典場(chǎng)景 1. 固定一邊,中間寬度可變,另一邊跟隨中間尾部換句話說:被 Group 引用的控件會(huì)導(dǎo)致它們的自身的可見性和深度失效。
設(shè)計(jì)需求:頭像位置固定,中間文字長(zhǎng)度可變,最右側(cè)按鈕跟在文字右側(cè),但不能超出屏幕。
<androidx.constraintlayout.widget.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="60dp"
tools:background="@color/background_gray">
<ImageView
android:id="@+id/iv_avatar"
android:layout_width="40dp"
android:layout_height="40dp"
android:layout_marginStart="15dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
tools:srcCompat="@tools:sample/avatars[2]" />
<TextView
android:id="@+id/tv_text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="15dp"
android:layout_marginEnd="15dp"
android:singleLine="true"
app:layout_constrainedWidth="true"
app:layout_constraintBottom_toBottomOf="@+id/iv_avatar"
app:layout_constraintEnd_toStartOf="@id/tv_action"
app:layout_constraintHorizontal_bias="0"
app:layout_constraintHorizontal_chainStyle="packed"
app:layout_constraintStart_toEndOf="@id/iv_avatar"
app:layout_constraintTop_toTopOf="@+id/iv_avatar"
tools:text="ConstraintLayout is available as a support library" />
<TextView
android:id="@+id/tv_action"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginEnd="15dp"
app:layout_constraintBottom_toBottomOf="@+id/iv_avatar"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toEndOf="@id/tv_text"
app:layout_constraintTop_toTopOf="@+id/iv_avatar"
tools:text="查看" />
androidx.constraintlayout.widget.ConstraintLayout>
該場(chǎng)景重點(diǎn)需要熟悉屬性:layout_constrainedWidth/Height 應(yīng)用。
2. 根據(jù)某個(gè) View 的高度/寬度,來居中一組 View設(shè)計(jì)需求:右側(cè)圖片和文字,需要整體跟左邊頭像居中。
<androidx.constraintlayout.widget.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="300dp"
tools:background="@color/background_gray">
<ImageView
android:id="@+id/iv_avatar"
android:layout_width="150dp"
android:layout_height="150dp"
android:layout_marginStart="15dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintVertical_bias="0.3"
tools:srcCompat="@tools:sample/avatars[2]" />
<ImageView
android:id="@+id/iv_pic"
android:layout_width="30dp"
android:layout_height="30dp"
android:layout_marginStart="50dp"
android:scaleType="centerCrop"
app:layout_constraintBottom_toTopOf="@+id/tv_content"
app:layout_constraintStart_toEndOf="@id/iv_avatar"
app:layout_constraintTop_toTopOf="@id/iv_avatar"
app:layout_constraintVertical_chainStyle="packed"
tools:srcCompat="@tools:sample/backgrounds/scenic[6]" />
<TextView
android:id="@+id/tv_content"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginTop="5dp"
app:layout_constraintBottom_toBottomOf="@id/iv_avatar"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="@id/iv_pic"
app:layout_constraintTop_toBottomOf="@+id/iv_pic"
tools:text="Chains provide group-like behavior in a single axis (horizontally or vertically). " />
androidx.constraintlayout.widget.ConstraintLayout>
該場(chǎng)景重點(diǎn)需要熟悉約束布局:Chain 的應(yīng)用。 iv_pic 與 tv_content 雙向依賴,使用 packed Style 讓它們緊靠一起,同時(shí),iv_pic 頭部與 iv_avatar 的頭部對(duì)齊, tv_content 的底部與 iv_avatar 的底部對(duì)齊,達(dá)到它們居中顯示的效果。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/7049.html
摘要:并且便于統(tǒng)一的修改與查看。一旦被顯示后,則將從視圖框架中移除,其也會(huì)失效,此時(shí)得到的也是空的。所以它可以有效的避免布局的嵌套,從而達(dá)到優(yōu)化布局的效果。其他嵌套的中,盡量不要使用,因?yàn)闀?huì)重新測(cè)量?jī)纱巍? 作為android應(yīng)用來講,無論應(yīng)用本身多么美觀,功能多么強(qiáng)大,內(nèi)容多么豐富。但如果App本身打開界面緩慢超過手機(jī)16ms刷新一次頁面的時(shí)間,就會(huì)產(chǎn)生卡頓。用戶體驗(yàn)都會(huì)變得極差,導(dǎo)致用戶量...
閱讀 724·2023-04-25 19:43
閱讀 3921·2021-11-30 14:52
閱讀 3794·2021-11-30 14:52
閱讀 3859·2021-11-29 11:00
閱讀 3790·2021-11-29 11:00
閱讀 3882·2021-11-29 11:00
閱讀 3562·2021-11-29 11:00
閱讀 6138·2021-11-29 11:00