Android Material Design控制項使用(一)——ConstraintLayout 約束佈局

来源:https://www.cnblogs.com/kexing/archive/2019/02/01/10345761.html
-Advertisement-
Play Games

參考文章: "約束佈局ConstraintLayout看這一篇就夠了" "ConstraintLayout 屬性篇" 介紹 Android 是谷歌推出替代 的組件。 支持相對佈局、線性佈局、幀佈局,看來更像是 、 t、`RelativeLayout·三者的結合體,並且比這三者更強大的是實現了百分比布 ...


參考文章:
約束佈局ConstraintLayout看這一篇就夠了
ConstraintLayout - 屬性篇

介紹

Android ConstraintLayout是谷歌推出替代PrecentLayout的組件。

支持相對佈局、線性佈局、幀佈局,看來更像是FrameLayoutLinearLayout、`RelativeLayout·三者的結合體,並且比這三者更強大的是實現了百分比佈局。

大家都知道安卓碎片嚴重,使用百分比適配,那麼將徹底解決適配問題

總結:我最近也是剛學,學完之後,發現這個佈局已經將上述的所有佈局的特點全部融合在一起了,使用起來簡單方便的不要不要的,就是學習的屬性有點多啊。

不過,多也是正常的,畢竟融合了五大佈局的所有特點,學完這個佈局,各種界面UI都難不倒我們了

添加依賴

implementation 'com.android.support.constraint:constraint-layout:1.1.3'

我使用的是Android Studio3.0.1版本,已經自動導入了,預設使用的就是這個佈局

屬性及對應的方法

我們先瞭解一下一些基本的概念

這裡提一下,start和left其實都是指控制項的左邊,end和right都事指控制項的右邊

基本屬性

註意,這裡的屬性都得使用命名空間來才能使用

寬高屬性與之前的layout相同,wrap_contentmatch_parent但除此之外,還多出了一種,名為match contraint

實際上,這個多出來的相當於0dp,如果之前使用過LinearLayout的權重的話,應該對0dp有印象.

這裡,約束佈局應該是繼承了Linearlayout的特性,之後我們設置權重與Linearlayout的操作也是類似,具體的請往後面看,這可是實現了百分比佈局的強大佈局。

屬性值為控制項id

  • layout_constraintLeft_toLeftOf 當前控制項的左邊依賴於屬性控制項的左邊

  • layout_constraintLeft_toRightOf 當前控制項的左邊依賴於屬性控制項的右邊

  • layout_constraintRight_toLeftOf

  • ayout_constraintRight_toRightOf

  • layout_constraintTop_toTopOf

  • layout_constraintTop_toBottomOf

  • layout_constraintBottom_toTopOf

  • layout_constraintBottom_toBottomOf

  • layout_constraintBaseline_toBaselineOf 當前的控制項基線與屬性控制項的基線對齊

  • layout_constraintStart_toEndOf

  • layout_constraintStart_toStartOf

  • layout_constraintEnd_toStartOf

  • layout_constraintEnd_toEndOf

示例:

<?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">
    <Button
        android:id="@+id/btnA"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="A"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent"/>
    <Button
        android:id="@+id/btnB"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="B"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintStart_toEndOf="@id/btnA"/>
</android.support.constraint.ConstraintLayout>

A左邊依賴總佈局的左邊,頂部則是依賴總佈局的頂部,B則是左邊依賴於A的右邊,頂部依賴父佈局的頂部

其他的就不一一列舉了,舉一反三,挺容易的

mragin 邊距

只有在設置了依賴,之後設置邊距才會效果

這個屬性不需要使用app開頭,屬於原本的屬性

  • android:layout_marginStart 設置左邊的邊距

  • android:layout_marginEnd

  • android:layout_marginLeft

  • android:layout_marginTop

  • android:layout_marginRight

  • android:layout_marginBottom

例如:

<?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">

<Button
    android:id="@+id/btnA"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="A"
    android:layout_marginLeft="30dp"
    android:layout_marginTop="50dp"
    app:layout_constraintStart_toStartOf="parent"
    app:layout_constraintTop_toTopOf="parent"/>
<Button
    android:id="@+id/btnB"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_marginStart="60dp"
    android:text="B"
    app:layout_constraintStart_toEndOf="@id/btnA"/>
</android.support.constraint.ConstraintLayout>

示例:

使控制項B與A垂直對齊

B的左邊依賴A的左邊,B的右邊依賴A的右邊即可

    <?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">
    
        <Button
            android:id="@+id/btnA"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginStart="124dp"
            android:layout_marginTop="16dp"
            android:text="A"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toTopOf="parent"/>
    
        <Button
            android:id="@+id/btnB"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_marginEnd="8dp"
            android:layout_marginTop="8dp"
            android:text="B"
            app:layout_constraintEnd_toEndOf="@+id/btnA"
            app:layout_constraintStart_toStartOf="@+id/btnA"
            app:layout_constraintTop_toBottomOf="@+id/btnA"/>
             </android.support.constraint.ConstraintLayout>

輔助類或屬性使用

1. Barrier 屏障 控制項

     <android.support.constraint.Barrier
        android:id="@+id/barrier"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        app:barrierDirection="right"
        app:constraint_referenced_ids="TextView1,TextView2" />
        

app:barrierDirection為屏障所在的位置,可設置的值有:bottomendleftrightstarttop

app:constraint_referenced_ids為屏障引用的控制項,可設置多個(用“,”隔開)

2. Gruop 組 控制項

Group可以把多個控制項歸為一組,方便隱藏或顯示一組控制項,舉個例子:

      <android.support.constraint.Group
        android:id="@+id/group"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:visibility="invisible"
        app:constraint_referenced_ids="TextView1,TextView3" />

3. Placeholder 占位符 控制項

設置好占位符控制項的位置,之後調用setContent,把指定id的控制項放在占位符的位置

app:content=

4. Guideline 輔助線 控制項

可以使用這個控制項達到百分比佈局的效果,或者是當前的控制項沒有符合條件的參照物的情況使用

Guideline還有三個重要的屬性,每個Guideline只能指定其中一個:

  • layout_constraintGuide_begin,指定左側或頂部的固定距離,如100dp,在距離左側或者頂部100dp的位置會出現一條輔助線

  • layout_constraintGuide_end,指定右側或底部的固定距離,如30dp,在距離右側或底部30dp的位置會出現一條輔助線

  • layout_constraintGuide_percent,指定在父控制項中的寬度或高度的百分比,如0.8,表示距離頂部或者左側的80%的距離。

  • android:orientation 設置垂直或者是水平

Guideline是隱藏的,不用我們進行多餘的設置,雖然外面在預覽面板可以死看到它的存在

例子:使一個按鈕的長度占滿屏幕一半

    <android.support.constraint.Guideline
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/guidelineBegin"
        app:layout_constraintGuide_percent="0.5"
        android:orientation="vertical"/>

    <Button
        android:text="Button"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:id="@+id/button"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintEnd_toStartOf="@+id/guidelineBegin"
        app:layout_constraintTop_toTopOf="parent" />

Radio 比例 屬性

方便快捷調整控制項的寬高比,結合Guideline使用更佳

例子:

app:layout_constraintDimensionRatio

想要寬度與總佈局一樣,但高度是寬度的三分之一

寬高比為3:1

    <Button
        android:layout_width="match_parent"
        android:layout_height="0dp"
        app:layout_constraintDimensionRatio="3:1"/>
        
        

Chain 鏈 屬性

可以把這個當做成一個加強版的LinearLayout

由上圖,很好的知道了A與B的約束,A的左邊是父控制項的左邊,右邊則是B,B的左邊是A,B的右邊的是父控制項的右邊

chainstyle有三種屬性,分別是spread,spread_inside,pack,效果如下圖

  • spread 元素將展開(預設)

  • spread_inside 元素展開,但鏈的端點不會展開

  • pack 鏈中的元素將包裹在一起。子控制項的水平或垂直方向的偏置bias屬性會影響包裹中元素的位置

剩下的兩種則是通過添加屬性實現的

weighted chain是在spread chain的基礎上,而packed chain with bias則是在weight chain的基礎上

style為spread的,使用layout_constraintHorizontal_weightlayout_constraintVertical_weight來設置weigh權重

style為pack的,使用layout_constraintHorizontal_biaslayout_constraintVertical_bias進行偏移設置,屬性值0-1,也是百分比,改第一個元素

這裡需要說明的是,除了水平,還可以是垂直排列,不過,不能通過屬性來更改,而是通過約束來更改,把左邊改為頂端,右邊改為底部

如果是水平的,使用屬性layout_constraintHorizontal_chainStyle進行chainstyle屬性的更改

垂直的則是使用layout_constraintVertical_chainStyle

例子:

三個按鈕平分寬度(只需要將寬度設置為0dp就可以達到目的)

    <Button
        android:id="@+id/btn"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:text="Button"
        app:layout_constraintEnd_toStartOf="@id/btn1"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintStart_toStartOf="parent"/>
    <Button
        android:id="@+id/btn1"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:text="Button"
        app:layout_constraintStart_toEndOf="@id/btn"
        app:layout_constraintEnd_toStartOf="@id/btn2"/>
    <Button
        android:id="@+id/btn2"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:text="Button"
        app:layout_constraintStart_toEndOf="@id/btn1"
        app:layout_constraintEnd_toEndOf="parent"/>

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • oracle中plsql編程式控制制語句與迴圈語句使用以及具體案例說明 ...
  • 1.什麼是鎖: 對共用資源進行併發訪問,提供數據的完整性和一致性。 2.鎖的區別: Lock Manager的哈希表中 latch是針對程式內部的資源(比如:全局變數)的鎖的定義,而這裡的lock針對的是資料庫的事務。 lock有latch來保證和實現。 3.鎖是用來實現併發控制,併發控制用來實現隔 ...
  • “查詢存在" 01 "課程但可能不存在" 02 "課程的情況(不存在時顯示為 null )” ——翻譯為:課程表裡面,存在01的信息,未必滿足有02的課程情況 ——覺得題意不是很明確,但是就當成練習left join 和right join的理解 1、存在01課程情況 SELECT * from s ...
  • 什麼是Intent Intent可以理解為信使(意圖) 由Intent來協作完成Android各個組件之間的通訊, 也可以說是實現頁面與頁面之間的跳轉 Intent實現頁面之間的跳轉 startActivityForResult(intent, requestCode); //第二種啟動方式 onA ...
  • 微信小程式 人臉識別登陸的實現 關鍵詞:微信小程式 人臉識別 百度雲介面 前言 這是一篇關於一個原創微信小程式開發過程的原創文章。涉及到的核心技術是微信小程式開發方法和百度雲人臉識別介面。小程式的主體是一個用於個人密碼存儲的密碼管理器,在登陸註冊階段,需要調用百度雲人臉識別介面以及百度雲線上人臉庫的 ...
  • 跨功能需求(Cross-Functional Requirements, CFR)通常被稱為非功能需求(Non-Functional Requirements, NFR), 也可以叫做系統質量屬性(System Quality Attributes/Traits), 是指那些用來評價系統運行狀態的需... ...
  • 在上一篇 學習安卓開發[4] 使用隱式Intent啟動簡訊、聯繫人、相機應用 中瞭解了在調用其它應用的功能時隱式Intent的使用,本次基於一個圖片瀏覽APP的開發,記錄使用AsyncTask在後臺執行HTTP任務以獲取圖片URL,然後使用HandlerThread動態下載和顯示圖片 HTTP 請求 ...
  • 本文以一個簡單的小例子,簡述Android開發中GridView的常見應用,僅供學習分享使用。 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...