onMeasure實例分析

 

本文轉自: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

相關文章
相關標籤/搜索