#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自定义View之onMeasure()源码分析及重写

从Android自定义View学习系列计划开始,到现在也有挺长时间了,上一篇Android自定义View之常用工具源码分析讲到了Android开发过程中常使用到的一些工具,都从源码上进行了分析,让大家...
  • CCH_why
  • CCH_why
  • 2017年05月09日 21:44
  • 75

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

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

android中对View的onMeasure()方法的理解

在android开发中,很多人对自定义View是望而生畏,我也一样,但这又是向高级进阶的必经之路,主要是对View里面的很多方法不知道怎么理解,其中一个就是onMeasure()方法,网上有很多这样解...

Android自定义控件:图片比例适配,解决图片白边(详解View中onMeasure方法)

当App中涉及到布局需要展示大量图片时,你就应该考虑到“图片比例适配“的问题。当图片的宽高规格不同时,你设置展示的ImageView是否可以完好地展示,填充满?也就是说ImagView的比例和图片的比...

Android LayoutInflater深度解析 给你带来全新的认识(包含View的onMeasure方法)

本文出自:http://blog.csdn.net/lmj623565791/article/details/38171465 1、 题外话 相信大家对LayoutInflate都不陌生,...

Android中View的绘制过程 onMeasure方法

Android中View的绘制过程

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

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

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

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

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

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

Android View.onMeasure方法的理解

View在屏幕上显示出来要先经过measure(计算)和layout(布局). 1、什么时候调用onMeasure方法?  当控件的父元素正要放置该控件时调用.父元素会问子控件一个问题,“你想要用...
  • RItilyN
  • RItilyN
  • 2012年11月27日 15:23
  • 341
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:#Android源码#View的onMeasure方法
举报原因:
原因补充:

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