【约束布局】ConstraintLayout 约束布局 ( 简介 | 引入依赖 | 基本操作 | 垂直定位约束 | 角度定位约束 | 基线约束 )
文章目錄
- 一. ConstraintLayout 簡介
- 1. 引入 約束 布局
- ( 1 ) 約束性布局 作用 和 簡介
- 2. 約束 簡介
- ( 1 ) 約束個數要求
- ( 2 ) 約束設置 與 顯示位置
- 3. ConstraintLayout 引入
- ( 1 ) ConstraintLayout 依賴添加
- ( 2 ) ConstraintLayout 轉換 與 添加
- 二. ConstraintLayout 約束 的 基本操作
- 1. 約束基本操作
- ( 1 ) Design ( 設計 ) 和 Blueprint ( 藍圖 ) 布局編輯界面
- ( 2 ) 添加 刪除 約束
- 3. 相對 定位 約束
- ( 1 ) 相對定位 簡介
- ( 2 ) 垂直方向 約束 圖解
- ( 3 ) 垂直方向 約束 圖解
- ( 4 ) 開始 結束 約束 圖解
- 4. 角度 定位 約束
- ( 1 ) 角度定位 約束
- 5. 基線約束
- ( 1 ) 基線約束 ( app:layout_constraintBaseline_toBaselineOf )
一. ConstraintLayout 簡介
1. 引入 約束 布局
( 1 ) 約束性布局 作用 和 簡介
約束性布局簡介 ( 基于官方文檔翻譯 ) :
- 1.作用 : ConstraintLayout 布局 可用于 構建 大型的復雜的布局 , 并且該布局可以只有一層嵌套 , 其 解決了 開發 復雜布局 , 出現的布局嵌套過多問題 , 減少了界面繪制的時間 ;
- 2.意義 : 使用 ConstraintLayout , 視圖層級會變得非常精簡 , 并在 Android Studio 中 進行可以進行可視化操作 ;
- 3.與其它布局的比較 :
- ① 相同點 : ConstraintLayout 與 其它布局 都是 ViewGroup 的子類 , 其 擁有基本布局的公用屬性 ;
- ② 不同點 : ConstraintLayout 的布局 , 是 通過 約束規則 實現的 , 其新增了很多屬性 ;
- 4.與相對布局 ( RelativeLayout ) 比較 :
- ① 相同點 ( 所有組件都有關聯 ) : ConstraintLayout 有點類似于 RelativeLayout , 所有的 組件都與 其 兄弟組件 或 父控件 有關聯關系 ;
- ② 不同點 ( 靈活 且 編輯可視化 ) : 但是 約束布局 更加靈活 , 并且 ConstraintLayout 能在 Android Studio 布局編輯器中進行編輯 ;
- 5.可視化操作 : 在 布局編輯器 工具中 , 可以設置所有的屬性 , 該 布局編輯器 是專門針對 ConstraintLayout 的屬性進行開發的 ; 因此可以完全使用拖控件的方式 進行 布局編輯 , 代替之前的 XML 編輯方法 ; ( 官方這么說的 , 感覺純屬扯淡 , 不看代碼不放心 )
2. 約束 簡介
( 1 ) 約束個數要求
ConstraintLayout 布局中 單個組件 約束個數要求 :
- 1.約束要求 : 在 ConstraintLayout 中 設置 View 的位置 , 至少為 該 View 設置 一個垂直 和 一個水平 約束 ;
- 2.約束內容 : 每種約束都 代表了 該組件 與 另外一個組件 ( 或父控件 , 基線 Guideline ) 之間的 聯系方式 或 對齊方式 ;
- 3.原理 : 每個 約束 ( Constraint ) 都定義了 該 View 沿水平 或 垂直 方向的位置 , 因此 每個 View 都必須在 水平 或 垂直 方向上 含有一個約束 , 大部分情況下 都是有多個約束 ;
( 2 ) 約束設置 與 顯示位置
約束設置 與 顯示位置 :
-
1.編輯器位置 : 向布局編輯器中拖入 組件 , 如果不為其設置約束 , 他就會呆在鼠標松開的位置 ;
-
2.顯示位置 : 如果 在 ConstraintLayout 中組件沒有約束 , 在設備上運行時 , 該組件將在 ( 0 , 0 ) 坐標 ( 即 左上角 ) 處顯示 ;
-
3.沒有添加約束示例 ( 官網示例 ) : 如下圖 , 沒有為 C 組件設置 垂直約束 , 在布局編輯器中 其 在 A 組件的下方顯示 , 但是 在設備上運行時 , C 組件 左右 與 A 組件對齊 , 但是其顯示在 屏幕的 最頂端 , 因為 C 組件沒有垂直方向的約束 ;
-
4.約束錯誤信息 : 盡管 組件 缺少一個約束 , 不會引起編譯錯誤 , 但是 布局編輯器中 會在工具欄中 顯示 “missing constraints” 錯誤 , 點擊 紅色感嘆號 圖標 , 會在下方的 Message 對話框中顯示出具體錯誤信息 ;
3. ConstraintLayout 引入
( 1 ) ConstraintLayout 依賴添加
ConstraintLayout 引入 :
- 1.聲明 google 庫 : 在 項目的 build.gradle 文件 中添加如下內容 :
- 2.添加依賴 : 在 Module 的 build.gradle 文件中, 添加如下依賴 :
- 3.同步工程 : 在工具欄中 , 點擊 “Sync Project with Gradle Files” 按鈕 ;
( 2 ) ConstraintLayout 轉換 與 添加
ConstraintLayout 轉換 與 添加 :
- 1.轉換布局 :
- ① 進入布局界面 : 在 Android Studio 打開布局文件 , 選擇 Design 視圖 ;
- ② 轉換操作 : 打開 “Component Tree” 界面 , 右鍵點擊 根組件 , 選擇 Convert layout to ConstraintLayout 選項 , 即可將布局轉為 ConstraintLayout ;
- 2.添加新布局 :
- ① 選擇添加布局文件 : 右鍵點擊 layout 目錄 , 選擇 New -> Layout resource file 選項 ;
- ② 設置布局類型 : 設置布局文件類型為 “android.support.constraint.ConstraintLayout” ;
- ① 選擇添加布局文件 : 右鍵點擊 layout 目錄 , 選擇 New -> Layout resource file 選項 ;
二. ConstraintLayout 約束 的 基本操作
1. 約束基本操作
( 1 ) Design ( 設計 ) 和 Blueprint ( 藍圖 ) 布局編輯界面
Design ( 設計 ) 和 Blueprint ( 藍圖 ) 界面 :
- 1.Design ( 設計 ) 界面 : 最終的效果展示界面 ;
- 2.Blueprint ( 藍圖 ) 界面 : 編輯 約束布局 的各種屬性 ;
- 3.界面切換 : 點擊 “Select Design Surface” 按鈕 , 可以 選擇 界面的三種顯示方式 ;
- ① “Design” : 只顯示 Design ( 設計 ) 界面 ,
- ② “Blueprint” : 只顯示 Blueprint ( 藍圖 ) 界面 ,
- ③ “Design + Blueprint” : 同時顯示 Design ( 設計 ) 和 Blueprint ( 藍圖界面 ) ;
一般情況下 , 我們選擇第三種 “Design + Blueprint” 同時顯示 兩個布局編輯界面 ;
( 2 ) 添加 刪除 約束
添加 刪除 約束 :
- 1.拖入控件 : 從 “Palette” 中拖入 Button 控件到 Design 界面 中 ;
- 2.選中后查看其變化 : 寬高 中心點 的 圓點 用于設置 約束 , 左下角 下面 的 按鈕用于設置基線 ;
- 3.添加約束 : 鼠標左鍵 按住寬高中心點的圓點 , 將其 拖動到 邊界 或 其它組件對應位置 , 即可 為 該組件 添加對應的 水平 或 垂直 約束 ; 將 Button 的四個方向的約束 拖到 ConstraintLayout 根布局邊界 ;
- 4.刪除約束 : 可以一次性刪除 所有約束 , 也可以 刪除 指定方向的約束 ;
- ① 刪除所有約束 : 點擊 “Clear All Constraints” 按鈕 , 可以刪除所有約束 ;
- ② 刪除指定約束 : 點擊 對應的圓點 , 可以刪除指定方向的約束 ;
- 5.查看生成的代碼 :
- 6.margin 屬性 : 其中有 4 個 margin 屬性 , 明顯是多余的 , 可以在工具欄中 , 將 margin 的默認值修改為 0 dp , 默認是 8dp , 這樣自動生成的代碼中就不會帶有 margin 屬性了 ;
- 7.約束屬性 : 介紹 4 個 約束屬性 ;
- ① app:layout_constraintBottom_toBottomOf="parent" 屬性作用 :
- 1> 被約束位置 : layout_constraintBottom 含義是 設置組件的 Bottom ( 底部 ) 位置的約束 ,
- 2> 約束到目標位置 : toBottomOf 的含義是 設置其 目標約束位置 , 即 某個組件的 Bottom ( 底部 ) ,
- 3> 屬性值 : 該屬性的值 就是 目標約束組件 ;
- ② app:layout_constraintEnd_toEndOf="parent" 屬性作用 :
- 1> 被約束位置 : layout_constraintEnd 含義是 設置組件的 End ( 右部 ) 位置的約束 ,
- 2> 約束到目標位置 : toEndOf 的含義是 設置其 目標約束位置 , 即 某個組件的 End ( 右部 ) ,
- 3> 屬性值 : 該屬性的值 就是 目標約束組件 ;
- ③ app:layout_constraintStart_toStartOf="parent" 屬性作用 :
- 1> 被約束位置 : layout_constraintStart 含義是 設置組件的 Start ( 左部 ) 位置的約束 ,
- 2> 約束到目標位置 : toStartOf 的含義是 設置其 目標約束位置 , 即 某個組件的 Start ( 左部 ) ,
- 3> 屬性值 : 該屬性的值 就是 目標約束組件 ;
- ④ app:layout_constraintTop_toTopOf="parent" 屬性作用 :
- 1> 被約束位置 : layout_constraintTop 含義是 設置組件的 Top ( 頂部 ) 位置的約束 ,
- 2> 約束到目標位置 : toTopOf 的含義是 設置其 目標約束位置 , 即 某個組件的 Top ( 頂部 ) ,
- 3> 屬性值 : 該屬性的值 就是 目標約束組件 ;
- ① app:layout_constraintBottom_toBottomOf="parent" 屬性作用 :
3. 相對 定位 約束
( 1 ) 相對定位 簡介
相對定位屬性 :
- 1.常用的相對定位屬性 : 下面是常用的 相對定位 約束 ;
- 2.注意 : 垂直方向的約束 , 其 目標組件的約束 也必須是垂直方向的 ; 同理 水平方向的約束 , 其目標組件的約束 也 必須是水平方向的 ;
( 2 ) 垂直方向 約束 圖解
相對定位 垂直方向 約束 圖解 :
- 1.layout_constraintLeft_toLeftOf :
- 2.layout_constraintLeft_toRightOf :
- 3.layout_constraintRight_toLeftOf :
- 4.layout_constraintRight_toRightOf :
( 3 ) 垂直方向 約束 圖解
相對定位 垂直方向 約束 圖解 :
- 1.layout_constraintTop_toTopOf :
- 2.layout_constraintTop_toBottomOf :
- 3.layout_constraintBottom_toTopOf :
- 4.layout_constraintBottom_toBottomOf :
( 4 ) 開始 結束 約束 圖解
開始 結束 約束 圖解 : 該種情況下 , 與 水平方向的 方位 基本一致 ;
- 1.layout_constraintStart_toEndOf :
- 2.layout_constraintStart_toStartOf :
- 3.layout_constraintEnd_toStartOf :
- 4.layout_constraintEnd_toEndOf :
4. 角度 定位 約束
( 1 ) 角度定位 約束
角度定位 :
- 1.簡介 : 約束布局 中 的 角度定位 , 同過 設置 一個 角度 和 一個 距離 , 來確定 兩個控件的相對位置 ;
- 2.需要設置的屬性 : 角度 定位 需要設置 三個 屬性 , 分別是 ① 被約束組件 , ② 與被約束組件形成的角度 , ③ 兩個組件中心點的距離 ;
- 3.完整代碼示例 :
-
4.效果展示 :
-
5.角度 備注 : 目標組件 垂直 向上 方向 是 0 度 ; 角度是 兩個 組件 中心點 連線 與 垂直向上方向的角度 ;
- ① 正上方配置 : 如果 配置 0 度 , 被約束組件 在 目標組件 正上方 ;
- ② 正右方配置 : 配置 90 度 , 被約束組件 在 目標組件 正右側 ;
- ③ 正下方配置 : 配置 180 度 , 被約束組件 在 目標組件 正下方 ;
- ④ 正左方配置 : 配置 270 度 , 被約束組件 在 目標組件 正左方 ;
-
6.距離 備注 : app:layout_constraintCircleRadius 屬性配置的距離 , 是兩個組件 中心點的距離 ;
5. 基線約束
( 1 ) 基線約束 ( app:layout_constraintBaseline_toBaselineOf )
基線約束 :
- 1.作用 : 用于 文本對齊 , 如果 兩個視圖中有 文字 , 可以使用 基線約束 將兩個 視圖中的 文本 進行對齊操作 ;
- 2.設置方法 : 點擊 基線約束 按鈕 , 鼠標左鍵按住 并拖動 到另一個組件的基線 , 將該組件的基線約束到 另外 一個組件的基線上 , 該組件的 Top 和 Bottom 約束會消失 ;
- 3.生成代碼配置 : 基線約束 會 產生 app:layout_constraintBaseline_toBaselineOf="@+id/button" 代碼 ;
- 4.后續影響 : 被 基線約束 的組件 , 其垂直方向的約束會消失 ;
- 5.生成的完整代碼 ( 參考 ) :
總結
以上是生活随笔為你收集整理的【约束布局】ConstraintLayout 约束布局 ( 简介 | 引入依赖 | 基本操作 | 垂直定位约束 | 角度定位约束 | 基线约束 )的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【Android 应用开发】Paint
- 下一篇: 【约束布局】ConstraintLayo