View的測量與繪製

2021-08-20 15:15:14 字數 2416 閱讀 1175

通過measurespec這乙個類, 就可以獲取view的測量模式和view想要繪製的大小。 measurespec類, 是乙個32位的int值,前兩位為測量的模式,測量的模式有三種(exactly, at_most, unspecified)

view類預設的測量view方式為onmeasure() 且只支援exactly 模式, 所以如果在自定義控制項的時候不重寫onmeasure()方法的話, 就只能使用exactal 模式。控制項可以響應你指定的具體高度值或者是match_parent 屬性。而如果要讓自定義view 支援wrap_content 屬性,那麼必須重寫onmeasure() 來指定wrap_content時的大小。

通過measurespec類可以獲得view的測量模式與和view想測量的大小, 有了這些資訊我們就可以控制view最後顯示的大小。

public class teachingview extends view 

public teachingview(context context, attributeset attrs)

public teachingview(context context, attributeset attrs,

int defstyleattr)

@override

protected void onmeasure(int widthmeasurespec, int heightmeasurespec)

//呼叫自動定義的measurewidth() 和 measureheight() 對寬高進行重寫定義。

當測量好了乙個view 之後, 就可以簡單地重寫ondraw() 方法,並在canvas物件上來繪製所需要的圖形。 2d繪圖api 必須使用到 canvas 物件, 使用paint 就可以在物件上做畫了。通常需要通過繼承view 並重寫它的ondraw() 方法來繪圖。

@override

protected void ondraw(canvas canvas)

完成view的測量後, 重寫ondraw() 方法,此方法中的引數即為canvas, 並在canvas物件上繪製影象 canvas物件時2d繪圖必須使用到的api。在ondraw()中使用這個物件就可以進行繪圖, 但在其他地方, 通常需要使用**建立乙個canvas物件:

canvas canvas = new canvas(bitmap);
這個過程叫做裝載畫布, 這個bitmap用來儲存所有繪製在canvas上的畫素資訊。當通過這種方式建立了canvas物件後, 後面所有的canvas.draw***x方法都發生在這個bitmap上。如果在view類的ondraw() 方法中通過下面的**,可以了解到canvas 和 bitmap直接的關係。 首先在ondraw() 方法繪製兩個bitmap

canvas.drawbitmap(bitmap1, 0, 0, null);

canvas.drawbitmap(bitmap2, 0, 0, null);

對於bitmap2 將它裝載到另乙個物件中:

canvas mcanvas = new canvas(bitmap2);
那麼在mcanvas上繪製view時:

mcanvas.draw***
通過mcanvas將繪製的效果作用在了bitmap2上, 這是因為bitmap2承載了在mcanvas上進行的繪圖操作,沒有將圖形直接繪製在ondraw() 方法指定的畫布上, 而是通過改變bitmap, 使得view 進行的重繪, 從而顯示改變之後的bitmap。通過改變bitmap,然後讓view重繪, 從而顯示改變後的bitmap 雖然使用了canvas 的繪圖api, 但其實並沒有將圖形直接繪製在ondraw() 方法指定的那塊畫布上。

View 的繪製流程

view的measure 過程由其measure方法完成,measure 方法是乙個final型別的方法,子類不能重寫。在view的mesure方法中會呼叫onmeasure 我們只看onmeasure方法就可了。view原始碼 protected void onmeasure int widthm...

View的繪製機制

view樹的繪製流程,其實就是乙個遞迴的過程 過程 measure layout draw 對所有子元素進行測量,測量過程從父viewgroup傳到view中,測量好了所有的子元素之後,進行遞迴,反覆之後,就完成了父元素viewgroup的測量。layout相類似 遍歷過程 根據父容器對子容器的一些...

Android文字測量與繪製Tips

1 在用canvas繪製文字時需要測量文字的繪製範圍,比如字型的高度 寬度,常用的方法是使用paint.gettextbound string text,int start,int end,rect rect 然後通過傳入的rect返回長寬,不過這個測量的寬度有些誤差,導致計算位置座標是偏移。pai...