ConstraintLayout 使用簡介

一 背景

ConstraintLayout 是目前是android studio 2.2 以后的默認(rèn)根布局米碰。 到目前為止汰翠,大家還是習(xí)慣常用的布局踪栋。同事先嘗試了下ConstraintLayout優(yōu)化布局層次倦青,筆者也使用了下祭饭,發(fā)現(xiàn)確實(shí)比較好用芜茵。下面我們一起來試著使用布局吧~~

二 demo

來看下有個(gè)簡單的布局是這個(gè)樣子的

image.png

其中文字‘金豆’ 左邊金色條是居中對齊文字一欄的。按傳統(tǒng)布局倡蝙,這個(gè)簡單的布局至少需要三層布局九串, 垂直方向和 單個(gè)水平方向。下面看下使用ConstraintLayout布局寺鸥。

<?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"
    android:layout_marginLeft="15dp"
    android:layout_marginTop="10dp">

    <ImageView
        android:id="@+id/golden_beans_tips_icon"
        android:layout_width="wrap_content"
        android:layout_height="15dp"
        android:scaleType="fitCenter"
        android:src="?attr/skin_line_gold30_gift"
        app:layout_constraintBottom_toBottomOf="@+id/golden_beans_tips"
        app:layout_constraintTop_toTopOf="@+id/golden_beans_tips"
        tools:src="@drawable/line_gold30_gift" />

    <TextView
        android:id="@+id/golden_beans_tips"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginBottom="20dp"
        android:layout_marginLeft="5dp"
        android:layout_marginTop="25dp"
        android:importantForAccessibility="no"
        android:text="@string/pay_unit"
        android:textColor="?attr/skinT2"
        android:textSize="@dimen/skin_textsize_l3"
        app:layout_constraintLeft_toRightOf="@+id/golden_beans_tips_icon"
        app:layout_constraintTop_toBottomOf="parent"
        tools:textColor="@color/skin_t2" />

    <TextView
        android:id="@+id/golden_bean_number"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginBottom="25dp"
        android:contentDescription="@{viewModel.goldenBeanDescription}"
        android:text="12"
        android:textColor="?attr/skinT2"
        android:textSize="@dimen/mine_balance_text_size"
        app:layout_constraintLeft_toRightOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/golden_beans_tips"
        tools:text="12"
        tools:textColor="@color/skin_t2" />

    <TextView
        android:layout_width="90dp"
        android:layout_height="35dp"
        android:layout_marginRight="15dp"
        android:background="@drawable/bg_btn_mine_balance"
        android:gravity="center"
        android:text="@string/pay_money"
        android:textColor="@color/skin_t7"
        android:textSize="@dimen/skin_textsize_l4"
        app:layout_constraintBottom_toBottomOf="@+id/golden_bean_number"
        app:layout_constraintRight_toLeftOf="parent"
        app:layout_constraintTop_toTopOf="@+id/golden_bean_number" />

</android.support.constraint.ConstraintLayout>

其實(shí)猪钮,ConstraintLayout 寫起來比較方便,與RelativeLayout非常相似析既。 首先我們看下 要保證垂直方向的順序布局躬贡。 如果沒使用ConstraintLayout前,需要使用垂直方向的LinearLayout 或RelativeLayout眼坏。 我們的ConstraintLayout 怎樣保證的呢拂玻?

 app:layout_constraintTop_toBottomOf="@+id/golden_beans_tips"

一行代碼,是不是跟RelativeLayout類似宰译。 同理 我們要保持文本 ‘12’ 和按鈕‘充值’ 水平方向

app:layout_constraintTop_toTopOf="@+id/golden_bean_number"

是不是很簡單檐蚜。那怎么保證第一行的金色條icon 居中對齊 文本 ‘金豆’呢?

app:layout_constraintBottom_toBottomOf="@+id/golden_beans_tips"
app:layout_constraintTop_toTopOf="@+id/golden_beans_tips"

即對齊文本‘金豆’的上下邊緣沿侈, 這里有一個(gè)比較形象的說法闯第,就是constraintXXX_toXXXOf 表示對于id 對本view的拉力。這里上下方向拉力一致缀拭,所以文本居中了咳短。那么我們的相對布局其實(shí)就有 4 * 2 8種方式:

layout_constraintLeft_toLeftOf

layout_constraintLeft_toRightOf

layout_constraintRight_toLeftOf

layout_constraintRight_toRightOf

layout_constraintTop_toTopOf

layout_constraintTop_toBottomOf

layout_constraintBottom_toTopOf

layout_constraintBottom_toBottomOf

三 進(jìn)一步升級打怪

看了上面的一個(gè)填帽,我們有個(gè)需求的ui是這樣子的

image.png

當(dāng)然,這個(gè)只是布局的一小塊咙好,你可以看成listView 的item 優(yōu)化布局的層次還是比較重要的篡腌。
你可能會說 what a shell !9葱А嘹悼! ConstraintLayout 來布局很簡單呀,實(shí)際上层宫,你使用上面的約束杨伙,想一層布局搞定,貌似搞不定萌腿。來限匣,看下我們的布局代碼

    <android.support.constraint.ConstraintLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:bind="http://schemas.android.com/apk/res-auto"
        xmlns:tools="http://schemas.android.com/tools" >

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginTop="25dp"
            android:layout_marginLeft="15dp"
            android:layout_marginRight="15dp"
            android:maxLines="1"
            android:ellipsize="end"
            android:id="@+id/title"
            android:textColor="?attr/skinT2"
            bind:layout_constraintLeft_toLeftOf="parent"
            bind:layout_constraintRight_toLeftOf="@+id/more"
            bind:layout_constraintHorizontal_bias="0"
            android:textSize="@dimen/skin_textsize_l3"
            android:text="情感故事情情感故事情感故情感情感情感故事情感故情感情感感故情感情感"
            tools:text="情感故事情情感故事情感故情感情感情感故事情感故情感情感感故情感情感"
            tools:textColor="@color/skin_t2"  />

        <ImageView
            android:id="@+id/more"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginRight="15dp"
            bind:layout_constraintRight_toRightOf="parent"
            bind:layout_constraintTop_toTopOf="@+id/title"
            bind:layout_constraintBottom_toBottomOf="@+id/title"
            android:src="?attr/skin_btn_arrow_stroke"
            tools:src="@drawable/btn_arrow_stroke" />

    </android.support.constraint.ConstraintLayout>
    

我們看

 bind:layout_constraintLeft_toLeftOf="parent"
 bind:layout_constraintRight_toLeftOf="@+id/more"

使用這兩行代碼之后文本 已經(jīng)在 icon 更多左邊,但是文本是居中的毁菱,看起來是這樣

image.png

原因是parent左邊和右邊more的拉力是相同的膛腐,所以文本寬度不夠時(shí),居中了鼎俘。那問題來了,我想讓文本居左怎么辦辩涝?
bind:layout_constraintRight_toLeftOf去不掉贸伐,是需要保證在icon的左邊,那怎么辦呢怔揩?

app:layout_constraintHorizontal_bias="0"

layout_constraintHorizontal_bias 表示水平偏向捉邢, 取值 0 到 1, 即在兩個(gè)拉力中偏左為0商膊, 偏右為1 伏伐,默認(rèn)就是0.5, 也可以看成左右間距比例晕拆。相似的還有垂直方向layout_constraintVertical_bias

恩藐翎,ui需求又來了,比較常見的如实幕, 水平三個(gè)按鈕吝镣,我想等分水平的,這里不再贅述昆庇,ConstraintLayout中類似LinearLayout weight的屬性就ok末贾。

app:layout_constraintHorizontal_weight="1"

四 更多

還有幾個(gè)重要的屬性,本文不一一列出整吆,前面的基本需求都無壓力了拱撵。
app:layout_constraintHorizontal_chainStyle 鏈?zhǔn)降?br> 以及 按寬高比布局屬性 app:layout_constraintDimensionRatio辉川。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市拴测,隨后出現(xiàn)的幾起案子乓旗,更是在濱河造成了極大的恐慌,老刑警劉巖昼扛,帶你破解...
    沈念sama閱讀 206,311評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件寸齐,死亡現(xiàn)場離奇詭異,居然都是意外死亡抄谐,警方通過查閱死者的電腦和手機(jī)渺鹦,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,339評論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來蛹含,“玉大人毅厚,你說我怎么就攤上這事∑窒洌” “怎么了吸耿?”我有些...
    開封第一講書人閱讀 152,671評論 0 342
  • 文/不壞的土叔 我叫張陵,是天一觀的道長酷窥。 經(jīng)常有香客問我咽安,道長,這世上最難降的妖魔是什么蓬推? 我笑而不...
    開封第一講書人閱讀 55,252評論 1 279
  • 正文 為了忘掉前任妆棒,我火速辦了婚禮,結(jié)果婚禮上沸伏,老公的妹妹穿的比我還像新娘糕珊。我一直安慰自己,他們只是感情好毅糟,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,253評論 5 371
  • 文/花漫 我一把揭開白布红选。 她就那樣靜靜地躺著,像睡著了一般姆另。 火紅的嫁衣襯著肌膚如雪喇肋。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,031評論 1 285
  • 那天蜕青,我揣著相機(jī)與錄音苟蹈,去河邊找鬼。 笑死右核,一個(gè)胖子當(dāng)著我的面吹牛慧脱,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播贺喝,決...
    沈念sama閱讀 38,340評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼菱鸥,長吁一口氣:“原來是場噩夢啊……” “哼宗兼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起氮采,我...
    開封第一講書人閱讀 36,973評論 0 259
  • 序言:老撾萬榮一對情侶失蹤殷绍,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后鹊漠,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體主到,經(jīng)...
    沈念sama閱讀 43,466評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,937評論 2 323
  • 正文 我和宋清朗相戀三年躯概,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了登钥。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,039評論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡娶靡,死狀恐怖牧牢,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情姿锭,我是刑警寧澤塔鳍,帶...
    沈念sama閱讀 33,701評論 4 323
  • 正文 年R本政府宣布,位于F島的核電站呻此,受9級特大地震影響轮纫,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜焚鲜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,254評論 3 307
  • 文/蒙蒙 一蜡感、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧恃泪,春花似錦、人聲如沸犀斋。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,259評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽叽粹。三九已至览效,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間虫几,已是汗流浹背锤灿。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留辆脸,地道東北人但校。 一個(gè)月前我還...
    沈念sama閱讀 45,497評論 2 354
  • 正文 我出身青樓,卻偏偏與公主長得像啡氢,于是被迫代替她去往敵國和親状囱。 傳聞我的和親對象是個(gè)殘疾皇子术裸,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,786評論 2 345

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