全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

Android View.onMeasure方法详解及实例

Android View.onMeasure方法详解及实例

View在屏幕上显示出来要先经过measure(计算)和layout(布局).

1、什么时候调用onMeasure方法?

当控件的父元素正要放置该控件时调用.父元素会问子控件一个问题,“你想要用多大地方啊?”,然后传入两个参数——widthMeasureSpec和heightMeasureSpec.

这两个参数指明控件可获得的空间以及关于这个空间描述的元数据.

更好的方法是你传递View的高度和宽度到setMeasuredDimension方法里,这样可以直接告诉父控件,需要多大地方放置子控件.

  接下来的代码片段给出了如何重写onMeasure.注意,调用的本地空方法是来计算高度和宽度的.它们会译解widthHeightSpec和heightMeasureSpec值,并计算出合适的高度和宽度值.

@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {

int measuredHeight = measureHeight(heightMeasureSpec);
int measuredWidth = measureWidth(widthMeasureSpec);
setMeasuredDimension(measuredHeight, measuredWidth);
}

private int measureHeight(int measureSpec) {


// Return measured widget height.
}

private int measureWidth(int measureSpec) {

// Return measured widget width.
}

边界参数——widthMeasureSpec和heightMeasureSpec ,效率的原因以整数的方式传入。在它们使用之前,首先要做的是使用MeasureSpec类的静态方法getMode和getSize来译解,如下面的片段所示:

int specMode = MeasureSpec.getMode(measureSpec);
int specSize = MeasureSpec.getSize(measureSpec);

依据specMode的值,(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模式目前还没有发现在什么情况下使用。 

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

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

  在两种情况下,你必须绝对的处理这些限制。在一些情况下,它可能会返回超出这些限制的尺寸,在这种情况下,你可以让父元素选择如何对待超出的View,使用裁剪还是滚动等技术。

  接下来的框架代码给出了处理View测量的典型实现:

java代码:

@Override

protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {

int measuredHeight = measureHeight(heightMeasureSpec);

int measuredWidth = measureWidth(widthMeasureSpec);

setMeasuredDimension(measuredHeight, measuredWidth);

}

private int measureHeight(int measureSpec) {

int specMode = MeasureSpec.getMode(measureSpec);
int specSize = MeasureSpec.getSize(measureSpec);

// Default size if no limits are specified.

int result = 500;
if (specMode == MeasureSpec.AT_MOST){

// Calculate the ideal size of your
// control within this maximum size.
// If your control fills the available
// space return the outer bound.

result = specSize;
}
else if (specMode == MeasureSpec.EXACTLY){

// If your control can fit within these bounds return that value.
result = specSize;
}

return result;
}

private int measureWidth(int measureSpec) {
int specMode = MeasureSpec.getMode(measureSpec);
int specSize = MeasureSpec.getSize(measureSpec);

// Default size if no limits are specified.
int result = 500;
if (specMode == MeasureSpec.AT_MOST){
// Calculate the ideal size of your control
// within this maximum size.
// If your control fills the available space
// return the outer bound.
result = specSize;
}

else if (specMode == MeasureSpec.EXACTLY){
// If your control can fit within these bounds return that value.

result = specSize;
}

return result;
}

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!


# Android  # View.onMeasure方法详解  # View.onMeasure  # Android 重写ViewGroup 分析onMeasure()和onLayout()方法  # Android ListView 和ScroolView 出现onmeasure空指针的解决办法  # Android 中View.onDraw(Canvas canvas)的使用方法  # Android 通过onDraw实现在View中绘图操作的示例  # Android onMeasure与onDraw及自定义属性使用示例  # 的是  # 设置为  # 出了  # 情况下  # 多大  # 自己的  # 还没有  # 有个  # 你可以  # 最多  # 什么时候  # 没有任何  # 两种  # 你想  # 这两个  # 就没  # 希望能  # 要做  # 要用  # 很重要 


相关文章: 电视网站制作tvbox接口,云海电视怎样自定义添加电视源?  网站网页制作电话怎么打,怎样安装和使用钉钉软件免费打电话?  网站制作的步骤包括,正确网址格式怎么写?  北京营销型网站制作公司,可以用python做一个营销推广网站吗?  制作网页的网站有哪些,电脑上怎么做网页?  常州企业网站制作公司,全国继续教育网怎么登录?  建站之星客服服务时间及联系方式如何?  湖北网站制作公司有哪些,湖北清能集团官网?  定制建站模板如何实现SEO优化与智能系统配置?18字教程  阿里云高弹*务器配置方案|支持分布式架构与多节点部署  猪八戒网站制作视频,开发一个猪八戒网站,大约需要多少?或者自己请程序员,需要什么程序员,多少程序员能完成?  微网站制作教程,不会写代码,不会编程,怎么样建自己的网站?  怎么将XML数据可视化 D3.js加载XML  建站之星安装后如何自定义网站颜色与字体?  如何通过商城自助建站源码实现零基础高效建站?  义乌企业网站制作公司,请问义乌比较好的批发小商品的网站是什么?  如何通过服务器快速搭建网站?完整步骤解析  高配服务器限时抢购:企业级配置与回收服务一站式优惠方案  如何在万网开始建站?分步指南解析  建站之星导航配置指南:自助建站与SEO优化全解析  如何在Golang中处理模块冲突_解决依赖版本不兼容问题  如何在Windows环境下新建FTP站点并设置权限?  如何将凡科建站内容保存为本地文件?  青浦网站制作公司有哪些,苹果官网发货地是哪里?  网站设计制作书签怎么做,怎样将网页添加到书签/主页书签/桌面?  建站之星如何助力网站排名飙升?揭秘高效技巧  网站制作服务平台,有什么网站可以发布本地服务信息?  家具网站制作软件,家具厂怎么跑业务?  C#如何序列化对象为XML XmlSerializer用法  上海制作企业网站有哪些,上海有哪些网站可以让企业免费发布招聘信息?  如何在沈阳梯子盘古建站优化SEO排名与功能模块?  如何在IIS中新建站点并解决端口绑定冲突?  建站主机功能解析:服务器选择与快速搭建指南  陕西网站制作公司有哪些,陕西凌云电器有限公司官网?  潍坊网站制作公司有哪些,潍坊哪家招聘网站好?  如何快速生成专业多端适配建站电话?  如何快速配置高效服务器建站软件?  定制建站哪家更专业可靠?推荐榜单揭晓  建站之星×万网:智能建站系统+自助建站平台一键生成  营销式网站制作方案,销售哪个网站招聘效果最好?  建站之星如何防范黑客攻击与数据泄露?  如何用腾讯建站主机快速创建免费网站?  如何快速完成中国万网建站详细流程?  浅析上传头像示例及其注意事项  惠州网站建设制作推广,惠州市华视达文化传媒有限公司怎么样?    音乐网站服务器如何优化API响应速度?  可靠的网站设计制作软件,做网站设计需要什么样的电脑配置?  中山网站推广排名,中山信息港登录入口?  已有域名如何免费搭建网站? 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。