您当前所在位置: > 实用问答

android 在onCreate中获得控件的大小

时间:2018-07-25 23:50:58  来源:  作者:网络
Game234问答中心有网友提出了一个比较有代表性的问题【android 在onCreate中获得控件的大小】,小编觉得可能对其他网友也有帮助,所以将此问答整理出来了,希望对您有帮助。

小编为您搜罗的答案:

这个方法并不是适合所有场景,这个方法获取的宽度是minWidth参数设置的大小和background指定背景宽度,这两个宽度的最大值,高也是如此,也就是说如果View的xml中没有两个参数中的其中一项,那么这个方法测量的宽高也是为0的,这个方法测量的并不是获取xml中设置的android:layout_height android:layout_width的值,为什么这么说了,看源码:
imageView.measure(w, h); -->调用View的measure方法-->onMeasure()方法,onMeasure源码:

protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {

setMeasuredDimension(getDefaultSize(getSuggestedMinimumWidth(),widthMeasureSpec),

getDefaultSize(getSuggestedMinimumHeight(), heightMeasureSpec));

}
onMeasure->setMeasuredDimension()->getDefaultSize()>getSuggestedMinimumHeight()
这个是源码onMeasure中方法调用过程,逆向分析方法源码:
getSuggestedMinimumHeight():
protected int getSuggestedMinimumHeight() {

return (mBackground == null) ? mMinHeight : max(mMinHeight,mBackground.getMinimumHeight());

}
如果背景为空,那么就取mMinHeight的值,如果背景不为空就取max(mMinHeight,mBackground.getMinimumHeight())背景高度和mMinHeight最大值
接下来获取建议值完毕后查看getDefaultSize的源码:

//第一个参数是getSuggestedMinimumHeight方法获取的建议值 第二个参数是系统计算得出的宽高规格是MeasureSpec值,也就是measure(w,h)中的w或者h,
public static int getDefaultSize(int size, int measureSpec) {

int result = size;
//int w = View.MeasureSpec.makeMeasureSpec(0,View.MeasureSpec.UNSPECIFIED);

//规格模式不就是上面的:View.MeasureSpec.UNSPECIFIED
int specMode = MeasureSpec.getMode(measureSpec);
//规格模式不就是上面的 0
int specSize = MeasureSpec.getSize(measureSpec);

switch (specMode) {//这里是什么了?View.MeasureSpec.UNSPECIFIED理解吧

case MeasureSpec.UNSPECIFIED://
//result就是getDefaultSize要返回的值,根据switch判读getDefaultSize返回的是什么了
//不就是方法的第一个形参吗,这个形参不就是宽高建议值吗
//也就是max(mMinHeight,mBackground.getMinimumHeight());
result = size;
break;
case MeasureSpec.AT_MOST:
case MeasureSpec.EXACTLY:

result = specSize;

break;

}
return result;
}

好了,现在就是setMeasuredDimension方法了,源码:
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;

}

mMeasuredWidth = measuredWidth;//这个是这个方法要注意的值

mMeasuredHeight = measuredHeight;//同上

mPrivateFlags |= PFLAG_MEASURED_DIMENSION_SET;

}
这个代码好长啊,好多东西,要关注的就是注释的代码,上面要注意的两行代码有什么用了
你再看一个方法的源码你就是知道了,getMeasureWidth()与getMeasureHeight():
public final int getMeasuredWidth() {

return mMeasuredWidth & MEASURED_SIZE_MASK;

}
public final int getMeasuredHeight() {

return mMeasuredHeight & MEASURED_SIZE_MASK;

}
这两个方法不就是返回调用measure测量的宽高吗?不就是上面两行注意的代码的值吗
现在回答你的问题:
这是代码,我想问makeMeasureSpec(0,View.MeasureSpec.UNSPECIFIED)中的一个参数为什么是0,什么意思?

第一个参数本应该是系统测量该View后得到的规格值(MeasureSpec),本来这个measure是由系统测量完宽高后自动调用,我们这里只是做了系统即将要做的事情而已,那么这个参数为什么是0了,既然我们要通过这个方法测量View的宽高,不就是怕系统还没有自动调用这个方法前调用getMeasureWidth/Height方法而没法获得导致取值为0 ,也就是我们默认调用这个方法就是系统没有对该View绘制,就直接调用了measure方法,所以也就是宽高为0咯,其实这
makeMeasureSpec的第一个参数设置什么都无所谓啦,因为最后取得值也不是第一个参数设置的值,我觉得我的表达好绕啊,不过要是你对measure的绘制机制的源码很熟悉的话,应该是没问题的,这里我推荐你去看(谷歌的小弟)csdn的博客里面有完整的源码分析,你要以前看的不是很懂,去看看他写的博客应该会有点启发

希望以上答案对您您所帮助,另外此问题所属游戏为:大小,游戏库地址://www.91hq.net/phonegame/20164/

可能您对者【大小】游戏还不是很了解,小编在此为您简短的介绍一下吧。【大小】简介如下:       《大小》是一款比较左面左右两边出现数字大小的游戏。判断哪一边打,或者还是相等。当每正确回答10个问题的时候,题目就会加难。回答错一道题游戏就会结束。你是否都能回答正确呢。

相关下载

玩家评论

谷歌Chrome浏览器Windows10版新增支持媒体播放控件_flag

原标题:谷歌Chrome浏览器Windows 10版新增支持媒体播放控件 IT之家 1月1日消息 谷歌一直在研究Chrome浏览器的全局媒体控件功能,该功能可让你控制在详情>>

阅读: 1
日期: 2020-01-01
如何在WinCC中设置报警控件

WinCC中通过使用报警控件,在组态过程中可以获得高度的灵活性,所希望显示的消息窗口、消息行和消息块均可在图形编辑器中进行组态。攻略对象电脑WinCC软件步骤分解1打开WinCC软详情>>

阅读: 21
日期: 2019-06-27
winform用户控件的使用(1)

在开发winform桌面应用程序的时候,经常会批量的使用几种控件的组合来开发,这就用到了winform的用户控件,今天小编就来通过一个小例子来演示一下用户控件的使用,包括从创建到使用详情>>

阅读: 11
日期: 2019-06-24
word中如何使用日期控件

控件是我们经常使用的项目之一,那么如何设置日期控件呢?现在就自己的操作过程跟大家交流一番,同时分享操作截图,希望对你有所帮助。攻略对象word2010步骤分解1首先启动word2010,详情>>

阅读: 6
日期: 2019-06-23
怎样在word2007中插入日历选择控件

当填文档模板时,填写日期的格式总是不一样,如果在word中也有日期选择的界面就好了,不要着急,word中真的有哦攻略对象一台安装有windows操作系统的电脑安装了word2007步骤分解1打详情>>

阅读: 5
日期: 2019-06-22
winform用户控件的使用(2)

今天小编来使用一个小例子来讲解一下winform中的用户控件的创建以及使用。攻略对象电脑一台VS2010步骤分解1首先小编这里创建一个简单的winform桌面应用程序,如下图:2然后小编详情>>

阅读: 1
日期: 2019-06-21
Word快速添加控件技巧

因为Word文档不能像Excel文档那样通过形状或图片直接指定宏,所以经常需要用到控件来操控代码,做这些的前提条件就是得会插入控件。攻略对象Word本教程以Word2013为例步详情>>

阅读: 6
日期: 2019-06-21
点聚weboffice控件如何打开本地文件

点聚weboffice控件如何打开本地文件攻略对象weboffice步骤分解11.实现把object对象放到页面中的方法代码22.实现修改的初始化方法代码33.实现上传到远程服务器的方法代码44.详情>>

阅读: 5
日期: 2019-06-19
中国银行安全控件升级了,如何卸载原来所有的控件...

Game234问答中心有网友提出了一个比较有代表性的问题【中国银行安全控件升级了,如何卸载原来所有的控件...】,【中国银行安全控件升级了,如何卸载原来所有的控件...】具体问题如下:我在添加与删除那详情>>

阅读: 10
日期: 2019-04-14
支付宝安全控件pc版v5.1.0.3754

游戏类型:系统安全文件大小:6.97MB软件语言:简体中文运营:未知软件授权:免费版应用平台:WinXP/Vista/Win7/Win8/Win8.1/Win10安全认证:支付宝安全控件是为了提详情>>

阅读: 0
日期: 2019-04-03
牛牛截图控件1.0正式版下载

游戏类型:图像处理文件大小:961.9KB软件语言:简体中文运营:软件授权:免费版应用平台:Win7/Vista/Win2003/WinXP安全认证:牛牛截图控件官方正式版下载版本:v1.0&n详情>>

阅读: 3
日期: 2019-04-03
唯品会用户密码安全控件官方正式版下载

游戏类型:网络应用文件大小:3.4M软件语言:简体中文运营:软件授权:免费版应用平台:WinXP/Vista/Win7/Win8安全认证: 唯品会用户密码安全控件官方正式版下载版本:v详情>>

阅读: 3
日期: 2019-04-03
《人渣》SCUM隐藏控件及功能介绍 隐藏控件有什么用

1>人渣SCUM隐藏控件有什么用?怎么使用?一些玩家对游戏中这些隐藏控件不是很了解,这里给大家带来了人渣SCUM隐藏控件及功能介绍,感兴趣的同学一起看下文中介绍吧。详情>>

阅读: 3
日期: 2018-09-15
QQ炫舞无法找到ID为brandBing0的控件,请检查客户端文件是否完整并尝试重新登录。

小编为您搜罗的答案:你之前有没有更新中二灰度区,之后没更好就退出了这个是文件不完整导致的,我是之前进入灰度没有更好你应该也是进行了什么操作中途退出导致文件丢失了的在我的电脑里搜索炫舞的文件,进行全盘清详情>>

阅读: 2
日期: 2018-08-23
时间控件位置怎么放,在浮层上一点击输入框控件不在下面显示,位置跑上面了

小编为您搜罗的答案:你的时间控件放在这里下面是个简单例子,你点这可以让文本框显示指定文字同时关闭这个浮动框functiongetLeft(o){varl=o.offs详情>>

阅读: 0
日期: 2018-08-23
我也遇到玩梦幻诛仙 打开有后出现 创建htmlview控件失败 怎么...

小编为您搜罗的答案:更新下电脑的补丁还有显卡声卡什么的驱动问题最后扫描下电脑,看看是不是中毒了什么的。祝你早日玩上游戏!详情>>

阅读: 2
日期: 2018-08-13
Facebook网页版支持上传和浏览3D控件

原标题:Facebook网页版支持上传和浏览3D控件这家社交媒体巨头正在拥抱一种新型的内容,可以将文字、照片和视频一同进行上传。您可以直接将以行详情>>

阅读: 11
日期: 2018-08-02
VR游戏《Moss》更新支持Windows MR头显改进Vive控件

《Moss》是一款备受赞誉的VR冒险游戏,已经在SteamVR上进行了更新,官方支持WindowsMR头显和一系列新的控制选项,使游戏更容易与Vive控制器一起玩。《Moss》以前仅详情>>

阅读: 6
日期: 2018-08-01
今天玩英雄联盟,进游戏,刚到安全控件启动完成,就突然报错,提示...

小编为您搜罗的答案:系统程序错误~~你打开360或者电脑管家里面到卸载软件里面可以看到这个文件的~~这是电脑系统编程文件~~~不是游戏的问题·~~你是不是误删了C盘里面的神马东西???建议重详情>>

阅读: 1
日期: 2018-07-22
《堡垒之夜》充值卡控件解决方法介绍 卡控件怎么办

  《堡垒之夜》玩家在充值时会遇到卡控件的情况,需要下载相关控件才让支付,这个问题让很多玩家望而却步,下面笔者为大家带啦《堡垒之夜》卡控件的解决方法。  大家使用银详情>>

阅读: 10
日期: 2018-07-19
《堡垒之夜》充值安全控件无响应问题解决方法 安全控件无响应怎么办

  《堡垒之夜》在充值时不少玩家都遇到了在输入密码的时候,安全控件没有响应导致交易不能正常进行下去,大家知道怎么解决这个问题吗?下面请看由“奔跑在撸地”分享的《堡垒详情>>

阅读: 3
日期: 2018-04-14
精彩推荐
相关专题