實戰(zhàn)-ConstraintLayout新布局

在今年肮塞,2016年的Google i/o 大會上控嗜,Google推出了Android studio2.2橱野,其中包含了為Android界面布局推出的最新的約束型布局ConstraintLayout硫麻,接觸過iOS界面開發(fā)的朋友弟断,可以認(rèn)為這是Google為Android推出的AutoLayout布局洒敏。因為這方面的資料還不是很多龄恋,大部分的資料都是Google官方介紹翻譯,沒有具體用在項目里的實例桐玻,在此正好公司項目中遇到一個問題篙挽,用ConstraintLayout解決了,期間也遇到點困難镊靴。在這里我寫出來铣卡,希望可以幫助到大家,也為了推廣這種布局偏竟,希望大家可以使用煮落。

如圖,需求是一個時間軸控件踊谋,使用ListView實現(xiàn)蝉仇。

每個adapter中包含:

  1. 一個ImageView,表示時間軸中的進(jìn)度點
  2. 進(jìn)度點,上面的線line_top(View)
  3. 進(jìn)度點轿衔,下面的線line_bottom(View)
  4. 兩個TextView沉迹,分別是進(jìn)度說明,和時間
  5. 一條橫向的線line(View)
最終做出來的效果圖如下
最終效果圖

現(xiàn)在我們分析一下這個效果圖:

  • 進(jìn)度點有兩種形態(tài)害驹,大小不一鞭呕;
  • 兩個進(jìn)度點之間的連線顏色可以改變;
  • 進(jìn)度點宛官,上下的兩條線葫松,3個控件需要中心對齊;
  • 進(jìn)度點需要跟第一個的TextView第一行水平對齊底洗,說明上半部分線高度可以固定腋么;
  • 第一個TextView行數(shù)不確定,說明下半部分線長度不確定亥揖;
  • 橫向的虛線左端與兩個TextView保持在同一Y軸上珊擂,同時右端頂?shù)狡聊蛔钣疫叀?/li>

上面這6點是布局中需要注意的,不變的部分很容易徐块,我們只需要關(guān)注變的部分未玻,再精減一下:

  1. 進(jìn)度點下面的線高度,可變胡控;
  • 第一個TextView行數(shù)扳剿,可變;
  • 橫向的灰色線長度要隨著設(shè)備寬度變化昼激;

再剖析一下庇绽,上面3點中,2橙困,3兩點很容易在RelativeLayout中實現(xiàn)瞧掺,但是1的高度,是根據(jù)TextView的行高來實現(xiàn)的凡傅,既1的變化辟狈,依據(jù)2的變化。

可惜的是夏跷,我在用RelativeLayout哼转,實現(xiàn)這3點的時候,發(fā)現(xiàn)下部的線高度不能自動保持跟第一個TextView槽华,一樣的高度壹蔓,只能保持一行的高度,個人認(rèn)為是TextView調(diào)用setText()方法時猫态,通知了TextView的重新繪制佣蓉,但是下部分的線沒有重新繪制披摄,這也許是RelativeLayout的不足之處。個人愚見勇凭,還有待探究疚膊。

因為我想用xml就把布局關(guān)系完成,不需要再代碼里面在操作布局關(guān)系套像,通知繪制酿联,所以就想到了新布局,ConstraintLayout約束布局夺巩。
下面開始:

第一步:創(chuàng)建布局,擺放控件

轉(zhuǎn)換成為ContraintLayout


轉(zhuǎn)換成為ContraintLayout

把需要的控件都放進(jìn)去周崭,如下圖柳譬,大概擺好


大致位置

現(xiàn)在我們看到的大概的位置,沒有添加任何約束续镇。

第二部:添加約束

對于約束美澳,每一個控件至少水平方向,垂直方向各有一個約束摸航,才能使視圖不會報錯制跟,想讓自己的布局完美展現(xiàn)在手機上,我們應(yīng)該消除所有警報酱虎。

Paste_Image.png

首先我們知道line_top位置和長度都是固定的雨膨,這里我讓它距離屏幕左邊30dp,高度設(shè)置為12dp读串。鼠標(biāo)放在line_top上聊记,會出現(xiàn)4個空心圈。這4個空心圈代表著line_top恢暖,上下左右都沒有設(shè)置約束排监,我們想讓line_top距離左邊30dp,鼠標(biāo)點擊左邊的空心圈杰捂,按住不松舆床,拖至屏幕左邊沿,會出現(xiàn)如下圖嫁佳,松開就設(shè)置了一個約束挨队,

line_top左邊到屏幕左邊沿約束

這時我們觀察,界面左邊欄脱拼。如下圖:

按照上面的操作瞒瘸,再把line_top上方設(shè)置一個約束,距離頂部0dp熄浓。這樣line_top這條線就被固定住了情臭。

現(xiàn)在我們之后所有的控件都直接依賴或者間接依賴這個line_top控件省撑,進(jìn)行布局。

下面我們將進(jìn)度點ImageView這個控件俯在,與line_top中心對其竟秫,如下圖:

ImageView中心對其line_top

ImageView左右兩邊都設(shè)置約束,分別對line_top左右兩邊對齊跷乐,這時進(jìn)度點ImageView自動中心對齊了line_top肥败。很簡單,但是我一開始就想不到愕提,也是試了半天才知道要這么設(shè)置馒稍。
這時,我們要開始布局下一個控件了么浅侨?不纽谒,我們應(yīng)該檢查剛剛的Imageview有沒有滿足下面這條準(zhǔn)則:
對于約束,每一個控件至少水平方向如输,垂直方向各有一個約束鼓黔,才能使視圖不會報錯,想讓自己的布局完美展現(xiàn)在手機上不见,我們應(yīng)該消除所有警報澳化。

顯然這個進(jìn)度點在垂直放向缺少一個約束,我們讓他上方距離line_top有3dp的距離

ok稳吮,此時我們設(shè)置下一個控件缎谷,第一個TextView,TextView上方與進(jìn)度點ImageView上方水平對齊盖高,?我們拉住TextView上方的空心圈慎陵,移到ImageView的上方,送手喻奥,就完成了水平對齊
再設(shè)置左邊到ImageView右邊距離為16dp席纽。完成如下圖:

第一個TextView約束

接下來我們讓第二個TextView完成它的約束,我就不細(xì)講了撞蚕,相信你們也明白怎么用了润梯,如下圖:

第二個TextView約束

下面是重點了,line_bottom的約束我們怎么設(shè)置:

line_bottom未完成的約束

這里我們看到有兩個約束甥厦,一個是左邊與line_top左邊對齊纺铭,這樣因為line_top已經(jīng)與ImageView中心對齊,所以line_bottom這樣也會跟ImageView中心對齊刀疙,但是我們知道line_bottom長度不固定黔夭,是可變的籍救。選中l(wèi)ine_bottom坟漱,接下來,我們看下圖:

line_bottom的高度設(shè)置

如下3種模式:

Fixed: 此選項允許你指定控件的高和寬.
AnySize: 此選項讓控件占用所有可用空間以適應(yīng)約束. 換句話說, 這更像是匹配約束. 與 match_parent 不同, 后者占用父 View 的所有可用空間.
Wrap Content: 此選項僅擴展至所含元素(如 text 或者 drawable)填充滿 widget.

顯然我們要把它切換為AnySize撵溃。

再讓line_bottom下方與橫向line距離為0dp,完成約束锥累,如下圖:

line_bottom完整的約束

最后我們只剩下一個橫線line缘挑,沒有設(shè)置約束了,一樣他也是可變的桶略,設(shè)置為AnySize语淘,添加約束。如圖:

橫向line的約束

完成了么际歼?
看起來好像沒有問題了惶翻。不過我們是不是忘了第一個TextView內(nèi)容很多,可能會出現(xiàn)幾行的情況鹅心。
這里我們還需要給第一個TextView的右邊設(shè)置一個到屏幕右邊沿的約束维贺,我們設(shè)置為距離右邊50dp,同時TextView的寬也要設(shè)置為AnySize巴帮,因為他是可變的。
最后所有約束設(shè)置完成虐秋,我們看一下完整版的圖:

完整約束圖

我們可以試驗一下是否可以自動適應(yīng)高度榕茧。我們向第一個TextView中寫入一段話,將控件撐大點客给,效果如下圖:

效果圖

可以看到效果很不錯用押。到此為止,解決問題靶剑,同時ConstraintLayout可以完成很復(fù)雜的布局蜻拨,減少布局的層次,Android布局層次越深桩引,帶來的性能損耗越大缎讼,當(dāng)然對于目前Android手機性能不是問題,但是作為一個進(jìn)益求精的開發(fā)者坑匠,誰不希望用最少的資源血崭,完成最酷的效果呢?

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末厘灼,一起剝皮案震驚了整個濱河市夹纫,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌设凹,老刑警劉巖舰讹,帶你破解...
    沈念sama閱讀 221,198評論 6 514
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異闪朱,居然都是意外死亡月匣,警方通過查閱死者的電腦和手機钻洒,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,334評論 3 398
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來桶错,“玉大人航唆,你說我怎么就攤上這事≡旱螅” “怎么了糯钙?”我有些...
    開封第一講書人閱讀 167,643評論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長退腥。 經(jīng)常有香客問我任岸,道長,這世上最難降的妖魔是什么狡刘? 我笑而不...
    開封第一講書人閱讀 59,495評論 1 296
  • 正文 為了忘掉前任享潜,我火速辦了婚禮,結(jié)果婚禮上嗅蔬,老公的妹妹穿的比我還像新娘剑按。我一直安慰自己,他們只是感情好澜术,可當(dāng)我...
    茶點故事閱讀 68,502評論 6 397
  • 文/花漫 我一把揭開白布艺蝴。 她就那樣靜靜地躺著,像睡著了一般鸟废。 火紅的嫁衣襯著肌膚如雪猜敢。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,156評論 1 308
  • 那天盒延,我揣著相機與錄音缩擂,去河邊找鬼。 笑死添寺,一個胖子當(dāng)著我的面吹牛胯盯,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播畦贸,決...
    沈念sama閱讀 40,743評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼陨闹,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了薄坏?” 一聲冷哼從身側(cè)響起趋厉,我...
    開封第一講書人閱讀 39,659評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎胶坠,沒想到半個月后君账,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,200評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡沈善,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,282評論 3 340
  • 正文 我和宋清朗相戀三年乡数,在試婚紗的時候發(fā)現(xiàn)自己被綠了椭蹄。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,424評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡净赴,死狀恐怖绳矩,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情玖翅,我是刑警寧澤翼馆,帶...
    沈念sama閱讀 36,107評論 5 349
  • 正文 年R本政府宣布,位于F島的核電站金度,受9級特大地震影響应媚,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜猜极,卻給世界環(huán)境...
    茶點故事閱讀 41,789評論 3 333
  • 文/蒙蒙 一中姜、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧跟伏,春花似錦丢胚、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,264評論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至辞色,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間浮定,已是汗流浹背相满。 一陣腳步聲響...
    開封第一講書人閱讀 33,390評論 1 271
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留桦卒,地道東北人立美。 一個月前我還...
    沈念sama閱讀 48,798評論 3 376
  • 正文 我出身青樓,卻偏偏與公主長得像方灾,于是被迫代替她去往敵國和親建蹄。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,435評論 2 359

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