2016-02-27 73 views
-1

這些天我正在學習如何自定義Android上的視圖。我知道如果我們設置最小寬度,那麼系統會比較我們設置的最小寬度和測量的寬度,並選擇適當的視圖。令人困惑的是,android系統如何根據視圖的內容改變視圖的大小,如「wrap_content」的意思。我想知道更多關於如何實現「wrap_content」的細節。非常感謝。Android如何實現屬性「wrap_content」?

+1

這裏是你的答案http://developer.android.com/guide/topics/ui/how-android-draws.html – Rohit5k2

回答

0

這是Official Documentation說(我將只是其中的一部分用於快速閱讀)

當查看對象的measure()方法返回,其getMeasuredWidth()getMeasuredHeight()值必須設置,與所有的沿那個View對象的後代。 View對象的測量寬度和測量的高度值必須遵守由View對象的父母施加的約束。這保證了在測量結束時,所有父母都接受他們所有孩子的測量。父視圖可以多次呼叫measure()對其子女。例如,父母可以用未指定的尺寸對每個孩子進行一次測量,以確定他們想要的大小,然後如果所有孩子的無約束尺寸的總和過大或過小,則再次用實際數字對其調用measure()(即,如果孩子們彼此不同意他們每個人得到多少空間,那麼父母會介入並在第二次通過時設置規則)。

度量傳遞使用兩個類來傳遞維度。 View對象使用ViewGroup.LayoutParams類來告訴他們的父母他們想要如何測量和定位。基類ViewGroup.LayoutParams類只是描述View對於寬度和高度都有多大。對於每一個維度,它可以指定一個:

MATCH_PARENT,這意味着視圖想要成爲大如其父(減去填充)

WRAP_CONTENT,這意味着視圖想要剛好足夠大到附上其內容(加上填充)。

MeasureSpec對象用於將需求從父項推送到子項。 A MeasureSpec可以處於以下三種模式中的一種:

UNSPECIFIED:由父級用於確定子View的所需維度。例如,一個LinearLayout可能會調用measure()其子高度設置爲UNSPECIFIED和寬度爲EXACTLY 240,以查明子View的高度有多高,需要240個像素的寬度。

EXACTLY:父母使用這種方式在孩子身上施加確切的尺寸。孩子必須使用這個尺寸,並保證所有的後代都符合這個尺寸。

AT MOST:父母使用此設置將最大尺寸強加給孩子。孩子必須保證它和它的所有後代都適合這個尺寸。