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

@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {super.onMeasure(widthMeasureSpec, heightMeasureSpec);
}
复制代码
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {setMeasuredDimension(getDefaultSize(getSuggestedMinimumWidth(), widthMeasureSpec),getDefaultSize(getSuggestedMinimumHeight(), heightMeasureSpec));
}
复制代码

setMeasuredDimension是设置它的宽度和高度

public static int getDefaultSize(int size, int measureSpec) {int result = size;int specMode = MeasureSpec.getMode(measureSpec);int specSize = MeasureSpec.getSize(measureSpec);switch (specMode) {case MeasureSpec.UNSPECIFIED:result = size;break;case MeasureSpec.AT_MOST:case MeasureSpec.EXACTLY:result = specSize;break;}return result;
}
复制代码

上面用来获取宽高的函数,可以看出这里有3种模式: UNSPECIFIED 这种模式它的result就是size, size是通过getSuggestedMinimumWidth()和getSuggestedMinimumHeight()获取的, 看看getSuggestedMinimumWidth

protected int getSuggestedMinimumWidth() {return (mBackground == null) ? mMinWidth : max(mMinWidth, mBackground.getMinimumWidth());
}
复制代码

通常mBackground是通过外部setBackgroundDrawable调用赋值的. mMinWidth也可以通过外部负责,也可以通过属性赋值

case R.styleable.View_minWidth:mMinWidth = a.getDimensionPixelSize(attr, 0);break;
复制代码
public void setMinimumWidth(int minWidth) {mMinWidth = minWidth;requestLayout();}
复制代码

通常UNSPECIFIED是不会调用到的.所以我们无需过度关心它的情况. AT_MOST AT_MOST对于xml属性中的wrap_content, 就是适用view内容的大小,但是自定义view情况设置wrap_content通常会传入填满父控件的specSize。这点从这里可以看出

case MeasureSpec.AT_MOST:
case MeasureSpec.EXACTLY:
result = specSize;
复制代码

这显然不是我们希望看到的,所以自定义需要重写onMeasure,来对应这种情况 EXACTLY EXACTLY模式对应制定的宽高和match_partent, 用来精确的设定宽高. 接下来说说怎么重写onMeasure这个函数,重写onMeasure主要是为了争对设置wrap_content,自定义view填充父容器的情况,所以我们只是争对MeasureSpec.AT_MOST这种情况.

private int measureWidth(int measureSpec){int result = 0;int specMode = MeasureSpec.getMode(measureSpec);int specSize = MeasureSpec.getSize(measureSpec);switch (specMode) {case MeasureSpec.UNSPECIFIED:result = 200;break;case MeasureSpec.AT_MOST:result = Math.min(result,specSize);break;case MeasureSpec.EXACTLY:result = specSize;break;}return result;
}
复制代码

measureHeight和measureWidth是一样的,注意Math.min(result,specSize)这段代码,用来防止实际父控件的大小比指定的200要小,最终调用:

@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {setMeasuredDimension(measureWidth(widthMeasureSpec),measureHeight(heightMeasureSpec));
}
复制代码

转载于:https://juejin.im/post/5cbdbcc4e51d456e51614ac5

关于View测量中的onMeasure函数相关推荐

  1. android view绘制中调用的函数,Android开发实践:自定义带动画的View

    前面两篇文章介绍了自定义View的onMeasure和onLayout原理,本文准备介绍自定义View的第三个关键部分,即onDraw()函数的重载. 对于一个自定义View来说,onMeasure只 ...

  2. 安卓自定义view全解:初始化,onDraw函数,onMeasure函数,用户手势事件

    全栈工程师开发手册 (作者:栾鹏) 安卓教程全解 安卓自定义view全解. view类包含如下函数.可供重写. onFinishInflate() 回调方法,当应用从XML加载该组件并用它构建界面之后 ...

  3. Android GUI之View测量

    在上篇文章(http://www.cnblogs.com/jerehedu/p/4607599.html#gui)中,根据源码探索了View的绘制过程,过程有三个主要步骤,分别为测量.布局.绘制.系统 ...

  4. Android View 测量流程(Measure)完全解析

    前言 上一篇文章,笔者主要讲述了DecorView以及ViewRootImpl相关的作用,这里回顾一下上一章所说的内容:DecorView是视图的顶级View,我们添加的布局文件是它的一个子布局,而V ...

  5. Android面试收集录12 View测量、布局及绘制原理

    一.View绘制的流程框架 View的绘制是从上往下一层层迭代下来的.DecorView-->ViewGroup(--->ViewGroup)-->View ,按照这个流程从上往下, ...

  6. 在.c文件中调用cuda函数

    在.c文件中调用cuda函数 2014-04-19 17:17 446人阅读 评论(0) 收藏 举报 分类: cuda编程(1) 版权声明:本文为博主原创文章,未经博主允许不得转载. 问题描述:假设在 ...

  7. 五十一、微信小程序云开发中的云函数

    @Author:Runsen 暑假很长,明年就是找工作的时候了.这个时候必须比之前还要拼命. 百无聊赖,看过文档才发现,微信小程序已将云函数,对象存储和云数据库这些都搬了进来,由于前几天刚刚看过这些方 ...

  8. mysql 过程 的函数的区别是什么意思_Mysql中存储过程和函数的区别是什么

    Mysql中存储过程和函数的区别是什么 发布时间:2020-12-03 10:01:49 来源:亿速云 阅读:105 作者:小新 这篇文章主要介绍了Mysql中存储过程和函数的区别是什么,具有一定借鉴 ...

  9. jQuery动画高级用法(上)——详解animation中的.queue()函数

    如果你拿着一个疑问去找专业人士寻找答案,那么你的一个疑问会变成三个,因为他会用另外两个令你更加一头雾水的名词来解释你的这个疑问. 我想这是大多数,包括我在内,IT人在学习过程中碰到的最大问题.当你有一 ...

最新文章

  1. 论文笔记——PRUNING FILTERS FOR EFFICIENT CONVNETS
  2. 【AI初识境】深度学习模型中的Normalization,你懂了多少?
  3. css选择器中间的空格
  4. 升级python3后yum出现异常解决办法
  5. canvas笔记-closePath函数的使用(含例子)
  6. 科研人看过来!中国人工智能学会-华为MindSpore学术奖励基金发布通知
  7. 直播丨国产最强音:HTAP融合型分布式数据库EsgynDB架构详解
  8. Python3.x中Django-xadmin的添加
  9. XEON® Scalable-如何为虚拟化挑选合适的CPU
  10. JMETER 分布式踩过的坑及填坑方法
  11. 广义典型相关分析_一文教你掌握广义估计方程
  12. 用JAVA Excel API 实现对Excel表格的读写更新 (转)
  13. mysql语法_MySql实用技能,最常用的删除语法
  14. OpenDDS系列(1) —— OpenDDS 简介
  15. php编写出一个时钟,用HTML5实现一个时钟
  16. 在Centos 5.x或6.x上安装RHEL EPEL Repo
  17. 有木有收Java兼职的
  18. 牛客小白月赛58 B(暴力)C(思维)D(dp滚动数组优化)
  19. iframe标签中写html,html页面中嵌套iframe标签,我们可以用html中的iframe标签搞定
  20. mybatis对布尔类型的处理

热门文章

  1. 泛型推断类型不符合上限
  2. Ubuntu上通过android toolchain交叉编译Valgrind操作步骤
  3. 【视频】视频传输协议:RTSP、RTP、RTCP、RTMP、HTTP
  4. 【C++】google gtest 详解
  5. 全局声明宏定义_Rust语言:元编程,强大的宏系统,菜鸟到高手进阶的必经之路...
  6. SpringBoot复习:3(@Conditional)
  7. 实用c语言函数源码,C语言编写简单朗读小工具(有源码)
  8. linux重命名tar命令,linux常用操作指令4 —— 文件操作相关命令(mkdir、touch、rm、mv、cp、cat 、 find 、tar、chmod)...
  9. 软件工程实训有必要吗_人工智能专业值得读吗?就业如何?
  10. 录制短视频的录制按钮边框计时效果