Android 四大布局:使用方式與性能優化原理

一、四大布局基本用法與特點

1.?LinearLayout(線性布局)

使用方式

<LinearLayoutandroid:orientation="vertical"  <!-- 排列方向:vertical/horizontal -->android:layout_width="match_parent"android:layout_height="match_parent"><Buttonandroid:layout_width="match_parent"android:layout_height="wrap_content"android:text="按鈕1"/><Buttonandroid:layout_width="0dp"         <!-- 權重布局 -->android:layout_height="wrap_content"android:layout_weight="1"          <!-- 占剩余空間1/3 -->android:text="按鈕2"/>
</LinearLayout>

特點

  • 單向排列(水平/垂直)

  • 權重分配(layout_weight

  • 痛點:實現復雜布局需多層嵌套 → 性能下降


2.?FrameLayout(幀布局)

使用方式

<FrameLayoutandroid:layout_width="match_parent"android:layout_height="300dp"><ImageView.../>  <!-- 底層圖片 --><Buttonandroid:layout_gravity="center" <!-- 居中定位 -->android:text="居中按鈕"/><TextViewandroid:layout_gravity="bottom|end" <!-- 右下角定位 -->android:text="右下角文字"/>
</FrameLayout>

特點

  • 子視圖堆疊在左上角

  • 通過?layout_gravity?調整位置

  • 痛點:無法實現復雜相對定位


3.?RelativeLayout(相對布局)

使用方式

<RelativeLayoutandroid:layout_width="match_parent"android:layout_height="match_parent"><Buttonandroid:id="@+id/btn1"android:layout_alignParentTop="true" <!-- 貼父容器頂部 -->android:text="按鈕1"/><Buttonandroid:layout_toRightOf="@id/btn1"  <!-- 在btn1右側 -->android:layout_alignBottom="@id/btn1" <!-- 底部對齊btn1 -->android:text="按鈕2"/>
</RelativeLayout>

特點

  • 基于兄弟/父容器相對定位

  • 痛點

    • 循環依賴導致測量失敗(如A在B右側,B在A左側)

    • 需兩次測量遍歷(橫向+縱向)→ 性能中等


4.?ConstraintLayout(約束布局)

使用方式

<androidx.constraintlayout.widget.ConstraintLayoutandroid:layout_width="match_parent"android:layout_height="match_parent"><!-- 基礎約束 --><Buttonandroid:id="@+id/btn1"app:layout_constraintStart_toStartOf="parent" <!-- 貼父容器左側 -->app:layout_constraintTop_toTopOf="parent"     <!-- 貼父容器頂部 -->android:text="按鈕1"/><!-- 相對約束 + 邊距 --><Buttonapp:layout_constraintStart_toEndOf="@id/btn1" <!-- 在btn1右側 -->app:layout_constraintTop_toTopOf="@id/btn1"    <!-- 頂部對齊btn1 -->android:layout_marginStart="10dp"             <!-- 左邊距10dp -->android:text="按鈕2"/><!-- 水平鏈條均分 --><Buttonapp:layout_constraintHorizontal_chainStyle="spread"app:layout_constraintStart_toStartOf="parent"app:layout_constraintEnd_toStartOf="@+id/btn3"/>
</androidx.constraintlayout.widget.ConstraintLayout>

特點

  • 通過錨點(約束)連接父容器/兄弟視圖/輔助線

  • 高級功能:

    • 鏈條(Chains):替代線性布局權重

    • 比例約束(layout_constraintDimensionRatio

    • 虛擬輔助(Guideline/Barrier)


二、性能優化原理:測量過程流程圖

1.?LinearLayout 測量過程(嵌套時性能最差)

性能問題

  • 測量次數 = O(2?)(n為嵌套層數)

  • 每層嵌套需2次測量(父測量子 + 子自身測量)

  • 示例:3層嵌套 → 7次測量


2.?RelativeLayout 測量過程

性能問題

  • 需?兩次遍歷(橫向+縱向)

  • 循環依賴導致?重復測量

  • 測量次數 = O(n2)(n為子視圖數量)


3.?ConstraintLayout 測量過程

性能優勢

  • 單次測量完成(O(n) 復雜度)

  • 約束求解器(Constraint Solver)將布局問題轉化為?數學方程組求解


三、為什么ConstraintLayout性能最優?

1.?減少嵌套 → 減少測量次數
布局實現相同界面所需層級測量復雜度
LinearLayout5層O(2?)=32
RelativeLayout3層O(n2)=9
ConstraintLayout1層O(n)=3
2.?測量機制本質差異
  • 傳統布局:遞歸測量 → 父布局等待子布局測量結果 →?同步阻塞式

  • ConstraintLayout

    1. 收集所有約束條件

    2. 約束求解器?一次性計算?所有視圖位置

    3. 應用計算結果 →?異步批處理式

3.?硬件加速優化
  • 約束條件轉化為GPU可執行的?圖形指令

  • 減少CPU計算量(尤其旋轉屏幕等布局重構場景)


四、常見問題

Q:為什么ConstraintLayout能減少性能開銷?

A

  1. 扁平化布局設計

    • 通過約束關系直接定位視圖,避免多層嵌套(如用鏈條替代LinearLayout權重)

    • 減少視圖樹深度,直接降低測量/繪制復雜度

  2. 單次測量機制

    • 傳統布局(如LinearLayout)嵌套時測量次數呈?指數級增長(O(2?))

    • ConstraintLayout使用?約束求解器?一次性計算所有視圖位置,測量次數?優化為O(n)

  3. 硬件加速支持

    • 約束條件轉化為GPU指令(減少CPU負擔)

    • 官方測試:渲染速度比RelativeLayout快40%

結論
對于復雜界面,ConstraintLayout通過減少嵌套+單次測量,從根本上解決Android布局性能瓶頸。


五、各布局適用場景總結

布局最佳使用場景性能風險點
LinearLayout簡單列表/表單嵌套超過3層時性能驟降
FrameLayout碎片容器/懸浮按鈕多子視圖定位困難
RelativeLayout中等復雜度相對定位子視圖超過10個時測量緩慢
ConstraintLayout所有復雜界面超簡單布局略顯繁瑣

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/92844.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/92844.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/92844.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Redis的BigKey問題

Redis的BigKey問題 什么是大Key問題&#xff1f; 大key問題其實可以說是大value問題&#xff0c;就是某個key對應的value所占據的存儲空間太大了&#xff0c;所以導致我們在操作這個key的時候花費的時間過長&#xff08;序列化\反序列化&#xff09;&#xff0c;從而降低了redi…

TDengine IDMP 產品基本概念

基本概念 元素 (Element) IDMP 通過樹狀層次結構來組織數據&#xff0c;樹狀結構里的每個節點被稱之為元素 (Element)。元素是一個物理的或邏輯的實體。它可以是具體的物理設備&#xff08;比如一臺汽車&#xff09;&#xff0c;物理設備的一個子系統&#xff08;比如一臺汽車的…

專題二_滑動窗口_將x減到0的最小操作數

一&#xff1a;題目解釋&#xff1a;每次只能移除數組的邊界&#xff0c;移除的邊界的總和為x&#xff0c;要求返回你移除邊界的最小操作數&#xff01;也就是說你最少花幾次移除邊界&#xff0c;就能夠讓這些移除的邊界的和為x&#xff0c;則返回這個次數&#xff01;所以這個…

CentOS 7 下通過 Anaconda3 運行llm大模型、deepseek大模型的完整指南

CentOS 7 下通過 Anaconda3 運行llm大模型、deepseek大模型的完整指南A1 CentOS 7 下通過 Anaconda3 運行大模型的完整指南一、環境準備二、創建專用環境三、模型部署與運行四、優化配置常見問題解決B1 CentOS 7 下通過 Anaconda3 使用 CPU 運行 DeepSeek 大模型的完整方案一、…

Flutter應用在Windows 8上正常運行

要讓Flutter應用在Windows 8上正常運行,需滿足以下前提條件,涵蓋系統環境、依賴配置、編譯設置等關鍵環節: 一、系統環境基礎要求 Windows 8版本 必須是 Windows 8.1(核心支持),不支持早期Windows 8(需升級到8.1,微軟已停止對原版Windows 8的支持)。 確認系統版本:右…

Redis實現消息隊列三種方式

參考 Redis隊列詳解&#xff08;springboot實戰&#xff09;_redis 隊列-CSDN博客 前言 MQ消息隊列有很多種&#xff0c;比如RabbitMQ,RocketMQ,Kafka等&#xff0c;但是也可以基于redis來實現&#xff0c;可以降低系統的維護成本和實現復雜度&#xff0c;本篇介紹redis中實現…

【C++動態版本號生成方案:實現類似C# 1.0.* 的自動構建號】

C動態版本號生成方案&#xff1a;實現類似C# 1.0.* 的自動構建號 在C#中&#xff0c;1.0.*版本號格式會在編譯時自動生成構建號和修訂號。本文將介紹如何在C項目中實現類似功能&#xff0c;通過MSBuild自動化生成基于編譯時間的版本號。 實現原理 版本號構成&#xff1a;主版本…

【算法題】:斐波那契數列

用 JavaScript 實現一個 fibonacci 函數&#xff0c;滿足&#xff1a; 輸入 n&#xff08;從0開始計數&#xff09;輸出第 n 個斐波那契數&#xff08;斐波那契數列從 1 開始&#xff1a;1,1,2,3,5,8,13,21…&#xff09; 示例&#xff1a; fibonacci(0) > 1fibonacci(4) &g…

【YOLOv13[基礎]】熱力圖可視化實踐 | 腳本升級 | 優化可視化效果 | 論文必備 | GradCAMPlusPlus, GradCAM, XGradCAM, EigenCAM等

本文將進行添加YOLOv13版本的升級版熱力圖可視化功能的實踐,支持圖像熱力圖可視化、優化可視化效果、 可以選擇使用GradCAMPlusPlus, GradCAM, XGradCAM, EigenCAM, HiResCAM, LayerCAM, RandomCAM, EigenGradCAM。一個參數即可設置是否顯示檢測框等。 原圖 結果圖

ElasticSearch相關術語介紹

1.RESTful風格程序REST(英文全稱為:"Representational State Transfer")指的是一組架構約束條件和原則。它是一種軟件架構風格&#xff08;約束條件和原則的集合&#xff0c;但并不是標準&#xff09;。 REST通過資源的角度觀察網絡&#xff0c;以URI對網絡資源進行…

《從零構建大語言模型》學習筆記4,注意力機制1

《從零構建大語言模型》學習筆記4&#xff0c;自注意力機制1 文章目錄《從零構建大語言模型》學習筆記4&#xff0c;自注意力機制1前言一、實現一個簡單的無訓練權重的自注意力機制二、實現具有可訓練權重的自注意力機制1. 分步計算注意力權重2.實現自注意力Python類三、將單頭…

昇思+昇騰開發板+DeepSeek模型推理和性能優化

昇思昇騰開發板DeepSeek模型推理和性能優化 模型推理 流程&#xff1a; 權重加載 -> 啟動推理 -> 效果比較與調優 -> 性能測試 -> 性能優化 權重加載 如微調章節介紹&#xff0c;最終的模型包含兩部分&#xff1a;base model 和 LoRA adapter&#xff0c;其中base …

未給任務“Fody.WeavingTask”的必需參數“IntermediateDir”賦值。 WpfTreeView

c#專欄記錄&#xff1a; 報錯 未給任務“Fody.WeavingTask”的必需參數“IntermediateDir”賦值。 WpfTreeView 生成 解決辦法 清理和重新生成項目 完成上述配置后&#xff0c;嘗試執行以下步驟&#xff1a; 清理項目&#xff1a;刪除 bin 和 obj 文件夾。 重新生成項目&…

[Linux]學習筆記系列 -- [arm][lib]

文章目錄arch/arm/lib/delay.cregister_current_timer_delay 注冊當前定時器延遲read_current_timer 讀取當前定時器drivers/clocksource/timer-stm32.cstm32_clocksource_init STM32 平臺上初始化時鐘源https://github.com/wdfk-prog/linux-study arch/arm/lib/delay.c regis…

harbor倉庫搭建(配置https)

目錄 1. 環境準備 2. 配置https的原因 3. 生成ca證書 4. 搭建harbor倉庫 5. 訪問harbor 6. 修改加密算法 1. 環境準備 需要提前安裝docker和docker-compose&#xff0c;harbor倉庫版本越新&#xff0c;對應的docker和docker-compose版本越新。 主機IP192.168.48.19dock…

C++多線程服務器

C多線程服務器 因為自己同時在看多本書&#xff0c;之前看過《TCP/IP 網絡編程》一書&#xff0c;其中有一個自己編寫一個多線程服務器的例子&#xff0c;于是就把代碼直接抄了一變。 在學習網絡編程前需要先了解網絡的7層模型。 具體代碼如下&#xff1a; 服務器端&#xff1a…

【Pandas】常用數據處理技巧

一. 數據讀取 1.pd.to_csv & pd.read_csv 細節&#xff1a; 1.pd.read_csv 需要 ignore_index True or ,index_col0 否則會有列Unnamed0 2.pickle具有更快的讀取速度&#xff0c;與更小的體積。 讀取前N行&#xff08;若不需獲取所有數據&#xff09; pd.read_csv(…

Docker Compose 部署高可用 MongoDB 副本集集群(含 Keepalived + HAProxy 負載均衡)

Docker Compose 部署高可用 MongoDB 副本集集群&#xff08;含 Keepalived HAProxy 負載均衡&#xff09;背景與目標&#x1f4cb; 環境規劃**服務器信息****軟件版本**部署步驟1. 創建目錄結構2、生成 keyFile&#xff08;三臺機器內容必須一致&#xff09;3. 準備 Keepalive…

MySQL(189)如何分析MySQL的鎖等待問題?

分析MySQL的鎖等待問題有助于發現和解決數據庫性能瓶頸。鎖等待問題通常會導致數據庫響應時間變長&#xff0c;影響系統的整體性能。以下是詳細深入的方法和代碼示例&#xff0c;幫助你分析和解決MySQL的鎖等待問題。 一、鎖的類型和概念 在MySQL中&#xff0c;主要有以下幾種鎖…

26.Scikit-learn實戰:機器學習的工具箱

Scikit-learn實戰&#xff1a;機器學習的工具箱 &#x1f3af; 前言&#xff1a;機器學習界的"宜家家具" 還記得第一次逛宜家的感受嗎&#xff1f;琳瑯滿目的家具&#xff0c;每一件都有詳細的說明書&#xff0c;組裝簡單&#xff0c;樣式統一&#xff0c;關鍵是—…