前往
大廳
主題

手把手帶你認識 Android ConstraintLayout

播磨拳兒 | 2022-04-15 22:26:13 | 巴幣 0 | 人氣 661

很多人都不知道ConstraintLayout強大的地方在哪裡
為何RelativeLayout(相對位置)會從列表上消失
主要原因還是在Android各家版本各自為政
解析度更是千奇百怪的多
如果還是維持RelativeLayout
相同位置在RelativeLayout和ConstraintLayout會差很多
又會因為不同的解析度造成位置錯亂
聽說有一部份是因為被iOS的autolayout逼得
Android更需要類似的東西啊
所以ConstraintLayout就誕生了


很多人覺得ConstraintLayout很難理解
其實並不難
我們new一個新的project來看
OK, 接著來看他的XML
其實,在TextView上點他一下,你可以看到這個
這些線,其實就是XML裡,TextView裡面寫的
這邊parent不用說,自然就是最外框
但是它上面到底在寫什麼?
靜下心,慢慢看
我們就先從『頭』開始教



如上圖,也就是說它代表的是這條線
所以,你的View會跑向別的地方,可以從他相依的對象去推測到底跑哪去
這樣設定,看圖說故事,元件的top跑去相依parent的bottom了
所以畫面就變成…
畢竟是你叫他的Top去相依parent的bottom啊= =
如果我把他四個方位都寫出來,你會舉一反三了嗎?
再來一點變化,兩個View的相依關係
這樣純看文字,你知道他們會如何站嗎?
靜下心來一行一行慢慢看
除了各自的id以外
長寬設定也不看,text設定不看
id叫textView的那個傢伙四周都是相依parent
也就是說他會是在畫面的正中間
另外一個沒有id的按鈕
相依關係除了他自己的start是相依id叫textView的傢伙的end
也就是說, 畫面大概長這樣
實際來看畫面,右上角的按鈕找一下
同理,如果按鈕top和bottom都相依textView的bottom呢?
看起來就會像button只吃一半的textView高度
再來start和end都相依textView的end
其實仔細看
按鈕其實是在textView的右下角
只是因為按鈕太大顆了…
那我們把兩個人的位子互換
讓textView的top和bottom都相依按鈕的bottom
start和end都去相依按鈕的end
這樣有沒有好一點?
你想要做元件重疊
可以讓他的四周完全相依另外一個元件的四周
只是這樣不太好看到textView,所以我們來改他的背景顏色
看出差異了吧?
P.S: 如果你碰到textview在button的背後
你會發現你的textview出不來
這是因為你的textview在button的後面
如果你的Android Studio是4.0.1以上
Android Studio的右下角有個『Layout Inspector』
這個玩意兒可以讓你及時看你手機上的UI排序
之後你就可以即時看到你的UI的變化
剛剛不是說了嗎? textview在你的button後面
我們試著在Layout Inspector上按住左鍵拖曳
看到你的textview在跟你Hello了嗎?
那真的碰到這種定位有問題該怎麼辦?
其實調整Z軸也是一種方式
android:translationZ=”3dp” 也是一種解
android:elevation=”3dp”也是一種
對於沒有玩過Photoshop的人來說
解釋『圖層』你一定聽不懂
簡單說, 圖片疊圖片 層層疊
相對的, 我們也可以在裡面塞LinearLayout之類的其他佈局
來讓畫面有更多變化
圖解一下階層關係
這邊說明一下:
LinearLayout的寬是0dp
為何會那麼長?
其實這是ConstraintLayout的特異功能
只要你的兩側是有相依關係(左配右 or 上配下)
如果你想要讓他在裡面佔滿版
設定0dp就可以讓他在這個相依關係之間佔滿版
以我的LinearLayout來說
start相依button的start
end相依parent
LinearLayout裡面的那群Button
由於他們的parent是LinearLayout
所以只會受到LinearLayout的影響
但是如果你要設定0dp, 水平或是垂直方向兩邊一定都要有相依
所以講白話一點,
長要0dp: top和bottom就一定都要有相依
反之, 寬要0dp: start和end就一定都要有相依
(當然, 你要全部都有相依也可以)
相依誰, 就要看你的layout如何設計
當然,如果你的長寬打從一開始就是match_parent
那就不用想啦,都佔滿版了
相依關係根本都沒意義了
(所以連相依關係都可以不用給)
相依關係其實左右只需要有一邊有相依即可
上下也是一樣
簡單說,『水平方向要有一側』『垂直方向要有一側』
兩個都至少要有一個有相依,關係才會成立 (match_parent不算在內)
所以搭配上可以只要『Top Start』『Top End』『Bottom Start』『Bottom End』四種 (下圖是以TextView來示範)
[color=rgba(0, 0, 0, 0.8)]
所以搭配上可以只要『Top Start』『Top End』『Bottom Start』『Bottom End』四種
基本上,只要弄懂ConstraintLayout和LinearLayout
大概90%以上的App畫面都可以疊得出來
甚至還可以用View疊View, 硬刻出相似的畫面
ConstraintLayout其實還有很好用的夥伴
尤其是Guideline (輔助定位)
使用它, 剛剛說的百分之90以上的畫面
可以再增加到95%以上做更細部的定位
不過這不在這次的教學範圍內
有興趣的可以自行玩玩看


總結來說:
ConstraintLayout解決了RelativeLayout很多的缺點
拉Layout變得更加彈性
可以說是解決現今手機尺寸不一, 造成畫面排版亂象的問題

如果還有其他問題, 歡迎到我的Line群組 & 社群找我
本文亦同時刊載在Medium
或是有興趣一起交流Android相關技術
也可以在我個人創立的Line群組『Android交流讀書會』中找我
或是公開社群『Android Home

創作回應

更多創作