2013-01-24 20 views
21

我見過很多在android中創建自定義視圖和佈局的例子。我從他們身上學到的是,該措施(如在Android開發人員網站上所述)爲onMeasure(),其中widthMeasureSpecheightMeasureSpec作爲參數。Android自定義視圖中的widthMeasureSpec和heightMeasureSpec是什麼?

  1. 這些參數的實際含義是什麼?
  2. 它們的初始值是什麼?
  3. 如果我創建的自定義視圖是我的活動的父視圖,它們將調用什麼值?

我對這些問題非常困惑。

+0

你讀過[進一步進入文檔](http://developer.android.com/reference/android/view/View.MeasureSpec.html)嗎? – Eric

+0

我會進一步看看它。謝謝埃裏克 – neerajdorle

+0

埃裏克,你能幫我弄清楚下面的事情嗎?我寫了一個自定義佈局,我想用它作爲活動的根佈局。我也包含了子視圖(在編寫XML文件時)。你能幫我弄清楚自從活動中的setContentView被調用以來發生的一系列事件。什麼時候(和誰/哪些)測量並且onMeasure被調用? onMeasure如何爲其子女計算空間?我確實閱讀過文檔,並且能夠很好地理解它,但仍然存在這些問題。對不起我的英語不好。 – neerajdorle

回答

41

widthMeasureSpec and heightMeasureSpec是複合變量。雖然它們只是普通的舊整數,但它們實際上包含兩個獨立的數據。

存儲在這些變量中的第一部分數據是給定維度的可用空間(,像素爲)。

可以使用這種便利方法提取此數據:

int widthPixels = View.MeasureSpec.getSize(widthMeasureSpec); 

數據的第二片被測量模式,則存儲在INT的高階位,並且是這些可能的值中的一個:

View.MeasureSpec.UNSPECIFIED 
View.MeasureSpec.AT_MOST 
View.MeasureSpec.EXACTLY 

你可以用這個方便的方法提取值:

int widthMode = View.MeasureSpec.getMode(widthMeasureSpec); 

你可以使用做一些邏輯,改變其中的一個或兩個,然後創建一個新的meassureSpec最後一個簡便方法:

int newWidthSpec = View.MeasureSpec.makeMeasureSpec(widthPixels, widthMode ); 

,並傳遞下來給你的孩子,通常是通過調用super.onMeasure(widthMeasureSpec, heightMeasureSpec);

onMeasure()中,MeasureSpec模式用於傳遞您的視圖允許的最大空間,並允許其子項佔用。它還使用spec模式作爲在子視圖上放置一些額外約束的一種方式,告知它們如何允許使用可用空間。

一個很好的例子就是Padding。 ViewGroups獲取可用的寬度和高度,並減去它們的填充,然後創建一個新的meassureSpec,從而將一個稍小的區域傳遞給他們的孩子。

+1

不應該是:int widthPixels = View.MeasureSpec.getSize(widthMeasureSpec);和int widthMode = View.MeasureSpec.getMode(widthMeasureSpec); –

+0

是的!謝謝@AndréRestivo,很好的抓住:) – Adam

+0

很好的答案,正是我所期待的,thx。 –

相關問題