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

相关文章
相关标签/搜索