一般来说,自定义控件都会去重写View的onMeasure方法,因为该方法指定该控件在屏幕上的大小。

protected void onMeasure (int widthMeasureSpec, int heightMeasureSpec)

onMeasure传入的两个参数是由上一层控件传入的大小,有多种情况,重写该方法时需要对计算控件的实际大小,然后调用setMeasuredDimension(int, int)设置实际大小。

onMeasure传入的widthMeasureSpec和heightMeasureSpec不是一般的尺寸数值,而是将模式和尺寸组合在一起的数值。我们需要通过int mode = MeasureSpec.getMode(widthMeasureSpec)得到模式,用int size = MeasureSpec.getSize(widthMeasureSpec)得到尺寸。

mode共有三种情况,取值分别为MeasureSpec.UNSPECIFIED, MeasureSpec.EXACTLY, MeasureSpec.AT_MOST。

MeasureSpec.EXACTLY是精确尺寸,当我们将控件的layout_width或layout_height指定为具体数值时如andorid:layout_width="50dip",或者为FILL_PARENT是,都是控件大小已经确定的情况,都是精确尺寸。

MeasureSpec.AT_MOST是最大尺寸,当控件的layout_width或layout_height指定为WRAP_CONTENT时,控件大小一般随着控件的子空间或内容进行变化,此时控件尺寸只要不超过父控件允许的最大尺寸即可。因此,此时的mode是AT_MOST,size给出了父控件允许的最大尺寸。

MeasureSpec.UNSPECIFIED是未指定尺寸,这种情况不多,一般都是父控件是AdapterView,通过measure方法传入的模式。

因此,在重写onMeasure方法时要根据模式不同进行尺寸计算。下面代码就是一种比较典型的方式:

@Override    
protected  void onMeasure( int widthMeasureSpec,  int heightMeasureSpec) {    
    setMeasuredDimension(getMeasuredLength(widthMeasureSpec,  true), getMeasuredLength(heightMeasureSpec,  false));    
}    
    
    
private  int getMeasuredLength( int length,  boolean isWidth) {    
     int specMode = MeasureSpec.getMode(length);    
     int specSize = MeasureSpec.getSize(length);    
     int size;    
     int padding = isWidth ? getPaddingLeft() + getPaddingRight()    
            : getPaddingTop() + getPaddingBottom();    
     if (specMode == MeasureSpec.EXACTLY) {    
        size = specSize;    
    }  else {    
        size = isWidth ? padding + mWave.length / 4 : DEFAULT_HEIGHT    
                + padding;    
         if (specMode == MeasureSpec.AT_MOST) {    
            size = Math.min(size, specSize);    
        }    
    }    
     return size;    
}  
http://www.blogjava.net/liuyanbo/archive/2012/03/15/371969.html

OnMeasure()相关推荐

  1. 关于View测量中的onMeasure函数

    在自定义View中我们通常会重写onMeasure,下面来说说这个onMeasure有什么作用 onMeasure主要用于对于View绘制时进行测量 @Override protected void ...

  2. Android开发实践:为什么要继承onMeasure()

    首先,我们写一个自定义View,直接调用系统默认的onMeasure函数,看看会是怎样的现象: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 2 ...

  3. Android自定义视图四:定制onMeasure强制显示为方形

    这个系列是老外写的,干货!翻译出来一起学习.如有不妥,不吝赐教! Android自定义视图一:扩展现有的视图,添加新的XML属性 Android自定义视图二:如何绘制内容 Android自定义视图三: ...

  4. Android onMeasure方法介绍

    nMeasure方法在控件的父元素正要放置它的子控件时调用.它会问一个问题,"你想要用多大地方啊?",然后传入两个参数--widthMeasureSpec和heightMeasur ...

  5. 2.View绘制分析笔记之onMeasure

    今天主要学习记录一下Android View绘制三部曲的第一步,onMeasure,测量. 起源 在Activity中,所有的View都是DecorView的子View,然后DecorView又是被V ...

  6. Android onMeasure过程分析

    测量布局开始的总入口: android.view.ViewRootImpl#measureHierarchy 里面调用了performMeasure private boolean measureHi ...

  7. Android -- onMeasure()源码分析

    1,作为自定义控件最重要的三个方法之一,onMeasure()可以说是我们研究的重点,今天我们更详细的来研究一下View的onMeasure()方法和ViewGroup的onMeasure()方法 2 ...

  8. LinearLayout测量原理解析:onMeasure(int,int)

    想写这部分内容已经很久了,但是每次写的时候总感觉自己讲的不够清楚,但是感觉这种事情真的不能拖,越拖越解决不了,所以,Let's go!好好理一理LinearLayout的measure的原理,也就是测 ...

  9. onMeasure模式

    2019独角兽企业重金招聘Python工程师标准>>> MeasureSpec.UNSPECIFIED //无限制 case MeasureSpec.EXACTLY://限制固定值/ ...

  10. 自定义控件之onMeasure

    最近一直在接触自定义控件的知识,自己就尝试着写了一个小的demo,算是对自定义知识点进行下总结 今天先来看下自定义控件需要重写的三个重要方法 看代码 package com.example.testc ...

最新文章

  1. 7-27 冒泡法排序 (C语言)
  2. 计算机与应用教学,教学方法与教学手段
  3. c运行库、c标准库、windows API的区别和联系
  4. selenium2与python自动化6-select下拉框
  5. 凡普金科以互金 “头马”入选互联网企业百强的启示:创新为王
  6. 关于页面动态添加控件(转)
  7. 如何添加引文标_如何在Google文档中查找和添加引文
  8. Machine Learning、Date Mining、IRNLP 会议期刊论文推荐
  9. UI自定义UITableView的右侧索引
  10. 基于模型与不基于模型的深度增强学习_CVPR2018: 基于时空模型无监督迁移学习的行人重识别...
  11. java中nul值的处理
  12. 2019上海开源峰会炉边会谈纪要
  13. JavaScript函数的参数及传参
  14. 如何最高效实现手机~电脑端文件传输?
  15. css logo划一道光,[前端]纯css实现图片自动闪耀闪光划过效果css3特效logo | 尽享网...
  16. iOS打包成ipa包
  17. 《德鲁克管理思想精要》读书笔记
  18. iOS包体积优化实践
  19. idea发现git出现cannot run git:cannot identify version of git executable :no response
  20. 以潘金莲和西门公子为例讲述Java静态代理和动态代理

热门文章

  1. 系统延迟任务及定时任务
  2. HTML进行表单验证
  3. leetcode|剑指offter|面试题4:二维数组中的查找
  4. 人工智能算法工程师成长曲线
  5. 浅谈垃圾渗滤液处理技术分析!
  6. 知乎热榜:计算机专业的学生要怎样做才能避免成为低级的码农?
  7. shell脚本编程学习笔记3(xdl)——Bash变量的运算与测试
  8. Test 1D Degenerate Elliptical equation without Hamilton-Jacobi Part
  9. 决战职场,教你如何编织人际关系网(一)
  10. Android Process管理(进程管理) 详解