自定義View的總結(jié)

一、自定義Viewhttps://blog.csdn.net/u014005316/article/details/54616393

1.自定義View的繪制流程

1.走構(gòu)造函數(shù)(對(duì)View進(jìn)行初始化)

2.onMeasure(測(cè)量View的大小)

3.onSizeChange(確定View的大小)

4.onLayout(確定子View的大?。ò覸iew的時(shí)候使用))

5.onDraw(實(shí)際繪制內(nèi)容)

6.如果視圖狀態(tài)改變(用戶操作或自身變化引起)進(jìn)行重繪 調(diào)用invalidate方法

二.自定義View的分類:

自定義ViewGroup

自定義ViewGroup一般是利用現(xiàn)有的組件根據(jù)特定的布局方式來(lái)組成新的組件,大多繼承自ViewGroup或各種Layout。

自定義View

在沒(méi)有現(xiàn)成的View,需要自己實(shí)現(xiàn)的時(shí)候,就使用自定義View,一般繼承自View,SurfaceView或其他的View。

三.細(xì)講View流程方法

1.構(gòu)造函數(shù)

構(gòu)造函數(shù)是View的入口,可以用于初始化一些的內(nèi)容,和獲取自定義屬性,View的構(gòu)造函數(shù)有四種重載

1.有三個(gè)參數(shù)的構(gòu)造函數(shù)中第三個(gè)參數(shù)是默認(rèn)的Style,這里的默認(rèn)的Style是指它在當(dāng)前Application或Activity所用的Theme中的默認(rèn)Style,且只有在明確調(diào)用的時(shí)候才會(huì)生效

2.有兩個(gè)個(gè)參數(shù)的構(gòu)造函數(shù)一般在layout文件中使用的時(shí)候會(huì)調(diào)用,關(guān)于它的所有屬性(包括自定義屬性)都會(huì)包含在attrs中傳遞進(jìn)來(lái)。

3.有一個(gè)參數(shù)的構(gòu)造函數(shù)中一般在直接New一個(gè)View的時(shí)候調(diào)用。

2.測(cè)量View的大?。╫nMeasure)

1.View的大小不僅由自身所決定,同時(shí)也會(huì)受到父控件的影響,為了我們的控件能更好的適應(yīng)各種情況,一般會(huì)自己進(jìn)行測(cè)量。

2.onMeasure 函數(shù)中有 widthMeasureSpec 和 heightMeasureSpec 這兩個(gè) int 類型的參數(shù), 毫無(wú)疑問(wèn)他們是和寬高相關(guān)的, 但它們其實(shí)不是寬和高, 而是由寬、高和各自方向上對(duì)應(yīng)的測(cè)量模式來(lái)合成的一個(gè)值

3.測(cè)量模式一共有三種, 被定義在 Android 中的 View 類的一個(gè)內(nèi)部類View.MeasureSpec中

1.UNSPECIFIED:默認(rèn)值,父控件沒(méi)有給子view任何限制,子View可以設(shè)置為任意大小,一般不會(huì)用到,使用場(chǎng)景是系統(tǒng)內(nèi)部

2.EXACTLY:表示父控件已經(jīng)確切的指定了子View的大小,一般設(shè)置為Match_Parent或50dp精確的值。

3.AT_MOST:表示子View具體大小沒(méi)有尺寸限制,但是存在上限,上限一般為父View大小,一般設(shè)置為warp_content。

4.注意: 用 MeasureSpec 的 getSize是獲取數(shù)值, getMode是獲取模式。如果對(duì)View的寬高進(jìn)行修改了,不要調(diào)用 super.onMeasure( widthMeasureSpec, heightMeasureSpec); 要調(diào)用 setMeasuredDimension( widthsize, heightsize); 這個(gè)函數(shù)。

3.onSizeChange:

1.在測(cè)量完View并使用setMeasuredDimension函數(shù)之后View的大小基本上已經(jīng)確定了,那么為什么還要再次確定View的大小呢?

這是因?yàn)閂iew的大小不僅由View本身控制,而且受父控件的影響,所以我們?cè)诖_定View大小的時(shí)候最好使用系統(tǒng)提供的onSizeChanged回調(diào)函數(shù)。

2.它又四個(gè)參數(shù),分別為 寬度,高度,上一次寬度,上一次高度。

這個(gè)函數(shù)比較簡(jiǎn)單,我們只需關(guān)注 寬度(w), 高度(h) 即可,這兩個(gè)參數(shù)就是View最終的大小。

4.onLayout:

1.確定布局的函數(shù)是onLayout,它用于確定子View的位置,在自定義ViewGroup中會(huì)用到,他調(diào)用的是子View的layout函數(shù)。

2.在自定義ViewGroup中,onLayout一般是循環(huán)取出子View,然后經(jīng)過(guò)計(jì)算得出各個(gè)子View位置的坐標(biāo)值,然后用以下函數(shù)設(shè)置子View位置。child.layout(l, t, r, b); l是 View左側(cè)距父View左側(cè)的距離。

5.onDraw:

1.invalidate在子線程進(jìn)行重繪

2.postinvalidate在主線程進(jìn)行重繪?

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容