ConstraintLayout 筆

資料鏈接:
ConstraintLayout 終極秘籍(上)
ConstraintLayout 終極秘籍(下)

一贰谣、說明

ConstraintLayout 可以看做 RelativeLayout 的升級版矫钓。
但 ConstraintLayout 更加強(qiáng)調(diào)約束(控件之間的關(guān)系)紧武。

二软啼、準(zhǔn)備

1.導(dǎo)包

compile 'com.android.support.constraint:constraint-layout:1.0.2'

2. Android Studio 2.2 版本以上

三、屬性

1.) ConstraintLayout 本身的屬性

  • android_maxHeight
  • android_maxWidth
  • android_minHeight
  • android_minWidth

Android 常見控制 View 最大尺寸和最小尺寸的屬性孵延。

2.) Guideline 屬性

Guideline
用來輔助定位的一個不可見的元素旗们。

  • android_orientation
    控制 Guideline 是橫向的還是縱向的
  • layout_constraintGuide_begin
    控制 Guideline 距離父容器開始的距離
  • layout_constraintGuide_end
    控制 Guideline 距離父容器末尾的距離
  • layout_constraintGuide_percent
    控制 Guideline 在父容器中的位置為百分比

3.)相對定位屬性

用來控制子 View 相對位置的廷痘。
可以是子控件&子控件,也可以是子控件&父控件件已。

  • layout_constraintBaseline_toBaselineOf
  • layout_constraintTop_toBottomOf
  • layout_constraintTop_toTopOf
  • layout_constraintBottom_toBottomOf
  • layout_constraintBottom_toTopOf
  • layout_constraintStart_toEndOf
  • layout_constraintStart_toStartOf
  • layout_constraintEnd_toEndOf
  • layout_constraintEnd_toStartOf
  • layout_constraintLeft_toLeftOf
  • layout_constraintLeft_toRightOf
  • layout_constraintRight_toLeftOf
  • layout_constraintRight_toRightOf

layout: 說明這是一個布局屬性笋额。
_constraintXXX: 為對當(dāng)前 View 上的某個屬性做的約束。
_toXXOf: 為當(dāng)前 View 約束的對象以及約束的方位篷扩。

View 的上下左右以及 baseline 示意圖

4.)Margin (View 的邊距)

Margin 說明

a. View margin 的屬性
  • layout_marginStart
  • layout_marginEnd
  • layout_marginLeft
  • layout_marginTop
  • layout_marginRight
  • layout_marginBottom
b.控制當(dāng)前 View 所參考的 View 狀態(tài)為 GONE 的時候的 margin 值
  • layout_goneMarginBottom
  • layout_goneMarginEnd
  • layout_goneMarginLeft
  • layout_goneMarginRight
  • layout_goneMarginStart
  • layout_goneMarginTop

用途:
比如 ButtonB 左邊相對于 ButtonA 右邊對齊兄猩,ButtonA 左邊相對于父容器左邊對齊。如果 ButtonA 的狀態(tài)為 GONE(不可見的)鉴未,則 ButtonB 就相對于父容器左邊對齊了厦滤。如果有個需求是,當(dāng) ButtonA 不可見的時候歼狼, ButtonB 和父容器左邊需要一個邊距 16dp掏导。 這個時候就需要使用上面的 layout_goneMarginLeft 或者 layout_goneMarginStart 屬性了,如果設(shè)置了這個屬性羽峰,當(dāng) ButtonB 所參考的 ButtonA 可見的時候趟咆,這個邊距屬性不起作用;當(dāng) ButtonA 不可見(GONE)的時候梅屉,則這個邊距就在 ButtonB 上面起作用了值纱。

另外還有一個用途就是方便做 View 動畫,可以先設(shè)置 ButtonA 為 GONE坯汤,同時可以保持 ButtonB 的布局位置不變虐唠。

例:

<Button
    android:id="@+id/btnA"
    android:visibility="gone"
    .../>

<Button
    android:id="@+id/btnB"
    app:layout_goneMarginLeft="50dp"
    app:layout_constraintLeft_toRightOf="@+id/btnA"
    .../>

5.)居中和偏移(bias)

  • layout_constraintHorizontal_bias
  • layout_constraintVertical_bias

Bias 示意圖:

6.)子 View 的尺寸控制

  • android:layout_width
  • android:layout_height

三種取值:

  • 確定尺寸。比如 48dp
  • WRAP_CONTENT
  • 0dp惰聂。和約束規(guī)則指定的寬(高)度一樣

(a) 設(shè)置為wrap_content
(b) 設(shè)置為 0dp疆偿,則 View 的寬度為整個父容器的寬度
(c) 是設(shè)置了 margin的情況下的寬度。

a.控制子View的寬高比
  • layout_constraintDimensionRatio

如果要使用寬高比則需要至少設(shè)置一個尺寸約束為 0dp

比率的取值形式:

  • float 值搓幌,代表寬度/高度 的比率
  • “寬度:高度”這種比率值

如果寬度和高度都是 0dp 也可以使用寬高比杆故。這種情況,系統(tǒng)會使用滿足所有約束條件和比率的最大尺寸溉愁。要根據(jù)其中一種尺寸來約束另外一種尺寸处铛,則可以在比率值的前面添加 W 或者 H來分別約束寬度或者高度。

<Button 
    android:layout_width="0dp"
    android:layout_height="0dp"
    app:layout_constraintDimensionRatio="H,16:9"
    app:layout_constraintBottom_toBottomOf="parent"
    app:layout_constraintTop_toTopOf="parent"/>

H,16:9:前面的 H 表明約束高度拐揭,所以結(jié)果就是 Button 的寬度和父容器寬度一樣撤蟆,而高度值符合 16:9 的比率。

b.精細(xì)控制 View 尺寸的屬性

注意:下面這些屬性只有寬度或者高度設(shè)置為 0dp 的情況下才有效

  • layout_constraintWidth_default
    取值為spread/wrap,默認(rèn)值為 spread
  • layout_constraintHeight_default
    取值為spread/wrap,默認(rèn)值為 spread
  • layout_constraintHeight_max
    取值為具體的尺寸
  • layout_constraintHeight_min
    取值為具體的尺寸
  • layout_constraintWidth_max
    取值為具體的尺寸
  • layout_constraintWidth_min
    取值為具體的尺寸

spread:占用所有的符合約束的空間堂污;
Wrap:view 的尺寸設(shè)置為 wrap_content 且受所設(shè)置的約束限制其尺寸家肯,則這個 view 最終尺寸不會超出約束的范圍。

7.)鏈條布局(Chains)

Chains:同一個方向(水平或者垂直)上的多個子 View 提供一個類似群組的概念敷鸦。

a. 創(chuàng)建 Chains

多個 View 相互在同一個方向上雙向引用就創(chuàng)建了一個 Chain息楔。
比如在水平方向上兩個 Button A 和 B,如果 A 的右邊位于 B 的左邊扒披,而 B 的左邊位于 A 的右邊值依,則就是一個雙向引用。

注意: 在 Android Studio 編輯器中碟案,先把多個 View 單向引用愿险,然后用鼠標(biāo)擴(kuò)選多個 View,然后在上面點(diǎn)擊右鍵菜單价说,選擇 “Center Horizontally” 或者 “Center Vertically” 也可以快速的創(chuàng)建 Chain辆亏。

b. Chain heads

Chain 的屬性由該群組的第一個 View 上的屬性所控制(第一個 View 被稱之為 Chain head)。

水平群組鳖目,最左邊的 View 為 head扮叨, 垂直群組最上面的 View 為 head。

c. Margins in chains

可以為 Chain 中的每個子 View 單獨(dú)設(shè)置 Margin领迈。對于 spread chains彻磁, 可用的布局空白空間是扣除 margin 后的空間。下面會詳細(xì)解釋狸捅。

d. Chain Style

控制 Chain Style 的屬性:

  • layout_constraintHorizontal_chainStyle
  • layout_constraintHorizontal_weight
  • layout_constraintVertical_chainStyle
  • layout_constraintVertical_weight

chainStyle 是設(shè)置到 Chain Head 上的衷蜓,指定不同的 style 會改變里面所有 View 的布局方式。
有如下四種 Style:

  • CHAIN_SPREAD:
    這個是默認(rèn)的 Style尘喝,里面的所有 View 會分散開布局磁浇。
  • CHAIN_SPREAD_INSIDE:
    和 CHAIN_SPREAD 類似,只不過兩端的兩個 View 和 父容器直接不占用多余空間朽褪,多余空間在 子 View 之間分散置吓。
  • Weighted chain:
    在 CHAIN_SPREAD 模式下,如果有些 View 的尺寸設(shè)置為 0dp缔赠,則這些 View 尺寸會占據(jù)所有剩余可用的空間交洗,和 LinearLayout weight 類似。
  • CHAIN_PACKED:
    所有的子 View 都 居中聚集在一起橡淑,但是可以設(shè)置 bias 屬性來控制聚集的位置构拳。

如果多個子View尺寸設(shè)置為 0dp,則這些 View 會平均的占用多余的空間梁棠。
通過 layout_constraintXXX_weight 屬性置森,可以控制每個 View 所占用的多余空間的比例。
例如符糊,對于只有兩個 View 的一個水平 Chain凫海,如果每個View 的寬度都設(shè)置為 0dp,第一個 View 的 weight 為 2男娄;第二個 View 的 weight 為 1行贪,則第一個 View 所占用的空間是 第二個 View 的兩倍漾稀。

8.) UI 編輯器所使用的屬性

用作:輔助拖拽布局,實際使用過程中建瘫,可以不用關(guān)心崭捍。

  • layout_optimizationLevel
  • layout_editor_absoluteX
  • layout_editor_absoluteY
  • layout_constraintBaseline_creator
  • layout_constraintTop_creator
  • layout_constraintRight_creator
  • layout_constraintLeft_creator
  • layout_constraintBottom_creator

9.) Guideline

用作:一個不可見的 View,ConstraintLayout 水平或者垂直的參考線啰脚。
其他的 View 可以相對于這個參考線來布局殷蛇。

  • 垂直 Guideline 的寬度為 0, 高度為 父容器(ConstraintLayout)的高度
  • 水平 Guideline 的高度為 0橄浓, 寬度為 父容器(ConstraintLayout)的寬度
    參考線的位置是可以移動的粒梦。
  • layout_constraintGuide_begin 可以指定距離左(或者上)邊開始的固定位置
  • layout_constraintGuide_end 可以指定距離右(或者下)邊開始的固定位置
  • layout_constraintGuide_percent 可以指定位于布局中所在的百分比,比如距離左邊 2% 的位置

10.) 代碼設(shè)置 ConstraintLayout 屬性

a. ConstraintSet

用來通過代碼管理布局屬性的集合對象荸实,可以用來約束各種布局匀们,然后把創(chuàng)建好的布局約束應(yīng)用到 ConstraintLayout。

b. 創(chuàng)建方式
  • 手工創(chuàng)建:
    c = new ConstraintSet();
    c.connect(….);

  • R.layout.* 獲取
    c.clone(context, R.layout.layout1);

  • ConstraintLayout 中獲取
    c.clone(clayout);
    然后通過 applyTo 函數(shù)來應(yīng)用到ConstraintLayout 上

      // set new constraints
      mConstraintSet.applyTo(mConstraintLayout);
    

四准给、可視化UI的使用

ConstraintLayout 終極秘籍(下)


2017/5/19 15:33:50

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末昼蛀,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子圆存,更是在濱河造成了極大的恐慌叼旋,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,695評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件沦辙,死亡現(xiàn)場離奇詭異夫植,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)油讯,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,569評論 3 399
  • 文/潘曉璐 我一進(jìn)店門详民,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人陌兑,你說我怎么就攤上這事沈跨。” “怎么了兔综?”我有些...
    開封第一講書人閱讀 168,130評論 0 360
  • 文/不壞的土叔 我叫張陵饿凛,是天一觀的道長。 經(jīng)常有香客問我软驰,道長涧窒,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,648評論 1 297
  • 正文 為了忘掉前任锭亏,我火速辦了婚禮纠吴,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘慧瘤。我一直安慰自己戴已,他們只是感情好固该,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,655評論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著糖儡,像睡著了一般伐坏。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上休玩,一...
    開封第一講書人閱讀 52,268評論 1 309
  • 那天著淆,我揣著相機(jī)與錄音劫狠,去河邊找鬼拴疤。 笑死,一個胖子當(dāng)著我的面吹牛独泞,可吹牛的內(nèi)容都是我干的呐矾。 我是一名探鬼主播,決...
    沈念sama閱讀 40,835評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼懦砂,長吁一口氣:“原來是場噩夢啊……” “哼蜒犯!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起荞膘,我...
    開封第一講書人閱讀 39,740評論 0 276
  • 序言:老撾萬榮一對情侶失蹤罚随,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后羽资,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體淘菩,經(jīng)...
    沈念sama閱讀 46,286評論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,375評論 3 340
  • 正文 我和宋清朗相戀三年屠升,在試婚紗的時候發(fā)現(xiàn)自己被綠了潮改。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,505評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡腹暖,死狀恐怖汇在,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情脏答,我是刑警寧澤糕殉,帶...
    沈念sama閱讀 36,185評論 5 350
  • 正文 年R本政府宣布,位于F島的核電站殖告,受9級特大地震影響糙麦,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜丛肮,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,873評論 3 333
  • 文/蒙蒙 一赡磅、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧宝与,春花似錦焚廊、人聲如沸冶匹。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,357評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽嚼隘。三九已至,卻和暖如春袒餐,著一層夾襖步出監(jiān)牢的瞬間飞蛹,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,466評論 1 272
  • 我被黑心中介騙來泰國打工灸眼, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留卧檐,地道東北人。 一個月前我還...
    沈念sama閱讀 48,921評論 3 376
  • 正文 我出身青樓焰宣,卻偏偏與公主長得像霉囚,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子匕积,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,515評論 2 359

推薦閱讀更多精彩內(nèi)容