zoukankan      html  css  js  c++  java
  • onMeasure实例分析

    本文转自:http://blog.csdn.net/u012604322/article/details/17097105

             

    上面这个两个视图是Android API中没有给出来的但在来电接听和闹钟被使用到的一个widget视图——GlowPadView.java

    我们通过源码来看看这个View的大小是怎么通过onMeasure来控制的。

        @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图片或其它图片的宽度。这部分值是有开发人员指定的自己期望的自己的视图中属性的大小

        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值为父视图的值,虽然我们不希望这样,但父视图只给出了这么些空间,我们也只得这样。

    二是match_parent,对应只有一个父视图的值,这也是符合要求的。

    一个好的设计应该要考虑到各种情况下的使用,而一个可复用的框架设计更是如此,设计之前需要预想到各种可能的应用情况。

  • 相关阅读:
    Tree Recovery解题报告
    bjtuOJ1019 Robot
    bjtuOJ1137 蚂蚁爬杆
    栈的使用,rails
    重做catch the cow
    C#3.0新特性之匿名类型
    C#Lambda表达式的用法
    C#进程的使用方法详解
    C#进程管理启动和停止
    C#LINQ查询表达式用法
  • 原文地址:https://www.cnblogs.com/sishuiliuyun/p/4885497.html
Copyright © 2011-2022 走看看