自定義控制項

2021-08-14 17:55:47 字數 1881 閱讀 8879

自定義控制項

自定義控制項一般繼承自view類。

對控制項自身來說比較重要的兩個方法是ondraw()方法和onmeasure()方法。

onmeasure()

該方法在view類中有預設實現。

重寫onmeasure()方法,該方法有兩個入參

@override

protected void onmeasure(int widthmeasurespec, int heightmeasurespec)

其中widthmeasurespec和heightmeasurespec分別是32位整數,高2位代表specmode(測量模式),低30位表示sizewidth(寬)或sizeheight(高)。

這兩個引數由父viewgroup和自身的layoutparamas屬性共同決定。

specmode有三種情況,分別是 exactaly(有確定的值) , at_most(最大不能超過某個值) , unsuspecified(未指定)。

以上討論的只是父viewgroup建議我們view的寬高,具體指定寬高還是在於我們自己。通過呼叫setmeasureddimension()來告訴父容器本控制項的實際寬高。該方法接收兩個引數,分別是寬和高。

在view的onmeasure()方法預設實現中,並沒有對at_most模式做特殊處理,也就是說預設情況下,當我們在xml使用該自定義控制項時,若寬高都設定wrap_content,則該view的寬高會充滿父容器。因此我們對這種情況稍作處理:

@override

protected void onmeasure(int widthmeasurespec, int heightmeasurespec)

switch (heightmode)

break;

}base_int = width/10;

setmeasureddimension(width,height);

}

ondraw()

該方法用於繪製,在某些情況下,可能會快速重複呼叫,因此避免在該方法中建立物件是乙個明智的選擇。

ondraw()方法有乙個引數canvas,代表畫布。若要繪製圖形,則需要paint類物件與畫布來共同完成。

可擴充套件性

若要提高乙個自定義view的擴充套件性,有如下辦法。以設定背景顏色為例。可以將顏色作為xml中的引數傳入view中,再由ondraw()方法繪製成背景。

具體的操作如下:

1.在values目錄下建立乙個自定義的xml檔案,並通過name關聯到自定義view。在attr標籤中設定想要擴充套件的屬性,並給出其標準,例如是顏色,字型,大小等。

2.在view中重寫構造方法,並用context獲取typedarray,然後從typearray中獲取在xml中設定的屬性

public chartview(context context) 

public chartview(context context, @nullable attributeset attrs)

public chartview(context context, @nullable attributeset attrs, int defstyleattr)

public chartview(context context, @nullable attributeset attrs, int defstyleattr, int defstyleres)

3.在xml中宣告對應的屬性,在宣告之前記得在該檔案中加入
xmlns:=""

自定義控制項 自定義鐘錶

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