自定義View(一)

<h4>一李剖、初探</h4>
<p>大家都知道自定義view需要重寫onMeasure和onDraw兩個方法囤耳,這里我們在講這兩個方法前首先看看什么時候走這兩個方法充择,這里只是大致講講方便理解,詳細(xì)的之后會說椎麦。</p>

image.png

看看我在生命周期中加的打印的結(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é)論:

image.png

<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>

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末衔肢,一起剝皮案震驚了整個濱河市豁翎,隨后出現(xiàn)的幾起案子心剥,更是在濱河造成了極大的恐慌,老刑警劉巖蝉揍,帶你破解...
    沈念sama閱讀 211,123評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件疑苫,死亡現(xiàn)場離奇詭異,居然都是意外死亡捍掺,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,031評論 2 384
  • 文/潘曉璐 我一進(jìn)店門挺勿,熙熙樓的掌柜王于貴愁眉苦臉地迎上來曲横,“玉大人,你說我怎么就攤上這事不瓶『碳担” “怎么了?”我有些...
    開封第一講書人閱讀 156,723評論 0 345
  • 文/不壞的土叔 我叫張陵蚊丐,是天一觀的道長熙参。 經(jīng)常有香客問我,道長麦备,這世上最難降的妖魔是什么孽椰? 我笑而不...
    開封第一講書人閱讀 56,357評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮黍匾,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘呛梆。我一直安慰自己锐涯,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 65,412評論 5 384
  • 文/花漫 我一把揭開白布填物。 她就那樣靜靜地躺著纹腌,像睡著了一般。 火紅的嫁衣襯著肌膚如雪融痛。 梳的紋絲不亂的頭發(fā)上壶笼,一...
    開封第一講書人閱讀 49,760評論 1 289
  • 那天,我揣著相機(jī)與錄音雁刷,去河邊找鬼。 笑死保礼,一個胖子當(dāng)著我的面吹牛沛励,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播炮障,決...
    沈念sama閱讀 38,904評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼目派,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了胁赢?” 一聲冷哼從身側(cè)響起企蹭,我...
    開封第一講書人閱讀 37,672評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后谅摄,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體徒河,經(jīng)...
    沈念sama閱讀 44,118評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,456評論 2 325
  • 正文 我和宋清朗相戀三年送漠,在試婚紗的時候發(fā)現(xiàn)自己被綠了顽照。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,599評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡闽寡,死狀恐怖代兵,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情爷狈,我是刑警寧澤植影,帶...
    沈念sama閱讀 34,264評論 4 328
  • 正文 年R本政府宣布,位于F島的核電站涎永,受9級特大地震影響何乎,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜土辩,卻給世界環(huán)境...
    茶點故事閱讀 39,857評論 3 312
  • 文/蒙蒙 一支救、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧拷淘,春花似錦各墨、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,731評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至结洼,卻和暖如春黎做,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背松忍。 一陣腳步聲響...
    開封第一講書人閱讀 31,956評論 1 264
  • 我被黑心中介騙來泰國打工蒸殿, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人鸣峭。 一個月前我還...
    沈念sama閱讀 46,286評論 2 360
  • 正文 我出身青樓宏所,卻偏偏與公主長得像,于是被迫代替她去往敵國和親摊溶。 傳聞我的和親對象是個殘疾皇子爬骤,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,465評論 2 348

推薦閱讀更多精彩內(nèi)容