View的事件分發(fā)機(jī)制在上一篇文章中我簡(jiǎn)單的梳理了一下View的觸摸事件分發(fā),有興趣的可以看看,幫老弟我看看有啥不足之處,留言我改,共同進(jìn)步。
即使不看那篇文章相信大家也都知道View主要包含View和ViewGroup(當(dāng)然,其實(shí)ViewGroup也是View的一種)。
在日常開(kāi)發(fā)中很多時(shí)候我們僅僅依靠系統(tǒng)自帶的控件是無(wú)法達(dá)到設(shè)計(jì)師的要求的,這個(gè)時(shí)候我們通常都需要用到自定義控件。自定義控件一般有兩種來(lái)源:一種是CV一把梭,這種方式一般很簡(jiǎn)單,但是有時(shí)候與你想要效果會(huì)有一些小小的差別;另一種方式就是自己手寫(xiě),而寫(xiě)自定義控件的基礎(chǔ)要求就是要了解View的繪制流程。
View的繪制流程主要包含以下三個(gè)方法:
- onMeasure(測(cè)量)
- onLayout(布局)
-
onDraw(繪制)
下面我們一一道來(lái):
onMeasure(int widthMeasureSpec, int heightMeasureSpec)
這個(gè)方法主要用來(lái)測(cè)量該布局的大小,可以看到該方法包含兩個(gè)參數(shù),看上去差不多,只不過(guò)一個(gè)關(guān)于寬,一個(gè)關(guān)于高。
那么MeasureSpec是個(gè)什么東西呢?這是一種通過(guò)int類型的數(shù)字封裝兩個(gè)參數(shù)的設(shè)計(jì),大概就類似我們平時(shí)把兩個(gè)數(shù)據(jù)“A”、“B”融合到一個(gè)字符串中“A,B”,然后接受者收到后再進(jìn)行分割解析。
只不過(guò)比我們這種方式更加優(yōu)雅,MeasureSpec是一個(gè)32位的int值,最高位表示測(cè)量模式,后31位表示測(cè)量的大小。
首先測(cè)量模式分為三種:
UNSPECIFIED:不限制大小,這種情況比較少見(jiàn)。
EXACTLY:精確的數(shù)值,對(duì)應(yīng)了寬高中的具體值和math_parent。
AT_MOST:不能超過(guò)父級(jí)的大小。
而View的測(cè)量模式主要通過(guò)父級(jí)的測(cè)量模式、父級(jí)的測(cè)量大小、以及本身所設(shè)置的寬高。

測(cè)量是從小到大,先測(cè)量子元素,再測(cè)量本身元素。
onLayout(boolean changed, int left, int top, int right, int bottom)
此方法主要用來(lái)確認(rèn)本布局中中子元素的位置,類似的一個(gè)方法layout則用來(lái)確認(rèn)自己在父元素的位置,然后layout-->onLayout-->子layout-->子onLayout無(wú)窮盡也。
布局是從大到小,先布局本身元素,再布局子元素。
onDraw(Canvas canvas)
繪制先繪制背景,再繪制自己,再繪制子元素。
就像畫(huà)畫(huà)一樣,先畫(huà)上,再畫(huà)山上的花花草草。
結(jié)束語(yǔ)
學(xué)無(wú)止境,共勉之。
參考資料
- 普通View的MeasureSpec的創(chuàng)建規(guī)則
- 任玉剛 Android開(kāi)發(fā)藝術(shù)探索