#Android源码#View的onMeasure方法

原创 2016年02月10日 15:48:15

分析所得

  1. 功能:测量View和它的内容,来决定测量宽度和测量高度。

  2. 该方法由measure(int widthMeasureSpec, int heightMeasureSpec)(两个参数分别是parent告知的宽度和高度参数)调用,并且必须要经过子类重写来提供精确和有效的内容测量。

  3. 约定:当重写该方法时,必须调用setMeasuredDimension(int, int)来保存测量的宽度和高度,否则会引发IllegalStateException异常

  4. 子类有义务保证测量的宽度和高度至少要是view的最小高度和宽度。

  5. 宽高的mode和size封装到MeasureSpec中,详见 #Android源码#MeasureSpec

  6. 宽高是由parent决定的,所以child只能在parent给予的MeasureSpec下来进行宽高的设置

源码如下

    /**
     * <p>
     * Measure the view and its content to determine the measured width and the
     * measured height. This method is invoked by {@link #measure(int, int)} and
     * should be overridden by subclasses to provide accurate and efficient
     * measurement of their contents.
     * </p>
     *
     * <p>
     * <strong>CONTRACT:</strong> When overriding this method, you
     * <em>must</em> call {@link #setMeasuredDimension(int, int)} to store the
     * measured width and height of this view. Failure to do so will trigger an
     * <code>IllegalStateException</code>, thrown by
     * {@link #measure(int, int)}. Calling the superclass'
     * {@link #onMeasure(int, int)} is a valid use.
     * </p>
     *
     * <p>
     * The base class implementation of measure defaults to the background size,
     * unless a larger size is allowed by the MeasureSpec. Subclasses should
     * override {@link #onMeasure(int, int)} to provide better measurements of
     * their content.
     * </p>
     *
     * <p>
     * If this method is overridden, it is the subclass's responsibility to make
     * sure the measured height and width are at least the view's minimum height
     * and width ({@link #getSuggestedMinimumHeight()} and
     * {@link #getSuggestedMinimumWidth()}).
     * </p>
     *
     * @param widthMeasureSpec horizontal space requirements as imposed by the parent.
     *                         The requirements are encoded with
     *                         {@link android.view.View.MeasureSpec}.
     * @param heightMeasureSpec vertical space requirements as imposed by the parent.
     *                         The requirements are encoded with
     *                         {@link android.view.View.MeasureSpec}.
     *
     * @see #getMeasuredWidth()
     * @see #getMeasuredHeight()
     * @see #setMeasuredDimension(int, int)
     * @see #getSuggestedMinimumHeight()
     * @see #getSuggestedMinimumWidth()
     * @see android.view.View.MeasureSpec#getMode(int)
     * @see android.view.View.MeasureSpec#getSize(int)
     */
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        setMeasuredDimension(getDefaultSize(getSuggestedMinimumWidth(), widthMeasureSpec),
                getDefaultSize(getSuggestedMinimumHeight(), heightMeasureSpec));
    }

ANDROID自定义视图——onMeasure,MeasureSpec源码 流程 思路详解

自定义视图详解。MeasureSpec,onMeasure,measureChildren等方法源码分析。
  • a396901990
  • a396901990
  • 2014年07月17日 00:27
  • 18253

自定义view onMeasure方法的重写

  • ID19870510
  • ID19870510
  • 2016年02月21日 19:17
  • 1494

Android自定义View(三、深入解析控件测量onMeasure)

转载请标明出处: http://blog.csdn.net/xmxkf/article/details/51468648 本文出自:【openXu的博客】 目录:onMeasure什么...
  • u010163442
  • u010163442
  • 2016年05月24日 14:59
  • 21003

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

在自定义控件的过程中,系统在绘制View前,必须对View进行测量,已使后面的onLayout(设置View的放置位置)能够顺利进行。而对VIew的测量的过程则是在onMeasure()中进行的。可能...
  • gongzhiyao3739124
  • gongzhiyao3739124
  • 2016年09月14日 19:12
  • 1730

自定义view中onMeasure、onLayout、onDraw、onFinishInflate、onSizeChanged方法调用时机

一般自定义view或viewGroup基本上都会去实现onMeasure、onLayout、onDraw方法,还有另外两个方法是onFinishInflate和onSizeChanged。 on...
  • anhenzhufeng
  • anhenzhufeng
  • 2017年06月06日 18:36
  • 1281

自定义View的onMeasure、onLayout

原文 http://yifeiyuan.me/2015/10/12/%E8%87%AA%E5%AE%9A%E4%B9%89View%E7%9A%84onMeasure%E3%80%81onLayout...
  • yunnywu
  • yunnywu
  • 2016年01月07日 11:21
  • 918

Android 自定义View 中的OnMeasure的用法

作用:
  • a739697044
  • a739697044
  • 2014年06月12日 12:43
  • 9999

view的onMeasure,onLayout,onDraw源码分析

1, View三部曲 在oncreate方法中加载解析完xml资源创建view对象之后,Activity中的makeVisible方法会将这些对象依次测量,确定位置并且显示在幕布上。总体的流程图如下...
  • u012439416
  • u012439416
  • 2017年01月15日 18:47
  • 380

自定义view,viewgroup的onMeasure 方法

自定义view用了好久,用着用着吧感觉也就那么回事儿啊,如果想画个view,那就得知道view的大小。那么首当其中的就是onMeasure()方法啦。 先上一张图,这是我当年自学android的时候...
  • wanghao200906
  • wanghao200906
  • 2016年03月16日 17:19
  • 2213

自定义View之onMeasure(),onLayout(),onDraw()

自定义View之onMeasure() 分类: 实习android开发之路2014-01-25 11:13 395人阅读 评论(0) 收藏 举报 目录(?)[+] ...
  • zmissm
  • zmissm
  • 2014年07月15日 13:46
  • 6300
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:#Android源码#View的onMeasure方法
举报原因:
原因补充:

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