onMeasure实例分析

原创 2013年12月03日 17:29:55

          

上面这个两个视图是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,对应只有一个父视图的值,这也是符合要求的。


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

相关文章推荐

android 自定义View之View的测量(onMeasure()方法)

在自定义控件的过程中,系统在绘制View前,必须对View进行测量,已使后面的onLayout(设置View的放置位置)能够顺利进行。而对VIew的测量的过程则是在onMeasure()中进行的。可能...

关于在新建的package中用SetContentView()函数时无法找到已创建的R.layout的布局文件的的问题的解决办法

问题描述如下: 解决途径:可能是在创建新包的过程中,系统自动将Android.R这个文件导入最终导致用setContenView()加载布局时只能显示系统自带的布局,无法显示自己已经创建的布局只需...

自定义View系列教程02--onMeasure源码详尽分析

大家知道,自定义View有三个重要的步骤:measure,layout,draw。而measure处于该链条的首端,占据着极其重要的地位;然而对于measure的理解却不是那么容易,许多问题都是一知半...

Android 自定义控件源码分析----谈Android自定义控件中 onMeasure()方法处理 wrap_content 情况的必要性

这是一篇与 Android 自定义控件相关的源码分析的文章. 主要从源码的角度分析自定义控件时, onMeasure() 方法处理其宽或高在布局文件中被设置为 wrap_content 时的必要性....

view的onMeasure,onLayout,onDraw源码分析(下)

1, 引子 一直以为绘制的三个方法onMeasure,onLayout,和onDraw只调用一次,分析源码时也没有在意,后来在看listview时发现onLayout居然调用了2次,然后就有些疑惑了...

自定义View系列教程02--onMeasure源码详尽分析

大家知道,自定义View有三个重要的步骤:measure,layout,draw。而measure处于该链条的首端,占据着极其重要的地位;然而对于measure的理解却不是那么容易,许多问题都是一知半...
  • lfdfhl
  • lfdfhl
  • 2016年05月12日 15:09
  • 32635

onMeasure()源码分析及自定义View对于wrap_content的支持

/** * * 文档描述: * (1)onMeasure()源码分析 * (2)自定义View时重写onMeasure()实现对于wrap_content的支持 * * 原...
  • lfdfhl
  • lfdfhl
  • 2016年03月25日 11:18
  • 1823

RelativeLayout的onMeasure源码分析

都知道RelativeLayout的一次测量调用两次子视图测量循环 横向一次 纵向一次 带着目的, 我们来分析源码 @Override protected void onMeasure...

源码分析:onAttach, onMeasure, onLayout, onDraw 的顺序。

从前文《 源码解析:dialog, popupwindow, 和activity 的第一个view是怎么来的?》中知道了activity第一个view或者说根view或者说mDecorView 其实就...

从源码角度分析一下OnMeasure

onMeasure 进阶
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:onMeasure实例分析
举报原因:
原因补充:

(最多只允许输入30个字)