Android MeasuerSpce的由來及使用

來源:互聯網
上載者:User

標籤:

含義:MeasuerSpce是parent傳遞給child的一組測量值(size)和模式(mode)的組合。

使用情境:經常我們會在child的onMeasure(int widthMeasureSpec,int heightMeasureSpec)這個函數中來對spec進行處理,用於確定child的長和寬。


這裡我們看到MeasureSpec有3中測量模式:

MeasureSpec.AT_MOST :child最多達到parent的大小,這一類通常歸於"wrap_content"。

MeasureSpec.EXACTLY:child的大小是一個確定的值,這一類通常歸於"match_parent"或者是一個確定的值。

MeasureSpec.UNSPECIFED:這個幾乎不用,未指定,child可以得到自己想要的任何大小。

Measure的makeMeasureSpec,getMode,getSize我這裡就不多說了,很簡單就是一個位元運算。


說了半天,到底這個widthMeasureSpec和heightMeasureSpec怎麼來的呢?這就需要看看源碼。

我們知道View的測量和繪製都是通過它的parent來觸發的,所以直接進ViewGroup

切入點就是measure:


這裡我們又看到一個parentWidthMeasureSpec和parentHeightSpec,這裡我們先不管,大概知道這個是它的parent給它的spec。

繼續進入函數:


可以看到,這裡在switch(mode)和我們處理view的onMeasure差不多。

繼續向下:


到這裡,spec就已經組合好了,下一步應該是傳遞給child計算了。


到這裡為止,viewgroup的測量就算完成了。接下來就是交給child自己計算,也就回到了,我們最初的onMeasure函數中。

上面我們還說到了這個parentWidthMeasureSpec和parentHeightSpec,其實也就是當前viewgroup的parent給它的測量模式和值。遵循上面的步驟,一模一樣。


所以以後像遇到這個問題,解決思路和辦法就很簡單了。

View view=getLayoutInflater().inflate(R.layout.layout_item, null);

Toast.makeText(MainActivity.this, "view_w="+view.getMeasuredWidth()+","+view.getLayoutParams(), 0).show();


為啥view的寬度為0,layoutparams為null?

view的寬度為0,很明顯:就是view沒有measure,因為我們是從一個xml檔案中pull解析出來的一個view,它沒有parent更沒有parent測量,所以為0.

解決辦法就是measure,view.measure(0,0)一下;我們傳0,0,最終也就是view自己測量自己。這裡還有一個layoutparams為null,為啥呢?

我們知道layoutParams是parent給child的布局參數。在view的源碼中我們看到


還有get,set方法


我們回到viewGroup中。



這裡我們看到addview會傳遞一個params,這個params怎麼來的呢?


這裡我們看到了child的layoutparams是在addview中賦值的,所以上面的layoutinflate的view因為沒有parent所以就沒有layoutparams。

解決辦法:


歡迎大家指正和批評!



Android MeasuerSpce的由來及使用

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.