onMeasure

自定义View之onMeasure() 可以说重载onMeasure(),onLayout(),onDraw()三个函数构建了自定义View的外观形象。再加上onTouchEvent()等重载视图的行为,可以构建任何我们需要的可感知到的自定义View。 本节我们探索自定义View中onMeasure()起到了什么样的作用,题外要插的一句是,Activity框架,View框架中大量的on函数基本上都应用到了Template模式,掌握这一 阅读详情
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
	setMeasuredDimension(measureWidth(widthMeasureSpec),
			measureHeight(heightMeasureSpec));
}
// The width of the view, honoring(履行) constraints(约束) from measureSpec
private int measureWidth(int measureSpec) {
	int result = 0;
	int specMode = MeasureSpec.getMode(measureSpec);
	int specSize = MeasureSpec.getSize(measureSpec);
	if (specMode == MeasureSpec.EXACTLY) {
		// We were told how big to be
		result = specSize;
	} else {
		// Measure the text
		result = (int) mTextPaint.measureText(mText) + getPaddingLeft()
				+ getPaddingRight();
		if (specMode == MeasureSpec.AT_MOST) {
			// Respect AT_MOST value if that was what is called for by measureSpec
			result = Math.min(result, specSize); // 不能超过specSize
		}
	}
	return result;
}

思路是这样的:我们首先判断是不是EXACTLY模式,如果是,那就可以直接设置值了,如果不是,我们先按照UNSPECIFIED模式处理,让子布局得到自己想要的最大值,然后判断是否是AT_MOST模式,来做最后的限制。

1、MeasureSpec有3种模式分别是UNSPECIFIED、 EXACTLY、AT_MOST
如果是AT_MOST,specSize 代表的是最大可获得的空间; 
如果是EXACTLY,specSize 代表的是精确的尺寸; 
如果是UNSPECIFIED,对于控件尺寸来说,没有任何参考意义。

2、这些模式和我们平时设置的layout参数fill_parent, wrap_content有什么关系呢?
当设置width或height为fill_parent时,容器在布局时调用子 view的measure方法传入的模式是EXACTLY,因为子view会占据剩余容器的空间,所以它大小是确定的。
当设置为wrap_content时,容器传进去的是AT_MOST, 表示子view的大小最多是多少,这样子view会根据这个上限来设置自己的尺寸。
当子view的大小设置为精确值时,容器传入的是EXACTLY,
而MeasureSpec的UNSPECIFIED模式目前还没有发现在什么情况下使用。 

iew的onMeasure方法默认行为是当模式为UNSPECIFIED时,设置尺寸为mMinWidth(通常为0)或者背景drawable的最小尺寸,当模式为EXACTLY或者AT_MOST时,尺寸设置为传入的MeasureSpec的大小。 

有个观念需要纠正的是,fill_parent应该是子view会占据剩下容器的空间,而不会覆盖前面已布局好的其他view空间,当然后面布局子 view就没有空间给分配了,所以fill_parent属性对布局顺序很重要。以前所想的是把所有容器的空间都占满了,难怪google在2.2版本里把fill_parent的名字改为match_parent.

通过FrameLayout分析onMeasure 阅读详情

相关推荐

VS2019集成AddressSanitizer:C++内存错误检测实战指南

在C++开发中,内存管理是核心挑战之一,涉及堆、栈和全局变量的分配与释放。其原理在于程序运行时对内存地址的访问必须严格遵循分配边界和生命周期规则,否则会导致缓冲区溢出、释放后使用等严重错误。这类问题的技术价值在于直接影响程序的稳定性、安全性和性能,是高质量软件必须攻克的基础难题。应用场景广泛,从嵌入式系统到大型服务器软件,都需要可靠的内存错误检测机制。AddressSanitizer(ASan)作为一种编译时插桩技术,通过影子内存和运行时检查,能精准定位堆缓冲区溢出、释放后使用等隐蔽错误。本文以Visual

weixin_34356310的博客 279

Android View绘制onMeasure流程

onMeasure()方法的作用就是测量View需要多大的空间,就是宽和高。大家可能会有这样的疑问。就是我在xml文件中已经指定好了某个View宽高尺寸了,那么自定义View时不就没有必要再次获取宽高并设置宽高吗?onMeasure方法不就没有了吗?其实不然,我们就知道,在xml布局文件中,我们的layout_width和layout_height参数可以不用写具体的尺寸,而是wrap_content或者是match_parent。

weixin_43700867的博客 1385

产品失效你必须要知道的概念---MTBF、MTTF和FIT

如果我们想知道该电路在10年后仍能正常工作的几率,按照前面例子的相同计算步骤,结果将是90.3%。例如,假设一个TDK电容器的MTBF为6918年(16.5失效时间间隔,FIT),这并不意味着该电容器能持续这么久(显然,没有人能够对部件进行这么长时间的测试)。综上,MTBF和MTTF是用来描述系统或设备级别的故障间隔时间,而FIT是用来描述某单一器件的失效率的单位。MTBF和MTTF使用相同的计算方法,但MTBF用于可维修的产品,而MTTF用于不可维修或维修成本过高的产品。

weixin_49761275的博客 3834

03. onMeasure介绍

简书:http://www.jianshu.com/u/92a2412be53e邮箱:934137388@qq.com掘金:https://juejin.im/user/499639464759898泡在网上的日子:http://www.jcodecraeer.com/member/content_list.php?

qq_35829566的博客 964

matlab 求解多项式的根 四种方法

matlab 求解多项式的根 四种方法 方法一 %多项式求根函数roots p=[1,-3,1];%建立多项式系数向量p x=roots(p)%求多项式的根 x=-5:0.1:5;%步长为0.1 y1=x.*x-3*x+1;%构建一个函数 y2=zeros(size(x));%产生一个与x同大小的零向量 plot(x,y1,x,y2); 方法二 %利用函数fzero f=@(x)x*x-3*x+1; x1=fzero(f,0.5) x2=fzero(f,2.5) 方法三 %利用f

weixin_57038822的博客 1万+

SECS/GEM协议库及开源代码

以下是在开发SECS/GEM协议过程中,在网络上搜集协议实现资源,希望对SECS/GEM协议感兴趣的同学能有所帮助。 开源代码 freesecs FREESECS 是一个开源的SEMI SECS协议库,采用C++语言实现,可运行于Linux, MacOS X, NetBSD。 实现协议:E37.1、E5 开源地址:freesecs download | SourceForge.net 下载地址:https://download.youkuaiyun.com/download/BT_LEO/24305429

码农的历程 9944

LinearLayout onMeasure源码阅读

onMeasure()方法解读 measureWithLargestChild 作用 : 该属性为true的时候, 所有带权重的子元素都会具有最大子元素的最小尺寸; 且只有当父view布局方向上的宽度或高度为wrap_content才有效登录后复制 @Override protected void onMeasu...

weixin_37046340的博客 112

ALTERA MAX10 FPGA 串口远程升级实战:从原理到烧录的避坑指南

本文详细解析了ALTERA MAX10 FPGA如何通过串口实现远程升级。文章从工程师实战经验出发,深入剖析了MAX10片内Flash的双镜像备份原理、CONFIG_SEL引脚启动机制,并重点介绍了使用On-Chip Flash IP核进行擦写操作的核心流程。同时,提供了从Quartus工程配置、RPD文件生成、串口协议设计到驱动代码编写的完整避坑指南,旨在帮助开发者稳定、高效地完成远程升级功能部署。

weixin_29197699的博客 273

Android onMeasure过程分析

其实本来一次就可以了,但是,performTraversals 这一段代码,判断出来Configuration 变化了,导致updatedConfiguration = true, 然后 // If the pending {@link MergedConfiguration} handed back from // {@link ...

男儿不展风云志,空有天生八尺躯 890

ArcGIS-裁剪遥感影像及dem图像

6、选择【工具箱】-【数据管理工具】-【栅格】-【裁剪】。在【输入栅格】里选择要裁剪的dem,在【输出范围】里选择刚创建的裁剪范围。选择一个输出路径,其他参数保存默认。2、起一个名称,要素类型选择【面】。点击【编辑】选择与要裁剪的dem一致的地理坐标系。1、创建需要裁剪区域的面层shp,右击选择【新建】-【shapefile】3、点击编辑器,选择开始编辑。4、选择【裁剪范围】,点击确定。5、画出想要裁剪的范围并保存。

siwenaiyou的博客 1万+

【ACP】2025-最新-疑难题解析- 练习一汇总

他们对您的方案比较满意,作为一个特别看重用户体验的创业公司,他们有一个比较担心的问题:在后端云服务器 ECS 实例相对空闲时,可能会触发减少 ECS 实例的伸缩活动,这时候运行在即将移出伸缩组的 ECS 实例上的应用会被终止,那么发起这些应用的用户的体验会变差。:在使用阿里云的负载均衡 SLB 实例时,做了如下健康检查的配置:响应超时时间为 5 秒,健康检查间隔为 2 秒,不健康阈值为 3,健康阈值为 3,即对于确认一个后端服务器 ECS 实例是健康的,需要连续三次得到正常响应。以下说法哪一项是正确的?

jundao1997的专栏 326

onMeasure()、onLayout()

前言:   自定义控件的三大方法: 测量: onMeasure(): 测量自己的大小,为正式布局提供建议 布局: onLayout(): 使用layout()函数对所有子控件布局 绘制: onDraw(): 根据布局的位置绘图 onDraw() 里面是绘制的操作,可以看下其他的文章,下面来了解onMeasure()和onLayout()方法。 一、o...

疾风剑豪 1378

threadX的USBX的初始化和解初始化的分析。

tx_application_define的最后会使用tx_byte_pool_create创建usb线程的内存空间“ux_device_app_byte_pool”,再创建usb线程,也就是执行。主要就是创建了线程,也就是第3个参数app_ux_device_thread_entry,这个参数内是MX_USB_Device_Init,也就是USB底层初始化。进来的参数只有1个,是memory_ptr,这个就是创建的usb线程空间“ux_device_app_byte_pool”

qq_31885403的博客 647

Android onMeasure()测量流程解析

Android onMeasure()测量流程解析 文章目录Android onMeasure()测量流程解析前言组件测量的那些结论一、MeasureSpec:测量规则二、查看测量流程源码2.1 查看ViewRootImpl的PerformTraveals()方法2.2 View类的默认onMeasure()方法2.3 从FrameLayout的onMeasure()方法了解自定义ViewGroup的测量行为 前言 众所周知,Android 中组件显示到屏幕上需要经历测量、布局、绘制三个阶段,我们

weixin_43864176的博客 1890

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

关于定义布局OnMeasure 的总结

: measure过程分析 因为DecorView实际上是派生自FrameLayout的类,也即一个ViewGroup实例,该ViewGroup内部的ContentViews又是一个ViewGroup实例,依次内嵌View或ViewGroup形成一个View树。所以measure函数的作用是为整个View树计算实际的大小,设置每个View对象的布局大小(“窗口”大小)。实际对应属性

u013598111的专栏 549

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

自定义ViewGroup为什么要重写onMeasure方法

为什么要重写onMeasure方法

qq_44874625的博客 452

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

onMeasure实例分析

上面这个两个视图是Android API中没有给出来的但在来电接听和闹钟被使用到的一个widget视图——GlowPadView.java 我们通过源码来看看这个View的大小是怎么通过onMeasure来控制的。 @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {

u012604322的专栏 2762

【Android】自定义view之onMeasure

1 onMeasure什么时候会被调用 onMeasure方法的作用是测量控件的大小,当我们创建一个View(执行构造方法)的时候不需要测量控件的大小,只有将这个view放入一个容器(父控件)中的时候才需要测量,而这个测量方法就是父控件唤起调用的。当控件的父控件要放置该控件的时候,父控件会调用子控件的onMeasure方法询问子控件:“你有多大的尺寸,我要给你多大的地方才能容纳你?”,然后传入两个参数(widthMeasureSpec和heightMeasureSpec),这两个参数就是父控件告诉子控件可获

sinat_36955332的博客 1863

Android的onMeasure方法

在Android开发中,当Android原生控件不能满足我们的需求的时候,就需要自定义View。View在屏幕上绘制出来先要经过measure(计算)和layout(布局)。   什么时候调用onMeasure方法?   当子View的父控件要放置该View的时候,父控件会传递两个参数给View——widthMeasureSpec和heightMeasureSpec。这两个参数是Vie

青春的光与影 1635

关于RelativeLayout中onMeasure()的理解

onMeasure的大体步骤如图: 个人认为前三步是主体: 第一步: sortChildren() if (mDirtyHierarchy) { mDirtyHierarchy = false; sortChildren(); }       判断RelativeLayout的布局层次是否被打乱,即是否有子view被

Sdtin的博客 1014

简单理解View的onMeasure过程

View的绘制需要经过Measure、Layout、Draw这三个流程。很多朋友在自定义View的时候,特别是对Measure过程不能十分理解,这里结合Android的一些源码和资料来简单说明。   首先来看一下View的measure方法:   public final void measure(int widthMeasureSpec, int heightMeasureSpec) {

lovejavasman的博客 2013

android的onmeasure,Android开发实践:为什么要继承onMeasure()

Android开发中偶尔会用到自定义View,一般情况下,自定义View都需要继承View类的onMeasure方法,那么,为什么要继承onMeasure()函数呢?什么情况下要继承onMeasure()?系统默认的onMeasure()函数行为是怎样的 ?本文就探究探究这些问题。首先,我们写一个自定义View,直接调用系统默认的onMeasure函数,看看会是怎样的现象:packagecom....

weixin_31458459的博客 225

理解onMeasure

Android系统调用onMeasure来定义view的大小,很长时间理解不是很透彻,今天花了些时间打日志来理解它。总结如下。         1. widthMeasureSpec和heightMeasureSpec这两个值是android:layout_width="200dp" android:layout_height="80dp"来定义的,它由两部分构成,可通过int specMode

hjj0212的专栏 1万+

onMeasure方法简述

Measure的中文意思就是测量。所以它的作用就是测量View的大小。 当控件的父元素正要放置该控件时调用.父元素会问子控件一个问题,“你想要用多大地方啊?”,然后传入两个参数——宽详细测量值(widthMeasureSpec)和高详细测量值(heightMeasureSpec)。这两个参数指明控件可获得的空间以及关于这个空间描述的元数据,可以把详细测量值理解为视图View想要的大小说明。 对

w_dongua的专栏 879

关于onMeasure

关于onMeasure 1、onMeasure方法在控件的父元素正要放置它的子控件时调用。它会问一个问题,“你想要用多大地方啊?”,然后传入两个参数——widthMeasureSpec 和heightMeasureSpec。它们指明控件可获得的空间以及关于这个空间描述的元数据。

走自己的路 4997

Android 自定义view onMeasure() 方法剖析

接着上一篇自定义view 相关的,揭秘 Android Graphics2D 实现动态效果之——invalidate() 内容的介绍,这一篇主要介绍下自定义view 中的 onMeasure()方法的使用。 在介绍前,先简单回顾下自定义view 中的 onDraw()方法,该方法主要是将图形通过Paint画在Canvas上,View 上的所有内容都最终显示在Canvas 对象上,但这仅...

LXB-89 661
上一篇: requestLayout
下一篇: AsyncTask
dcking
博客等级 码龄18年 8粉丝 52原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值