我見過很多在android中創建自定義視圖和佈局的例子。我從他們身上學到的是,該措施(如在Android開發人員網站上所述)爲onMeasure()
,其中widthMeasureSpec
和heightMeasureSpec
作爲參數。Android自定義視圖中的widthMeasureSpec和heightMeasureSpec是什麼?
- 這些參數的實際含義是什麼?
- 它們的初始值是什麼?
- 如果我創建的自定義視圖是我的活動的父視圖,它們將調用什麼值?
我對這些問題非常困惑。
我見過很多在android中創建自定義視圖和佈局的例子。我從他們身上學到的是,該措施(如在Android開發人員網站上所述)爲onMeasure()
,其中widthMeasureSpec
和heightMeasureSpec
作爲參數。Android自定義視圖中的widthMeasureSpec和heightMeasureSpec是什麼?
我對這些問題非常困惑。
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,從而將一個稍小的區域傳遞給他們的孩子。
不應該是:int widthPixels = View.MeasureSpec.getSize(widthMeasureSpec);和int widthMode = View.MeasureSpec.getMode(widthMeasureSpec); –
是的!謝謝@AndréRestivo,很好的抓住:) – Adam
很好的答案,正是我所期待的,thx。 –
你讀過[進一步進入文檔](http://developer.android.com/reference/android/view/View.MeasureSpec.html)嗎? – Eric
我會進一步看看它。謝謝埃裏克 – neerajdorle
埃裏克,你能幫我弄清楚下面的事情嗎?我寫了一個自定義佈局,我想用它作爲活動的根佈局。我也包含了子視圖(在編寫XML文件時)。你能幫我弄清楚自從活動中的setContentView被調用以來發生的一系列事件。什麼時候(和誰/哪些)測量並且onMeasure被調用? onMeasure如何爲其子女計算空間?我確實閱讀過文檔,並且能夠很好地理解它,但仍然存在這些問題。對不起我的英語不好。 – neerajdorle