自定義View注意事項

2021-10-03 06:00:15 字數 3502 閱讀 9680

既然是自定義view所以為了方便需要繼承view類,或者其他view類例如textview等類
之定義view必須寫入建構函式而且需要函式過載,並且加入super(contex)等樣式如下
我第一次做自定義view時就忘了使用super(context,attrs)這個方法,結果findviewbyid()找不到xml裡面的控制項

public

myview

(context context)

public

myview

(context context, attributeset attrs)

ondraw方法如下,使用postinvalidate()重新呼叫(ondraw)

@override

protected void ondraw(canvas canvas)

我理解ondraw的解釋:就是在這裡畫的意思。「在這裡畫」是乙個簡單的闡述:那麼「這裡」指的是**呢?用什麼來畫?怎麼畫才能不超過邊框限制?我能不能自己制定畫布尺寸?知道怎麼畫了一幅到底畫到螢幕**了呢?下面乙個乙個的解釋一下

1.「在這裡畫」的「這裡」指的是:x軸:從0到getmeasuredwidth()(獲取視窗寬度)結束。y軸:從0到getmeasuredheight()(獲取視窗的高度)結束

3、用什麼來畫:用畫筆畫到畫布上,其中畫筆是:paint 類。畫布:canvas類。畫布可以無限大,但是view是有限的。

2、怎麼畫才能顯示到邊框內:上面介紹了視窗和畫布的關係 ,其中視窗的尺寸是(上面已經介紹了):getmeasuredwidth()(獲取視窗寬度)和getmeasuredheight()(獲取視窗的高度),所以是乙個有限的大小(普通螢幕解析度1920*1080)。而畫布的大小我們可以隨意設定,型別還是folat,設定幾個億也不會報錯。所以如果乙個畫布尺寸和乙個view尺寸如果設定的不對則不能正確顯示。打個比喻,view就相當於望遠鏡,canvas就相當於景色,景色很大但是望遠鏡只能看到其中一點

3、我們能不能自己定製畫布尺寸:可以自定義畫布的尺寸,使用setmeasureddimension(寬,高)這個方法來設定畫布的尺,單純使用這個方法則不受父窗

控制,如果想讓自定義view達到理想的尺寸進行繪製則需要重寫onmeasure方法(下面介紹)

4、知道怎麼畫了一幅到底畫到螢幕**了:可以通過下面四個方法獲取

getleft()

;//視窗左邊到螢幕左邊的距離

getright()

;//視窗右邊到螢幕左邊的距離

getbottom()

;//視窗底邊到頂的距離

gettop()

;//視窗定編到螢幕頂的距離

onmeasure方法的作用:打個比方客戶需要種香蕉(xml設定) ,然後讓管家(父視窗)分給你(自定義view)一塊地去種香蕉,管家會先顧全大局分配了一塊地給你(這個就是onmeasure方法),如果你看了一下這塊地不夠你種,你不用商量可以直接給管家鬧翻,設定你需要的地方來種香蕉.

綜合上述:

1、xml設定的 android:layout_width="##dp" 和android:layout_height="##dp"會使用 protected void onmeasure(int widthmeasurespec, int heightmeasurespec)這個方法進行傳遞,其中widthmeasurespec和heightmeasurespec就是視窗的寬度和高度,但是,這個數值不能直接使用因為為了節省空間android把模式也壓縮到了這個整數裡面了,所以我們需要使用 int size=measurespec.getsize(measurespec))這個方法提取尺寸和int mode=measurespec.getmode(measurespec)這個方法提取父視窗給定的模式

2、這時候我們知道了模式和視窗的尺寸 只需要判斷這個尺寸夠不夠,如果夠我們用就是用父視窗傳來的尺寸進行設定 否則無視父視窗給的尺寸直接設定自己想要的尺寸。設定尺寸使用setmeasureddimension(measurespec.getsize(widthmeasurespec),measurespec.getsize(heightmeasurespec));//設定父視窗給的尺寸

這段**描述了onmeasure(),設定完視窗尺寸了就可以在ondraw

private

intgetmysize

(int defaultsize,

int measurespec)

return mysize;

}@override

protected

void

onmeasure

(int widthmeasurespec,

int heightmeasurespec)

else

setmeasureddimension

(width,heigth)

;}

canvas.drawpoint(200, 200, paint);//畫乙個點

canvas.drawline(200, 300, 600, 300, paint);//畫一條線

canvas.drawlines(new float,paint);//畫多條線

//畫矩形

這裡設定的填充,如果想畫空心的設定style為stroke

canvas.drawrect(100, 200, 300, 400, paint); //矩形第一種

rect rect = new rect(100, 200, 300, 400); //矩形第二種

canvas.drawrect(rect,paint);

//畫圓角矩形

canvas.drawroundrect(100, 200, 800, 600, 80, 80, paint);//第一種

rectf rectf = new rectf(100, 200, 800, 600); //第二種

canvas.drawroundrect(rectf, 80, 80, paint); //第二種

//畫橢圓

canvas.drawoval(100, 200, 900, 600, paint);//第一種

rectf rectf = new rectf(100, 200, 900, 600);//第二種

canvas.drawoval(rectf,paint);

//畫圓

canvas.drawcircle(500, 500, 250, paint);// 前兩個引數是圓心座標,第三個引數是半徑

Dynamics CRM 自定義報表注意事項

dynamics crm 4中提供了一些列標準的報表,但是缺少個性化。有個客戶需要定製乙個自己的 單報表,其中要包含自己的logo等自定義資訊。這就需要vs設計自定義報表。報表設計好並在vs中預覽正常,但是部署到crm中,開啟報表時卻出錯。總價設計報表時注意事項如下 1.vs中設計報表時,不要使用共...

Dynamics CRM 自定義報表注意事項

dynamics crm 4中提供了一些列標準的報表,但是缺少個性化。有個客戶需要定製乙個自己的 單報表,其中要包含自己的logo等自定義資訊。這就需要vs設計自定義報表。報表設計好並在vs中預覽正常,但是部署到crm中,開啟報表時卻出錯。總價設計報表時注意事項如下 1.vs中設計報表時,不要使用共...

自定義UIView控制項注意事項

ios的控制項基類是uiview,要自定義,需要重寫 id initwithframe cgrect frame 依照frame建立新的view,建立出來的view要通過addsubview加入到父view中。void drawrect cgrect rect 自畫,永遠不要直接呼叫drawrect...