自定義控制項

2021-09-06 11:05:57 字數 3648 閱讀 4852

自定義控制項中呼叫順序為 onmeasure()->onlayout()->ondraw()

需要呼叫全部構造方法

1.onmeasure(int widthmeasurespec, int heightmeasurespec)

(1)這個方法的作用是確定父控制項與動態新增的子控制項寬與高。

(2)重寫此方法需必須加上setmeasureddimension(parentwidthpx, parentheightpx);即父控制項的寬高(pix值)

(3)其它方法:childview.measure(childwidth, childheight);  繪製子控制項的寬高。 

(4)這裡面有乙個重要的類:measurespec。其中重要的屬性與方法有:

measurespec封裝了父布局傳遞給子布局的布局要求,每個measurespec代表了一組寬度和高度的要求。乙個measurespec由大小和模式組成。

它有三種模式:(mode)

unspecified(未指定),  父元素不對自元素施加任何束縛,子元素可以得到任意想要的大小;

exactly(完全),父元素決定自元素的確切大小,子元素將被限定在給定的邊界裡而忽略它本身大小;//固定大小,與fill_parent

at_most(至多),子元素至多達到指定大小的值。    //wrap_parent

它常用的三個函式:

1.static int getmode(int measurespec):根據提供的測量值(格式)提取模式(上述三個模式之一)

2.static int getsize(int measurespec):根據提供的測量值(格式)提取大小值(這個大小也就是我們通常所說的大小)//pix

3.static int makemeasurespec(int size,int mode):根據提供的大小值和模式建立乙個測量值(格式)

,方法體如下:  //因為measure(width

, height) 中引數就是這個返回值

public

static

int makemeasurespec(int size, int mode)

2. onlayout()

(1)這個方法的作用是控制控制項的確切位置,即其中子控制項放到父控制項中哪個具體位置,其中就乙個重要方法:

childview.layout(left, top, right, bottom);  相對于父控制項左上右下的具體px點

(2)還有乙個方法  view.getmeasurewidth() view.getmeasureheight()  這兩個是得到控制項的實際大小,需要在view.measure()方法後才會有值

3. ondraw()

下面是乙個自定義linearlayout,主要作用為動態新增控制項,支援自動換行

@see 

code:

/*** 自定義linearlayout

* 主要作用 支援自動換行

*/public class customlayout extends viewgroup

public customlayout(context context, attributeset attrs)

public customlayout(context context, attributeset attrs, int defstyle)

/*** 設定需要新增的子控制項的 寬、高 此處設定的寬高為最大值 具體顯示的值需要看下面方法中mode設定

** @param childwidth measurespec.makemeasurespec(size, mode) 中的size值

* @see mode)

*/public void setchild(int childwidth, int childheight)

/*** 控制子控制項的換行

* 引數中 relative to parent 是此linearlayout相對於它的父控制項,即此linearlayout 的上乙個控制項

** @param changed   this is a new size or position for this view

* @param leftpos   left position, relative to parent

* @param toppos    top position, relative to parent

* @param rightpos  right position, relative to parent

* @param bottompos bottom position, relative to parent

*/@override

protected void onlayout(boolean changed, int leftpos, int toppos, int rightpos, int bottompos)

int curleft = 0;     //當前 距離此控制項 的左座標   , 當換行是需要清零

int curtop = 0;      //當前 距離此控制項 的 上座標  , 換行不需要清零

int curcolpos = 0;   //當前 繪製的第幾列,用來控制換行的

int count = getchildcount();

for (int i = 0; i < count; i++) else }}

/*** 計算控制項及子控制項所佔區域

** @param widthmeasurespec  size與mode 相加, 這個控制項 size 為 px值  mode  measurespec.at_most|exactly,wrap_parent|fill_parent or 具體值

* @param heightmeasurespec

*/@override

protected void onmeasure(int widthmeasurespec, int heightmeasurespec)

// 設定父容器控制項所佔區域大小

int parentwidthpx = measurespec.getsize(widthmeasurespec);

columns = parentwidthpx / childwidth;  //列數

int linecounts = 0;     //總共行數,用來計算整個linearlayout的高度

if (columns != 0)

}int parentheightpx = (linecounts * (childheight + switchdiptopix(10)));   //行間距 10dip

//重寫onmeasure方法 必須加上 setmeasureddimension()這個方法來設定這個控制項最終的寬高!

setmeasureddimension(parentwidthpx, parentheightpx);

// 不需要呼叫父類的方法

// super.onmeasure(widthmeasurespec, heightmeasurespec);

}//    /**

//     * 為控制項新增邊框

//     */

//    @override

//    protected void dispatchdraw(canvas canvas)

}

自定義控制項 自定義鐘錶

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 上面這些...

自定義控制項

新聞管理 using system using system.collections.generic using system.linq using system.web using system.web.ui using system.web.ui.webcontrols namespace ne...