Android view的測量及繪製

2021-09-20 16:55:59 字數 3497 閱讀 1836

view的測量:

首先需要知道的是view的三種測量模式:

1、exactly:精確值模式,當我們對view的layout_width和layout_height屬性指定具體的數值的時候,比如layout_width=「100dp」或者指定為match_parent時,系統

進行測量的時候,使用的是這種模式。

2、at_most:最大值模式,當我們對view的layout_width和layout_height屬性指定為wrap_content時,即view隨著內容的大小變化而變化,或viewgroup隨著view的

大小變化而變化,這個時候系統進行測量的時候,使用的是這種模式。

3、unspecified:這個屬性下不用指定其大小,一般在自定義view時才會使用(這種模式不是很理解,求指教)

在對view進行測量的時候,需要重寫onmeasure()方法,view預設的onmeasure()

方法只支援exactly模式,即指定具體的數值,所以在自定義view的時候必須重寫

onmeasure(),這裡留乙個疑問:什麼時候才會呼叫measure方法進行測量?

@override    protected void onmeasure(int widthmeasurespec, int heightmeasurespec)
重寫後點super.onmeasure(widthmeasurespec, heightmeasurespec);進去看一下原始碼,發現系統最終會呼叫這個方法:

setmeasureddimension(int widthmeasurespec,int heightmeasurespec);
這個方法的作用是將我們對view設定的寬和高設定進去,所以我們最終重寫的onmeasure()方法就是這個樣子的,方法內的兩個入參widthmeasurespec和heightmeasurespec

就是我們在xml裡引用這個view時設定的width和height,後面我們需要根據這兩個值進行判斷,判斷系統要根據什麼測量模式進行測量。

@override    protected void onmeasure(int widthmeasurespec, int heightmeasurespec)
前文一直在說系統的測量模式,那麼我們要怎麼樣才能獲取到系統的測量模式呢?獲取測量模式後還需要獲取具體的測量大小

int specmode = measurespec.getmode(widthmeasurespec);int specsize = measurespec.getsize(widthmeasurespec);
單獨對measurewidth(widthmeasurespec)講解一下,因為height和width是一樣的。

private int measurewidth(int widthmeasurespec) else 

}        return widthresult;

}

這部分的理解要聯絡到前面說的3種測量模式,如果是在exactly if (specmode == measurespec.exactly) 

這種模式下,我們已經在xml裡面設定好了具體的數值,所以最後返回的值就是specsize

如果是at_most和unspecified

這兩種測量模式下,我們就需要給view乙個預設的大小,因為如果沒有給預設的大小的話,系統不知道view的大小,所以view或缺省充滿父布局。這裡預設的大小是400,

大家會發現else裡面還有乙個if,對at_most這種模式又進行了判斷,這是因為在這種模式下,view不需要預設的大小,view的是根據內容的大小變換而變化的。

最後就是xml裡面進行引用和效果展示了:

view的繪製:

對view進行繪製需要重寫ondraw()方法,ondraw()方法中會有乙個canvas,可以把這個引數理解成畫板,我們最終會借用這個畫板進行繪製。

有了畫板,要想繪畫的話當然還需要一支畫筆paint。

= = ,,,getmeasuredwidth()-,getmeasuredheight()-,
接下講解一下這段**的功能,首先例項了兩隻畫筆,並且對畫筆設定了顏色和風格,接下來開始繪製,這裡我們畫的是兩個相互巢狀的橢圓,

canvas.drawoval(0,0,getmeasuredwidth(),getmeasuredheight(),paint1);這個方法需要5個入參,分別是view相對于父布局的左、上、右、下的座標,最後乙個是進行繪製的畫筆。

系統給我們提供的draw***方法有很多:

canvas繪製的常用方法有:

drawcolor() 填充顏色

drawline() 繪製線

drawlines() 繪製線條

drawoval() 繪製圓

drawpath() 繪製路徑

drawpicture() 繪製

drawpoint() 繪製點

drawpoints() 繪製點

drawrgb() 填充顏色

drawrect() 繪製矩形

drawtext() 繪製文字

drawtextonpath() 在路徑上繪製文字

效果展示:

viewgroup的測量:

我們知道viewgroup管理子view,那麼viewgroup的大小,除設定指定大小外,是根據子view來決定的,viewgroup在測量時會遍歷所有的子view,呼叫

子view的measure方法來獲得每乙個子view的測量結果,這樣文章開始留下的疑問就解決了,意不意外~關於viewgroup的繪製,一般情況下如果不是指定

了viewgroup的背景顏色,viewgroup的ondraw()方法不會被呼叫,但是viewgroup會使用dispatchdraw()方法來繪製其子view,過程同樣是遍歷所有的子view

,並呼叫子view的繪製方法來完成繪製。

Android View的 滑動衝突及工作流程

一簡單場景下 如 水平滑動裡面巢狀一層垂直滑動 解決辦法很多,這裡記乙個方法。通過水平滑動的距離dx與垂直滑動的距離dy的大小來判斷是水平還是垂直滑動。通常有外部攔截跟內部攔截,外部攔截即重寫父容器的onintercepttouchevent,而內部攔截即重寫子元素的dispatchtoucheve...

android View的層級結構

我們看到最頂層就是phonewindow decorview,接著decorview下面有乙個linearlayout,linearlayout下面有兩個framelayout 上面那個framelayout是用來顯示標題欄的,這個demo中是乙個textview,當然我們還可以定製我們的標題欄,利...

《電源的各項指標及測量》上

第一天學習 直流電壓時 1.電壓調整率 負載不變,輸入電壓變化時輸出電壓相對變化量。負載 指連線在電路中電源倆端的電子元件,將電能轉化中其它形式的能量。2.負載調整率 也稱為電流調整率。表示在輸入電壓不變的情況下,在一定範圍內改變負載,輸出電壓的最大相對變化量。此指標衡量電源的負載能力 3.紋波係數...