3.2 View的測量

? ? ? ? 那么在繪制之前,我們還需要思考一下,系統(tǒng)是如何繪制出這些View的,相信大家曾經玩過這樣一個游戲:一個人蒙著眼睛,拿著筆去滑板上畫指定的團,另一個人通過說話來指導他如何去畫。比如你會知道他,在距畫邊緣一掌寬的地方畫一個邊長大概10CM的正方形,而如果你只告訴它,畫一個矩形,那么你的同伴就無法準備的畫出這個原形了,其實,Android就好像那么蒙著眼睛畫畫的人,你必須精確地告訴他該如何去化,他才能繪制出你想要的圓形。

? ? ? 在現(xiàn)實生活中,如果我們要去化一個圓形,就必須知道他的大小和位置,同樣,Android系統(tǒng)在繪制View前,也必須對View進行測量,及告訴系統(tǒng)該畫一個多大的View。這個過程在onMeasure()方法中進行。

Android系統(tǒng)給我們提供了一個設計短小精悍卻功能強大的類--------MeasureSpeaec類,通過他來幫忙我們測量View。MeasureSpeaec是一個32位的int值,其中高2位為測量的模式,低30測量的模式可以為以下3種。

------EXACTLY(就是指定了控件的實際值1)

? ? ? ? 即精確值模式,當我們將控件的layout_with屬性或layout_height屬性指定為具體的值時,比如android:layout_width="100dp",或者指定為match_parent屬性時(占據(jù)父View的大小),系統(tǒng)使用的是EXACTLY模式。

-------AT_MOST

? ? ? ?即最大值模式,當控件的layout_with屬性或者layout_height屬性指定為 wrap_content時,控件大小一般隨著控件的子控件或內容的變化而變化,此時控件的尺寸只要不超過父控件允許的最大尺寸即可。

-------UNSPECIFIED

? ? ? ?這個屬性比較奇怪--------他不指定其大小測量模式,View想多大就多大,通常情況下在繪制自定義自定義View才會使用。

? ? ? View類默認的 onMeasure() “測量的方法只支持EXACTLY模式,所以如果在自定義的時候不重寫onMeasure()的話,就只能使用EXACTLY模式??丶梢皂憫阒付ǖ木唧w高度值或者是match_parent屬性。而如果要讓你自定義View支持wrap_content屬性,那么就必須重寫onMeasure()方法來指定wrap_content()的大小

通過MeasureSpec這個類,我們就獲取了View的測量模式和View想要繪制的大小。有了這些信息,我們就可以控制View最后顯示的大小。

下面我們就來看一個簡單的實例,延時如何進行View的測量。首先,要重寫


在IDE中按住Ctrl鍵查看


方法,可以發(fā)現(xiàn),系統(tǒng)最終會調用

setMeasuredDimension(int measuredWith,int measuredHeight)

方法將測量后的寬度值設置進去,從而完成測量工作。所以在重寫onMeasure()方法之后,最終要做的工作就是把測量后的寬高值作為參數(shù)設置,從而完成測量的工作。所以在重寫onMeasure()方法之后,最終要做的工作就是把測量后的寬高作為參數(shù)設置給setMeasuredDimension()方法;

? ? ? ? 通過上面的分析,重寫onMeasure()方法之后的代碼如下:

? ? ? ?在onMeasure()方法中,我們調用自定義的兩個方法,分別對寬高進行重新定義,參數(shù)則是高和寬的MeasureSpece對象,MeasureSpece對象中包含了測量的模式和測量值的大小。

下面我們就可以以

為例,講解如何自定義測量值。

第一步,從MeasureSpece對象中提取出具體的測量模式和大小,代碼如下所示:

接下來,通過判斷測量的模式,給出不同的測量值。當specMode為EXACTLY時,直接使用指定的specSize即可,當specMode為其他兩種模式時,需要圪塔一個默認的大小。特別的如果指定wrap_content屬性,及AT_MOST模式,需要給他一個默認的大小與specSize中最小的一個作為最后的測量值,(方法如下)

另一個方法(基本一樣)


通過這兩個方法,我們就完成了對寬高值的自定義。最后,可以在程序運行效果如圖

通過這個小的實例,相信大家應該對View的測量不再陌生了,他并沒有什么高深莫測的東西,它的整個過程與我們在生活中精確繪圖的過程基本是一樣的。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容