深度剖析Android中的LayoutParams

一、layoutParams方法

在Android中,LayoutParams是一個重要的類,通常由ViewGroup的子類使用。LayoutParams是一個子類,它定義了子View在布局文件中的尺寸、位置和邊距等信息。一般而言,我們在使用Layout時,必須對特定的View創建一個LayoutParams實例,並將其附加到父布局中。

Layout中常見的LayoutParams分別如下:

LayoutParams
   |- LinearLayout.LayoutParams
   |- RelativeLayout.LayoutParams
   |- FrameLayout.LayoutParams
   |- ...

這些LayoutParams子類都擁有多個構造函數,以滿足不同的需求,其具體使用方式可以查閱官網文檔。

二、layoutParams類型2006

LayoutParams中的type屬性可以指定八種類型之一,默認為0,type屬性的不同值代表不同的布局效果。

LayoutParams.TYPE_SYSTEM_ALERT代表這是一個全局系統級彈窗的LayoutParams,只有在TYPE_TOAST之前才可以使用。它需要權限 android.permission.SYSTEM_ALERT_WINDOW,不然在調用layParams的時候會拋java.lang.SecurityException異常。

三、layoutParams參數

LayoutParams中的參數除了上述的type屬性以外,還有其他常見的參數。

1、width和height代表View的寬和高,可以設為以下值:

    WRAP_CONTENT 長和寬為內容的大小, 即根據應用實際內容計算得出
    MATCH_PARENT 長和寬充滿父控件
    固定值 長和寬為固定的數值

2、gravity表示子視圖與父視圖之間的在x、y軸上的對齊方式,如:center|center_vertical

3、weight屬性是LinearLayout的重點,它指定了子視圖所佔用的空間比重,一般設為1,當調整布局時,子視圖按照權重平分剩餘空間。

四、layoutParams.flag

LayoutParam中的flag是一個位運算標記,可以設置LayoutParams的樣式、行為和標誌。該標誌只能由LayoutParams的創建者使用,程序員不能直接設置。當然,使用父View里的addView()函數創建LayoutParams對象,也會自動創建一個默認的LayoutParam對象。

一些常見的標誌有:

    FLAG_FORCE_LAYOUT       強制父視圖調用requestLayout()函數
    FLAG_LAYOUT_IN_SCREEN   子控制在屏幕上佔據空間的時候使子控制在屏幕上對齊父控件
    FLAG_LAYOUT_NO_LIMITS   子控制不會限制在視圖容器之內的布局屬性

五、layoutParams.type

在LayoutParams中,type即為layoutParams.type,可以指定當前LayoutParams的類型,在不同類型下會表現出不同的布局效果。

幾個常見的布局類型有:

    ABSOLUTE       指定控件的絕對位置, 忽略左右高低的繪製規則
    FILL_PARENT   當前控件充滿父控件
    MATCH_PARENT  當前控件內容和容器(父控件)內容一樣大小
    WRAP_CONTENT  根據內容自適應控件大小

六、layoutParams flags

LayoutParams中的flags屬性,用於定義LayoutParams的表現。flags屬性是一個int類型的標誌,可以組合使用,表示LayoutParams的效果。

常見的屬性有:

    LAYOUT_FLAG_NO_BACKGROUND  不要繪製ViewGroup的背景
    LAYOUT_FLAG_CLIP_TO_PADDING  在ViewGroup中顯示視窗內的內容而不是全部,通俗地說,就是在繪製背景時是否經過padding
    LAYOUT_FLAG_CLIP_CHILDREN   標記是否對子視圖進行修剪和是否避免在子視圖之外進行繪畫

七、layoutParams overlay

LayoutParams中的overlay是一個布爾值,用於指定窗口的overlay屬性。如果為true,則表示該view是在其他的視圖之上進行渲染;否則,該視圖在所有其他非覆蓋視圖後面進行渲染。

八、layoutParams match_parent

一般在父控件中間,我們會讓一個子視圖填滿父控件,這時我們就需要使用match_parent屬性。該屬性需要在子視圖LayoutParam的width或height使用,如果都使用會覆蓋寬和高的尺寸,比如:



    

九、layoutParams設置margin單位

LayoutParam中的margin是為了讓視圖之間產生間隔,由於視圖之間的間隔有時需要按像素值控制,因此需要LayoutParam支持按像素值設置margin。

在LayoutParam繼承類(如FrameLayout.LayoutParams)中,同時支持按比例設置margin和按像素數值設置margin。

    LayoutParams lp = new FrameLayout.LayoutParams(
            ViewGroup.LayoutParams.WRAP_CONTENT,
            ViewGroup.LayoutParams.WRAP_CONTENT);

    int margin = 20;//20px
    lp.setMargins(margin, margin, margin, margin);
    view.setLayoutParams(lp);

十、LayoutParams type=2002、2003

LayoutParams中的Type分為八種,這其中有兩種是能被我們使用的,分別為Type 2002和Type 2003。他們分別是MATCH_CONSTRAINT和MATCH_CONSTRAINT_SPREAD,是約束布局中使用的,是ConstraintLayout的布局。

Type 2002 即為MATCH_CONSTRAINT,與Match、Fixed、Wrap三個屬性類似,同時又不同於他們。Type 2003,即MATCH_CONSTRAINT_SPREAD,與Type 2002類似,但是同時地,它又能夠擴展,即在一定程度上,該屬性能夠與其他控件進行融合。

基本的使用方式會根據不同的控件,有些細節會略有不同,如果需要請引用官方文檔進行更詳細地學習。

十一、結語

本文對Android中LayoutParams進行了詳細的剖析,包括類型、參數、flag、overlay、match_parent,margin單位、以及MATCH_CONSTRAINT和MATCH_CONSTRAINT_SPREAD。LayoutParams是布局的基礎知識之一,在掌握LayoutParams後,能夠讓我們更加靈活地應對開發過程中的布局問題。

原創文章,作者:HTXU,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/147927.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
HTXU的頭像HTXU
上一篇 2024-11-02 13:16
下一篇 2024-11-02 13:16

相關推薦

  • 深度查詢宴會的文化起源

    深度查詢宴會,是指通過對一種文化或主題的深度挖掘和探究,為參與者提供一次全方位的、深度體驗式的文化品嘗和交流活動。本文將從多個方面探討深度查詢宴會的文化起源。 一、宴會文化的起源 …

    編程 2025-04-29
  • Python下載深度解析

    Python作為一種強大的編程語言,在各種應用場景中都得到了廣泛的應用。Python的安裝和下載是使用Python的第一步,對這個過程的深入了解和掌握能夠為使用Python提供更加…

    編程 2025-04-28
  • Android ViewPager和ScrollView滑動衝突問題

    Android開發中,ViewPager和ScrollView是兩個常用的控件。但是當它們同時使用時,可能會發生滑動衝突的問題。本文將從多個方面介紹解決Android ViewPa…

    編程 2025-04-28
  • Android如何點擊其他區域收起軟鍵盤

    在Android應用中,當輸入框獲取焦點彈出軟鍵盤後,我們希望能夠點擊其他區域使軟鍵盤消失,以提升用戶體驗。本篇文章將說明如何實現這一功能。 一、獲取焦點並顯示軟鍵盤 在Andro…

    編程 2025-04-28
  • Python遞歸深度用法介紹

    Python中的遞歸函數是一個函數調用自身的過程。在進行遞歸調用時,程序需要為每個函數調用開闢一定的內存空間,這就是遞歸深度的概念。本文將從多個方面對Python遞歸深度進行詳細闡…

    編程 2025-04-27
  • Android Studio HUD 實現指南

    本文將會以實例來詳細闡述如何在 Android Studio 中使用 HUD 功能實現菊花等待指示器的效果。 一、引入依賴庫 首先,我們需要在 build.gradle 文件中引入…

    編程 2025-04-27
  • Spring Boot本地類和Jar包類加載順序深度剖析

    本文將從多個方面對Spring Boot本地類和Jar包類加載順序做詳細的闡述,並給出相應的代碼示例。 一、類加載機制概述 在介紹Spring Boot本地類和Jar包類加載順序之…

    編程 2025-04-27
  • Android和Vue3混合開發方案

    本文將介紹如何將Android和Vue3結合起來進行混合開發,以及其中的優勢和注意事項。 一、環境搭建 在進行混合開發之前,需要搭建好相應的開發環境。首先需要安裝 Android …

    編程 2025-04-27
  • Android Java Utils 可以如何提高你的開發效率

    Android Java Utils 是一款提供了一系列方便實用的工具類的 Java 庫,可以幫助開發者更加高效地進行 Android 開發,提高開發效率。本文將從以下幾個方面對 …

    編程 2025-04-27
  • 深度解析Unity InjectFix

    Unity InjectFix是一個非常強大的工具,可以用於在Unity中修復各種類型的程序中的問題。 一、安裝和使用Unity InjectFix 您可以通過Unity Asse…

    編程 2025-04-27

發表回復

登錄後才能評論