<h4>一李剖、初探</h4>
<p>大家都知道自定義view需要重寫onMeasure和onDraw兩個方法囤耳,這里我們在講這兩個方法前首先看看什么時候走這兩個方法充择,這里只是大致講講方便理解,詳細(xì)的之后會說椎麦。</p>
看看我在生命周期中加的打印的結(jié)果观挎,我們發(fā)現(xiàn)onMeasure和onDraw在activity生命周期先走之后在去走段化,并且onMeasure方法調(diào)用了4次显熏,為什么會這樣呢晒屎,這屬于深入的內(nèi)容,以后再講蕴轨,先記住View的測量和繪制在組件的生命周期之后就行坐桩。
</br>
<h4>二封锉、onMeasure和onDraw</h4>
這里簡單講講這兩個方法的用法,先不去探究源碼碾局。
<h6>1奴艾、onMeasure</h6>
<p>onMeasure發(fā)生在onDraw前,測量的意思像啼,我這里先不說很詳細(xì)潭苞,網(wǎng)上有些文章說一大堆此疹,什么測量父布局傳遞的寬高什么的,一開始就講這些給初學(xué)者我覺得很繞蝗碎,先會用蹦骑,在去理解比較好。</p>
<p>(1)先看看onMeasure中傳遞的兩個參數(shù)眠菇,先記住他們不是寬高。
widthMeasureSpec = 模式+寬放闺;heightMeasureSpec = 模式+高
要獲取到寬高需要這樣寫:</p>
<pre>
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
// Log.v("yet","onMeasure");
int heighMode = MeasureSpec.getMode(heightMeasureSpec);
int heigh = MeasureSpec.getSize(heightMeasureSpec);
int widthMode = MeasureSpec.getMode(widthMeasureSpec);
int width = MeasureSpec.getSize(widthMeasureSpec);
setMeasuredDimension(width,heigh);
}
</pre>
這樣就是最簡單的怖侦,就是說你告訴系統(tǒng),你要畫出的這個view的寬高搬葬,直接為你xml中所寫的寬高艳悔。
</br>
<p>(2)模式
上邊說了一個屬性猜年,那么它有什么作用呢?在這里我們加一段switch的代碼床三,然后去改布局的寬杨幼,看看能打印出什么結(jié)果。</p>
<pre>
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
// Log.v("yet","onMeasure");
int heighMode = MeasureSpec.getMode(heightMeasureSpec);
int heigh = MeasureSpec.getSize(heightMeasureSpec);
int widthMode = MeasureSpec.getMode(widthMeasureSpec);
int width = MeasureSpec.getSize(widthMeasureSpec);
switch (widthMode) {
case MeasureSpec.UNSPECIFIED: {
Log.v("yet","UNSPECIFIED");
break;
}
case MeasureSpec.AT_MOST: {
Log.v("yet","AT_MOST");
break;
}
case MeasureSpec.EXACTLY: {
Log.v("yet","EXACTLY");
break;
}
}
setMeasuredDimension(width,heigh);
}
</pre>
結(jié)果:
<ul>
<li>當(dāng)布局是match_parent時四瘫,打印EXACTLY</li>
<li>當(dāng)布局是固定尺寸(例如100dp)時找蜜,打印EXACTLY</li>
<li>當(dāng)布局是wrap_content時暖夭,打印AT_MOST</li>
</ul>
讓我們來看看結(jié)論:
<h6>其實讀這張表的時候可能剛開始會覺得有點懵逼迈着,不過不要緊,你先記住哪種情況對應(yīng)哪種模式咬清,之后熟練了,就理解這個表所說的含義了旧烧。</h6>
<h6>2掘剪、onDraw</h6>
onDraw就是繪制該View,其實這個的知識很多廉赔,這篇不詳細(xì)去講匾鸥,也感覺說不完,別人自定義中畫得好的那種都是幾百行代碼馏艾。但是雖然內(nèi)容多奴愉,但是套路都一樣,都是弄個畫筆迫吐,然后設(shè)置畫筆账忘,最后繪畫鳖擒。
(1)創(chuàng)建畫筆
Paint p = new Paint();
(2)設(shè)置畫筆
設(shè)置顏色什么之類的烫止,假如paint.setColor(Color.GREEN)將畫筆顏色設(shè)置成綠色,當(dāng)然是選擇原諒她期升。
(3)畫圖
畫圖的方法也很多互躬,畫圓畫方之類的,這些方法在網(wǎng)上也很容易找到容为,用起來也簡單,比如畫圓canvas.drawCircle(centerX, centerY, r, paint)替劈。反正每個畫圖一般基本都是:畫布.畫什么(...得滤,畫筆)懂更,都是套路。
</br>
<h6>很多朋友第一次接觸或者接觸不多會覺得自定義View很難坛猪,這兩個方法里面寫什么看不懂皂股,其實不難,認(rèn)真看自己動手去做你就會發(fā)現(xiàn)自定義View不難就斤,對我來說蘑辑,我反而覺得比較難的是什么時候系統(tǒng)會調(diào)用什么方法和一些條件下的重繪之類的。</h6>
</br>
<h6>總結(jié):這篇主要簡單的講了什么時候走onMeasure和onDraw方法和這兩個方法的簡單用法绷旗。</h6>