ViewGroup 自定義控制項

2021-08-10 13:52:54 字數 1642 閱讀 3942

自定義viewgroup這篇文章是針對自定義layoutmanager來寫的,提取出相關自定義的相同點。所有的自定義都可以歸結為在父控制項裡面放置子控制項。

一、繼承類:viewgroup

繼承之後需要實現構造,由於一般是在xml中引入所有需要實現以下構造

viewgroup(context context, attributeset attrs)

二、需要實現generatelayoutparams

這一步和layoutmanager的自定義是相似的,只是說layoutmanager只需要傳入預設的引數布局即可,針對普通的自定義也可以不重寫這個方法。

1、 這個方法主要是為該自定義的viewgrounp提供乙個布局引數params,通常有三個方法,一般最好是全部實現,不然都可能出現params轉換出錯的問題

2、需要自定義乙個layoutparams繼承marginlayoutparams

三個方法:

generatelayoutparams(attrs: attributeset?)

generatedefaultlayoutparams()

generatelayoutparams(p: layoutparams?)

三、onmeasure

主要是用於測量父view和子view

viewgroup的麻煩之處是需要考慮布局的特性,這個布局是自適應還是固定的,當是自適應時則需要測量每個子view,從而確定父view的寬高。固定時則不用考慮。同時可以在這裡確認子view的一些基本引數。比如說平分父view時子view的大小尺寸。而layoutmanager依託於recyclerview,則不需要考慮這些。

重要方法

measurespec.getmode 獲取寬、高的布局模式

measurespec.getsize 獲取view的寬和高,一般情況下而言都是螢幕寬高,所以才需要手動測量子view設定布局寬高

getchildat 獲取子view

measurechildwithmargins測量去除margin之後的子view占用的。這裡容易出現類轉換出錯的問題,現在的解決方式是,自己定義的layoutparams繼承marginlayoutparams,不過也可以直接使用measurechild,但是有文章說這樣便解決不了子view的margin的問題,這裡為了保持和自定義layoutmanager一致,直接採用measurechildwithmargins方法。

setmeasureddimension:設定經過測量之後的寬高。

四、onlayout

主要是用於放置子view

關鍵方法

1、getchildat獲取子view

2、getlayoutparams獲取布局引數,確定view的上下左右點

3、layout(l,t,r,b)用於放置子view

總結:

其實layoutmanager和viewgroup的自定義差不多都是一致的,只是viewgroup多了測量的這乙個過程。layoutmanager多了view**的這些步驟

自定義ViewGroup(一)

1 概述 viewgroup是乙個view的容器,他可以給出childview的測量模式和測量其寬高,他的作用非常重要。childview測量模式 exactly 表示設定了精確的值,一般當childview設定其寬 高為精確值 match parent時,viewgroup會將其設定為exactl...

自定義ViewGroup 回顧

自定viewgroup要比自定義view要複雜一點,因為自定義viewgroup不僅測量自身還要測量子元素和及重寫onlayout 來一次排列子view。下面這篇文章是關於自定義viewgroup的一些基本知識,這些主要內容來自 android開發藝術探索 在文章最後又這本書的網上版本。viewgr...

自定義ViewGroup及其屬性

閒來無事自定義個viewgroup的控制項來練練手。比如說現在有這麼個需求,一左一右分別有個textview,然後外面乙個控制項直接包裹這兩個 1 現在給這個自定義控制項 本文中名叫rclinearlayout 自定義乙個屬性,然後去通過這個屬性去確定這兩個textview是否需要處於同一水平線上。...