既然是自定義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...