Android measure和layout的一點理解

來源:互聯網
上載者:User

標籤:android   style   blog   http   color   使用   

首先,推薦文章,http://blog.csdn.net/hqdoremi/article/details/9980481,http://www.docin.com/p-571954086.html

我理解measure的作用有2個:一個就是調用子view的measure函數,產生他們的高度和寬度,以便在自己的layout階段參考;另一個是為父view提供關於自己的測量的width和height(這個寬度和高度往往和子view的測量高度和寬度有關),以便父view在layout階段參考。

layout的作用就是布局子view的大小位置,這裡可以使用剛才測量出的width和height,也可以不使用(當然,系統內建的布局都是使用的,因為這是推薦的規範做法),這完全取決於你想實現的布局效果(比如我可以知道子view的確定位置,就可以直接調用子view的layout函數定位,根本不用什麼測量值),所以measure產生的mMeasuredWidth和mMeasuredHeight僅僅是參考用的。

把measure和layout分開,更方便重用系統控制項。比如ListView不想使用捲軸,想把內容全部現實出來,就可以簡單地重寫一個onMeaure函數,繼續使用預設的onLayout函數。代碼如下:

public class NoScrollListView extends ListView{    public NoScrollListView(Context context, AttributeSet attrs) {        super(context, attrs);    }    public void onMeasure(int widthMeasureSpec, int heightMeasureSpec){        int mExpandSpec = View.MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE >> 2, View.MeasureSpec.AT_MOST);        super.onMeasure(widthMeasureSpec, mExpandSpec);    }}

這裡的onMeaure,修改了父view對listview的高度說明,改為“最多達到最大整數值”,其實就意味著當父view布局這個listview時,分配的高度,是不受父view高度限制了(感覺listview之所以出現捲軸,是在onMeasure中根據父view的大小來判斷的),所以listview會把內容全部載入到了父view上,沒有了捲軸,當然,超過父view的地方看不見,需要配合scrollview使用。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.