View的繪制流程

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è)置的寬高。

普通View的MeasureSpec的創(chuàng)建規(guī)則

測(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ú)止境,共勉之。

參考資料

?著作權(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)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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

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