本文轉自:http://blog.csdn.net/u012604322/article/details/17097105java
上面這個兩個視圖是Android API中沒有給出來的但在來電接聽和鬧鐘被使用到的一個widget視圖——GlowPadView.java框架
咱們經過源碼來看看這個View的大小是怎麼經過onMeasure來控制的。ide
@Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { final int minimumWidth = getSuggestedMinimumWidth(); final int minimumHeight = getSuggestedMinimumHeight(); int computedWidth = resolveMeasured(widthMeasureSpec, minimumWidth); int computedHeight = resolveMeasured(heightMeasureSpec, minimumHeight); ... setMeasuredDimension(computedWidth, computedHeight); }
@Override protected int getSuggestedMinimumWidth() { // View should be large enough to contain the background + handle and // target drawable on either edge. return (int) (Math.max(mOuterRing.getWidth(), 2 * mOuterRadius) + mMaxTargetWidth); }
mOuterRing爲一個指定的圓(由Shape畫出,所以給出的是寬和高,至關於圓半徑),mOuterRadius爲最大的虛線圓的半徑,mMaxTargetWidth爲圖中Zzz圖片或其它圖片的寬度。這部分值是有開發人員指定的本身指望的本身的視圖中屬性的大小spa
private int resolveMeasured(int measureSpec, int desired) { int result = 0; int specSize = MeasureSpec.getSize(measureSpec); switch (MeasureSpec.getMode(measureSpec)) { case MeasureSpec.UNSPECIFIED: result = desired; break; case MeasureSpec.AT_MOST: result = Math.min(specSize, desired); break; case MeasureSpec.EXACTLY: default: result = specSize; } return result; }
咱們從width分析,承載這個View的ViewGroup可能有兩種狀況,一(A)提供的空間比上面咱們給出的值大,二(B)是要小(開發中基本上咱們不會容許這種情況出現,但設計的邏輯依然必須考慮到這種可能)。而後就要看的是View的layout_width,一是wrap_content,對應AT_MOST,A獲得的值爲給出的值,B值爲父視圖的值,雖然咱們不但願這樣,但父視圖只給出了這麼些空間,咱們也只得這樣。.net
二是match_parent,對應只有一個父視圖的值,這也是符合要求的。設計
一個好的設計應該要考慮到各類狀況下的使用,而一個可複用的框架設計更是如此,設計以前須要預想到各類可能的應用狀況。code