<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
ConstraintLayout
是Android官方在2016年Google的I/O大會推出的一種可以靈活控制子控制元件的位置和大小的新佈局方式,也是目前Android的幾大佈局中功能最強大的佈局。在最新版的Android Studio中
,建立佈局檔案的預設根元素都是ConstraintLayout
了。
ConstraintLayout優點
ConstraintLayout
之所以成為目前Android開發中主流的佈局,除了官方建議使用ConstraintLayout外還有以下幾個方面的優勢
在Android Studio中預設的佈局方式是約束佈局,在約束佈局中新增控制元件非常簡單,只需要從左側的Palette
區域拖動控制元件到中間的介面編輯區域即可。
在約束佈局中,點中任意一個控制元件,該控制元件的上下左右四個方向各會出現一個圓圈,該圓圈代表可以新增的約束。
當把滑鼠移動到圓圈上,按住滑鼠左鍵,然後移動滑鼠到父佈局的上下左右任意邊緣再鬆開滑鼠即可給該方向新增約束,新增完約束後該圓圈會由空心圓變成實心圓,同時控制元件也會移動到該父佈局新增約束的方向的邊緣。
當給一個控制元件上下方向都新增約束後該控制元件會在垂直方向居中,同樣的給一個控制元件左右方向都新增約束該控制元件會在水平方向居中。
如果想給一個控制元件去掉約束,選中該控制元件後,在右上角Layout
區域,點選該方向上的×
符號即可去掉該方向上的約束
也可以拖動Layout區域
的水平條和垂直條來控制左右方向和上下方向兩邊約束的比例,該值越小,控制元件會越靠左和上。
給控制元件某個方向新增約束後該控制元件預設會緊靠該方向約束的父佈局邊緣,可以設定控制元件在Layout區域設定該方向與父佈局的邊緣間距。
在約束佈局中,除了可以給一個控制元件將約束新增到父佈局邊緣,也可以將一個控制元件的約束新增到另外一個控制元件上,新增約束的方法跟新增都父佈局一樣。當給一個控制元件左邊新增約束到另外一個控制元件左邊,該控制元件左邊緣會平齊另外一個控制元件的左邊緣。給一個控制元件的下邊緣新增約束到另外一個控制元件的上邊緣,該控制元件會緊貼另外一個控制元件的上邊緣
如果給一個控制元件左右兩邊都新增約束到另外一個控制元件的兩邊,這兩個控制元件的大小又不一樣,那麼該兩個控制元件的中軸線會平齊。
用視覺化區域來編寫佈局雖然比較簡單,但是對於一些佈局的微呼叫xml程式碼會更快,要熟練掌握約束佈局,學會用xml程式碼來編寫約束佈局也是必備的技能。
給父佈局新增約束
這裡的Strart和End 換成Left和Right也可以。
將約束新增到其他
在LinearLayout
佈局中weight
屬效能夠實現子控制元件講父佈局的控制元件按比例分配,在ConstraintLayout 中通過Chains鏈也能夠實現相同的功能,而且Chains鏈的功能比LinearLayout
佈局中weight
屬性功能更加強大。
Chains鏈
的基本用法如下:選中多個控制元件,右鍵Chains
->Create Horizontal Chains
即可將父佈局的剩餘空間進行均勻分佈。
Chains鏈
對父控制元件的剩餘空間有三種分配方式,即Spread、spread inside、packed,預設值是Spread即將控制元件包括第一個控制元件和最後一個兩邊均勻分配
spread inside
值表示第一個控制元件和最後一個控制元件兩邊不分配空間
spread inside
值表示所有控制元件挨在一起,第一個控制元件和最後一個控制元件兩邊均勻分配父控制元件的剩餘空間
在其他佈局中,控制元件的尺寸單位有wrap_content
、dp固定值、match_parent
三種值,在約束佈局中的控制元件還可以給其設定MATCH_CONSTRAINT(0dp)
,該值的含義代表約束尺寸,即控制元件的尺寸由其左右兩邊的約束來控制。
舉個栗子
比如很多app的首頁都是由底部banner
和頂部fragment
組成,而fragment的高度通常不是固定的,如果用其他的佈局fragment的高度就很難調節,這時候可以用MATCH_CONSTRAINT(0dp)
動態調節fragment的尺寸高度,給頂部的fragment設定其高度為0dp
,給其上下各新增一個約束,這時候其高度為父佈局的頂部到底部控制元件的頂部。
<?xml version="1.0" encoding="utf-8"?> <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="match_parent" tools:context=".MainActivity"> <TextView android:id="@+id/textView4" android:layout_width="match_parent" android:layout_height="60dp" android:background="@color/purple_200" android:text="底部banner" android:gravity="center" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" /> <TextView android:id="@+id/textView5" android:layout_width="match_parent" android:layout_height="0dp" android:background="@color/teal_200" android:gravity="center" android:text="頂部fragment" app:layout_constraintBottom_toTopOf="@+id/textView4" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" /> </androidx.constraintlayout.widget.ConstraintLayout>
ConstraintLayout 還支援控制元件的尺寸按照父佈局尺寸的百分比來設定
tips:只有寬度和高度尺寸為0dp百分比屬性才會生效
有些app的banner圖通常是按照一定比例來設定的,如16:9,1:1等,用其他佈局圖片的寬度如果設定成match_parent,圖片的高度就需要根據比例動態去計算,非常的麻煩。在約束佈局中通過radio
屬性很容易實現這樣的需求。
給圖片寬度設定match_parent
,高度設定成約束尺寸0dp
,然後再新增一個layout_constraintDimensionRatio
屬性,屬性的值可以設定h,16:9
其中h表示高寬比的比值,也可以設定成將值設定w,9:16
,w表示寬高比的比值。
ConstraintLayout 還支援圓型定位,將一個控制元件的中心以一定的角度和距離約束到另一個控制元件的中心上,相當於在一個圓上放置一個控制元件。
圓形定位主要通過以下三個屬性值來控制
layout_constraintCircle
:參照另一個控制元件的 id。layout_constraintCircleRadius
:到另一個控制元件中心的距離。layout_constraintCircleAngle
:控制元件的角度(順時針,0 - 360 度)。Guideline是ConstraintLayout佈局裡面的一個工具類,其作用相當於一條輔助線,預設不可見,可以用於輔助佈局
layout_constraintGuide_percent
:按照比例設定輔助線的位置layout_constraintGuide_begin
:按照值設定輔助線的位置
Guideline輔助線的位置既可以按照百分比來設定,也可以按照值來設定。
Group 可以對一組的控制元件同時設定其可見性的值Visible、Invisible或者Gone
。
其使用方法如下:在佈局中右鍵新增Group,再將一組控制元件拖動到Group中,通過控制Group的屬性來調節一組控制元件的可見性。
Barrier和Guideline 一樣,本身不可見,使用者輔助佈局。
假如有個這樣的需求,頁面中有個兩個Button1和Button2,一個TextView3 ,現在需要讓TextView3 處於Button1或Button2的右邊,對齊Button1和Button2中較寬的控制元件。
如果將TextView3 的左邊約束的加在Button1上,當Button2較寬時會擋住TextView3 ,在不用Barrier時,需要通過再增加一層佈局將Button1和Button2放到佈局中才能實現該需求。
使用Barrier的解決方案:
1、首先在編輯區域右鍵新增一個垂直方向的Barrier,將Button1和Button2拖動到Barrier中
2:將Barrier的barrierDerection
屬性設定成right
,right
屬性表示其他控制元件對齊barrier控制元件中的靠右的控制元件
3、將textview3左邊的約束加到Barrier上
測試效果如下
到此這篇關於Android中ConstraintLayout約束佈局解析的文章就介紹到這了,更多相關Android ConstraintLayout約束佈局內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45