getMeasuredWidth和getWidth的区别

View的getWidth()和getMeasuredWidth()有什么区别吗?

View的高宽是由View本身和Parent容器共同决定的。
getMeasuredWidth()getWidth()分别对应于视图绘制的measure和layout阶段。getMeasuredWidth()获取的是View原始的大小,也就是这个View在XML文件中配置或者是代码中设置的大小。getWidth()获取的是这个View最终显示的大小,这个大小有可能等于原始的大小,也有可能不相等。比如说,在父布局的onLayout()方法或者该View的onDraw()方法里调用measure(0, 0),二者的结果可能会不同(measure中的参数可以自己定义)。

getWidth()

/*** Return the width of the your view.* @return The width of your view, in pixels.*/@ViewDebug.ExportedProperty(category = "layout")public final int getWidth() {return mRight - mLeft;}

从源码上看,getWidth()是根据mRightmLeft之间的差值计算出来的,需要在布局之后才能确定它们的坐标,也就是说布局后在onLayout()方法里才能调用getWidth()来获取。因此,getWidth()获取的宽度是在View设定好布局后整个View的宽度。

getMeasuredWidth()

/*** Like {@link #getMeasuredWidthAndState()}, but only returns the* raw width component (that is the result is masked by* {@link #MEASURED_SIZE_MASK}).** @return The raw measured width of this view.*/public final int getMeasuredWidth() {return mMeasuredWidth & MEASURED_SIZE_MASK;}

从源码上看,getMeasuredWidth()获取的是mMeasuredWidth的这个值。这个值是一个8位的十六进制的数字,高两位表示的是这个measure阶段的Mode的值,具体可以查看MeasureSpec的原理。这里mMeasuredWidth & MEASURED_SIZE_MASK表示的是测量阶段结束之后,View真实的值。而且这个值会在调用了setMeasuredDimensionRaw()函数之后会被设置。所以getMeasuredWidth()的值是measure阶段结束之后得到的View的原始的值。

    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {setMeasuredDimension(getDefaultSize(getSuggestedMinimumWidth(), widthMeasureSpec),getDefaultSize(getSuggestedMinimumHeight(), heightMeasureSpec));}protected final void setMeasuredDimension(int measuredWidth, int measuredHeight) {boolean optical = isLayoutModeOptical(this);if (optical != isLayoutModeOptical(mParent)) {Insets insets = getOpticalInsets();int opticalWidth  = insets.left + insets.right;int opticalHeight = insets.top  + insets.bottom;measuredWidth  += optical ? opticalWidth  : -opticalWidth;measuredHeight += optical ? opticalHeight : -opticalHeight;}setMeasuredDimensionRaw(measuredWidth, measuredHeight);}private void setMeasuredDimensionRaw(int measuredWidth, int measuredHeight) {mMeasuredWidth = measuredWidth;mMeasuredHeight = measuredHeight;mPrivateFlags |= PFLAG_MEASURED_DIMENSION_SET;}

总结一下,getMeasuredWidth是measure阶段获得的View的原始宽度,getWidth是layout阶段完成后,其在父容器中所占的最终宽度

如何在onCreate中拿到View的宽度和高度?

在onCreate()中获取View的高宽有三种方法:

  1. View.post(runnable)
view.post(new Runnable() {@Overridepublic void run() {int width = view.getWidth();int measuredWidth = view.getMeasuredWidth();Log.i(TAG, "width: " + width);Log.i(TAG, "measuredWidth: " + measuredWidth);}});

利用Handler通信机制,发送一个Runnable到MessageQueue中,当View布局处理完成时,自动发送消息,通知UI进程。借此机制,巧妙获取View的高宽属性,代码简洁,相比ViewTreeObserver监听处理,还不需要手动移除观察者监听事件。

  1. ViewTreeObserver.addOnGlobalLayoutListener()

监听View的onLayout()绘制过程,一旦layout触发变化,立即回调onLayoutChange方法。
注意,使用完也要主要调用removeOnGlobalListener()方法移除监听事件。避免后续每一次发生全局View变化均触发该事件,影响性能。

ViewTreeObserver vto = view.getViewTreeObserver();vto.addOnGlobalLayoutListener(new OnGlobalLayoutListener() {@Overridepublic void onGlobalLayout() {view.getViewTreeObserver().removeGlobalOnLayoutListener(this);Log.i(TAG, "width: " + view.getWidth());Log.i(TAG, "height: " + view.getHeight());}});
  1. View.measure(int widthMeasureSpec, int heightMeasureSpec)

除了在onCreate()中获得View的高宽,还可以在Activity的onWindowFocusChanged() 方法中获得高宽。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/277377.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

php图片地址参数错误,图片上传时一直显示请求地址错误怎么办

1、出现“请求地址错误”的直接原因:图中$action null2.根本原因:url美化那一节课程,去掉 index.php的.htaccess 文件修改的时候,没有按照老师的来写,所以美化url以后获取不到地址栏参数,导致$action值为n…

C#写的WebServices可运行于树莓派

阅读目录 Raspkate - 基于.NET的可运行于树莓派的轻量型Web服务器Raspkate项目演示回到目录Raspkate - 基于.NET的可运行于树莓派的轻量型Web服务器 最近在业余时间玩玩树莓派,刚开始的时候在树莓派里写一些基于wiringPi库的C语言程序来控制树莓派的GPIO引脚&#x…

[导入]Ms XmlDom 异步装载Xml文件

Ms XmlDom 异步装载Xml文件文章来源:http://blog.csdn.net/net_lover/archive/2004/07/07/36015.aspx 转载于:https://www.cnblogs.com/zhaoxiaoyang2/archive/2004/07/07/816151.html

Django的View(视图)

Django的View(视图) 一个视图函数(类),简称视图,是一个简单的Python 函数(类),它接受Web请求并且返回Web响应。 响应可以是一张网页的HTML内容,一个重定向&am…

高质量的期货研究报告去哪里找?

作者:虎虎的小尾巴链接:https://www.zhihu.com/question/25331621/answer/205439281来源:知乎著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。这是个好问题,我曾经或者直到现在我也一直在追求高…

oracle中偏移,怎么对相同的坐标点偏移?

上面说的第三步必须保证每个点不能重复分配,有些难度,还是用过程代码吧。CREATE TABLE t_offset asselect 1 id,1.001 x,1.002 y, 10 mark from dualunion allselect 2011 id,1.001 x,1.012 y, 31 mark from dualunion allselect 3…

设计模式之--原型模式

1.原型模式定义 原型模式非常简单,定义如下: 用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象 2.通用类图 原型模式的核心是实现Cloneable接口,此接口为JDK提供的一个标识接口,只有实现了此接口的类才…

搜索目录里所有文件(包括子目录)

搜索目录里所有文件(包括子目录) 资料来源:http://www.cnblogs.com/jjwwww/archive/2004/09/04/39559.aspx 用到两个函数ParseDirectory 和CreatePathListvoidParseDirectory(stringpath, stringfilter) { strin…

一张图理解buffer与cache

转载于:https://blog.51cto.com/11193863/2169166

oracle服务器不识别tc服务,记一次ORACLE无法启动登陆事故

打开XSHELL 登陆ORACLE用户1.sqlplus scott/scott 提示登陆失败2.sqplus / as sysdba 启动数据库提示3.查找日志操作日志:$ORACLE_HOME/startup.log启动日志:$ORACLE_BASE/diag/rdbms/ora11g/ora11g/trace/alert_ora11g.log (ora11g为SID值)启动日志如果…

重构(Refactoring)技巧读书笔记 之二

重构&#xff08;Refactoring&#xff09;技巧读书笔记 之二<?xml:namespace prefix o ns "urn:schemas-microsoft-com:office:office" />General Refactoring Tips, Part 2本文继续《重构&#xff08;Refactoring&#xff09;技巧读书笔记 之一》&#xff…

史上最全的Angular.js 的学习资源

Angular.js 的一些学习资源 基础 官方&#xff1a; http://docs.angularjs.org angularjs官方网站已被墙&#xff0c;可看 http://www.ngnice.com/&#xff1b;官方zip下载包 http://best.factj.com/dolymood/angular-packages&#xff0c;已增加docs服务&#xff0c;输入地址即…

BMP位图之8位位图(三)

起始结构 typedef struct tagBITMAPFILEHEADER { WORD bfType; //类型名&#xff0c;字符串“BM”&#xff0c; DWORD bfSize; //文件大小 WORD bfReserved1; //保留字 WORD bfReserved2; //保留字 DWORD bfOffBits; //实际位图数据的偏移字节数&#xff0c;即前三个部分长度之…

DNN 汉化中的问题????

今天看到了一份已经汉化过的DNN但是比较奇怪&#xff0c;当第一次运行后我所指定的新数据库中并没有添加新的内容&#xff0c;但是网站上的确是已经汉化过了的&#xff0c;不知道它把汉化的内容放到了哪里&#xff1f;&#xff1f;&#xff1f; 另外他所汉化界面的地方&#x…

php 打印对象详细信息,php打印显示数组与对象的函数详解

php打印显示数组与对象的函数详解发布于 2014-11-17 18:55:49 | 699 次阅读 | 评论: 0 | 来源: 网友投递PHP开源脚本语言PHP(外文名: Hypertext Preprocessor&#xff0c;中文名&#xff1a;“超文本预处理器”)是一种通用开源脚本语言。语法吸收了C语言、Java和Perl的特点&…

ios开发-调用系统自带手势

在 iPhone 或 iPad 的开发中&#xff0c;除了用 touchesBegan / touchesMoved / touchesEnded 这组方法来控制使用者的手指触控外&#xff0c;也可以用 UIGestureRecognizer 的衍生类別来进行判断。用 UIGestureRecognizer 的好处在于有现成的手势&#xff0c;开发者不用自己计…

Node.js 事件循环

Node.js 事件循环 Node.js 是单进程单线程应用程序&#xff0c;但是因为 V8 引擎提供的异步执行回调接口&#xff0c;通过这些接口可以处理大量的并发&#xff0c;所以性能非常高。 Node.js 几乎每一个 API 都是支持回调函数的。 Node.js 基本上所有的事件机制都是用设计模式中…

全国翻译专业资格(水平)考试

http://www.spta.gov.cn/moreksxx.jsp?lmCodeA02010205转载于:https://www.cnblogs.com/Danilo/archive/2004/10/31/58821.html

linux文件句柄,【LINUX】使用lsof处理文件恢复、句柄以及空间释放问题

曾经在生产上遇到过一个df 和 du出现的结果不一致的问题&#xff0c;为了排查到底是哪个进程占用了文件句柄&#xff0c;导致空间未释放&#xff0c;首先在linux上面&#xff0c;一切皆文件&#xff0c;这个问题可以使用lsof这个BT的命令来处理(这个哈还可以来查询文件句柄泄露…

android天气查询(二)之网络json数据的获取

前面一篇文章介绍了如何使用ksoap获取天气信息&#xff0c;但是使用的网络资源受到了限制&#xff0c;所以我们这里会采用第二种方法&#xff0c;可以无限制的获取。http://m.weather.com.cn/data/101010100.html 但是对应的101010100(北京)我们怎么获取呢&#xff0c;还有就是…