自定義控制項 OnMeasure 方法分析

2021-07-11 04:31:39 字數 1158 閱讀 1000

自定義view的第一步就是要測量measure控制項的大小,所以了解onmeasure至關重要

protected

void

onmeasure(int widthmeasurespec, int heightmeasurespec)

measurespec是幫助我們測量view的,measurespec是乙個32位的int值,其中高2位表示測量模式,後30位表示測量的大小。

測量模式值得一說,搞不清楚的話,很難寫好onmeasure()方法,測量模式分為三種:

exactly:精確模式,將控制項的高或者寬設定為match_parent或者具體的數值(如100dp)時,系統採用exactly

at_most,指定為wrap_content時,系統採用at_most,控制項隨著子控制項的內容變化而變化,指的是控制項不超過父控制項允許的最大尺寸即可

unspecified:系統的測量模式,我們不需要了解,自定義控制項也用不到這個

如果你不重寫onmeasure()方法,你寫的自定義控制項只是支援exactly模式,即只能用具體的數值(如100dp)或者match_parent,是不支援使用wrap_content的(如果你使用了wrap_content的話,效果與match_parent是一樣的),如何讓你寫的控制項支援wrap_content呢,重寫onmeasure()即可,以下**為模板**:

//    以下為模板**,如果不重寫onmeasure方法,無法使用wrap_content這個屬性,系統不知道該預設什麼尺寸,

// 就會預設填充整個父布局

@override

protected

void

onmeasure(int widthmeasurespec, int heightmeasurespec)

private

intmeasurewidth(int widthmeasurespec) else

}return result;

}private

intmeasureheight(int heightmeasurespec) else

}return result;

}

自定義View之onMeasure 方法

乙個view從建立到被繪製到螢幕上,需要完成measure 測量 layout 布置 draw 繪製 三個步驟,分別對應view中的measure layout draw 三個方法。網上關於這三個方法的原始碼解析文章有很多,而且一般情況下也不會去重寫它們 measure 方法還無法覆蓋 因此本文不打...

自定義控制項 自定義鐘錶

private context mcontext 畫筆 private paint mpaint 控制項的寬 private int mwidth x方向的圓心座標 private int center 鐘錶的半徑 private int mradio 圓環的寬 private int stroke...

自定義控制項

首先是以下這幾項,attribute defaultproperty指定元件的預設屬性,toolboxdata指定當從ide工具中的 工具箱中拖動自定義控制項時為它生成的預設標記 defaultproperty text toolboxdata mycontrol runat server 上面這些...