关于View测量中的onMeasure函数
在自定义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函数相关推荐
- android view绘制中调用的函数,Android开发实践:自定义带动画的View
前面两篇文章介绍了自定义View的onMeasure和onLayout原理,本文准备介绍自定义View的第三个关键部分,即onDraw()函数的重载. 对于一个自定义View来说,onMeasure只 ...
- 安卓自定义view全解:初始化,onDraw函数,onMeasure函数,用户手势事件
全栈工程师开发手册 (作者:栾鹏) 安卓教程全解 安卓自定义view全解. view类包含如下函数.可供重写. onFinishInflate() 回调方法,当应用从XML加载该组件并用它构建界面之后 ...
- Android GUI之View测量
在上篇文章(http://www.cnblogs.com/jerehedu/p/4607599.html#gui)中,根据源码探索了View的绘制过程,过程有三个主要步骤,分别为测量.布局.绘制.系统 ...
- Android View 测量流程(Measure)完全解析
前言 上一篇文章,笔者主要讲述了DecorView以及ViewRootImpl相关的作用,这里回顾一下上一章所说的内容:DecorView是视图的顶级View,我们添加的布局文件是它的一个子布局,而V ...
- Android面试收集录12 View测量、布局及绘制原理
一.View绘制的流程框架 View的绘制是从上往下一层层迭代下来的.DecorView-->ViewGroup(--->ViewGroup)-->View ,按照这个流程从上往下, ...
- 在.c文件中调用cuda函数
在.c文件中调用cuda函数 2014-04-19 17:17 446人阅读 评论(0) 收藏 举报 分类: cuda编程(1) 版权声明:本文为博主原创文章,未经博主允许不得转载. 问题描述:假设在 ...
- 五十一、微信小程序云开发中的云函数
@Author:Runsen 暑假很长,明年就是找工作的时候了.这个时候必须比之前还要拼命. 百无聊赖,看过文档才发现,微信小程序已将云函数,对象存储和云数据库这些都搬了进来,由于前几天刚刚看过这些方 ...
- mysql 过程 的函数的区别是什么意思_Mysql中存储过程和函数的区别是什么
Mysql中存储过程和函数的区别是什么 发布时间:2020-12-03 10:01:49 来源:亿速云 阅读:105 作者:小新 这篇文章主要介绍了Mysql中存储过程和函数的区别是什么,具有一定借鉴 ...
- jQuery动画高级用法(上)——详解animation中的.queue()函数
如果你拿着一个疑问去找专业人士寻找答案,那么你的一个疑问会变成三个,因为他会用另外两个令你更加一头雾水的名词来解释你的这个疑问. 我想这是大多数,包括我在内,IT人在学习过程中碰到的最大问题.当你有一 ...
最新文章
- 论文笔记——PRUNING FILTERS FOR EFFICIENT CONVNETS
- 【AI初识境】深度学习模型中的Normalization,你懂了多少?
- css选择器中间的空格
- 升级python3后yum出现异常解决办法
- canvas笔记-closePath函数的使用(含例子)
- 科研人看过来!中国人工智能学会-华为MindSpore学术奖励基金发布通知
- 直播丨国产最强音:HTAP融合型分布式数据库EsgynDB架构详解
- Python3.x中Django-xadmin的添加
- XEON® Scalable-如何为虚拟化挑选合适的CPU
- JMETER 分布式踩过的坑及填坑方法
- 广义典型相关分析_一文教你掌握广义估计方程
- 用JAVA Excel API 实现对Excel表格的读写更新 (转)
- mysql语法_MySql实用技能,最常用的删除语法
- OpenDDS系列(1) —— OpenDDS 简介
- php编写出一个时钟,用HTML5实现一个时钟
- 在Centos 5.x或6.x上安装RHEL EPEL Repo
- 有木有收Java兼职的
- 牛客小白月赛58 B(暴力)C(思维)D(dp滚动数组优化)
- iframe标签中写html,html页面中嵌套iframe标签,我们可以用html中的iframe标签搞定
- mybatis对布尔类型的处理
热门文章
- 泛型推断类型不符合上限
- Ubuntu上通过android toolchain交叉编译Valgrind操作步骤
- 【视频】视频传输协议:RTSP、RTP、RTCP、RTMP、HTTP
- 【C++】google gtest 详解
- 全局声明宏定义_Rust语言:元编程,强大的宏系统,菜鸟到高手进阶的必经之路...
- SpringBoot复习:3(@Conditional)
- 实用c语言函数源码,C语言编写简单朗读小工具(有源码)
- linux重命名tar命令,linux常用操作指令4 —— 文件操作相关命令(mkdir、touch、rm、mv、cp、cat 、 find 、tar、chmod)...
- 软件工程实训有必要吗_人工智能专业值得读吗?就业如何?
- 录制短视频的录制按钮边框计时效果