如何动态获得view的大小
说到获取view的大小,一般想到使用View中的getWidht和getHeight,getMeasuredWidth和getMeasuredHeight。但是这几个方法一般都是在view的onlayout的方法执行以后才能进行获得的,如onlayout方法没有执行此时我们应该怎么来获得view的大小呢?
将view.onmeasure(0,0)设置为0的时候表示,此时不需要考虑父控件的布局问题,直接使用getMeasuredWidth和getMeasuredHeight获取此view的自身的实际大小,可以看下面的例子:这个是在网上引用的一段代码
public class Utility {public static void setListViewHeightBasedOnChildren(ListView listView) {ListAdapter listAdapter = listView.getAdapter();if (listAdapter == null) {// pre-conditionreturn;}int totalHeight = 0;for (int i = 0; i < listAdapter.getCount(); i++) {View listItem = listAdapter.getView(i, null, listView);listItem.measure(0, 0);totalHeight += listItem.getMeasuredHeight();}ViewGroup.LayoutParams params = listView.getLayoutParams();params.height = totalHeight + (listView.getDividerHeight() * (listAdapter.getCount() - 1));listView.setLayoutParams(params);}}
下面来说说onMeasure方法:onMeasure方法是父控件在调用子控件的时候,会想子空间传递两个参数——widthMeasureSpec和heightMeasureSpec,来指明控件可以获得的大小参数,然后可以将此参数设置到view的setMeasuredDimension方法中;注意在计算父控件传递过来的--widthMeasureSpec和heightMeasureSpec参数的时候需要首先获得参数的Mode类型即AT_MOST(最大空间),EXACTLY(实际空间)和UNSPECIFIED;
@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);
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; } 以上的代码摘抄自网络
说道onmeasure方法,在我们有时候进行自定义的空间的时候需要使用此方法对空间的大小进行设定,记住在设置大小的时候一定要加上setMeasuredDimension(measuredHeight, measuredWidth)方法,否则会报错
如何动态获得view的大小相关推荐
- android 动态设置padding,Android动态设置控件大小以及设定margin以及padding值
http://www.aichengxu.com/Java/73893.htm Android动态设置控件大小以及设定margin以及padding值,有需要的朋友可以参考下. 一.概述 在andro ...
- 动态设置view或布局的宽高
代码中动态设置view或布局的宽高 标签: 图片/ 动态改变/ 宽高 有时我们需要在应用中动态改变图片或某一块布局的大小.这就不能用XML文件写成固定值,而需要在java代码中动态设置.效果如下: ...
- 动态修改ListView文字大小
动态修改ListView文字大小 写了一个MyAdapter(继承了BaseAdapter)去实现数据和UI的显示.通过滑动SeekBar来改变MyAdapter的getView方法中View的字体大 ...
- 一种无需留坑为页面动态添加View方案
在Activity或Fragment页面动态添加View,有其应用场景,比如配合运营在首页动态插入H5活动页(如下图手淘的雪花例示[1]),在页面头部插入通知View等.本文结合ActivityLif ...
- xcode 学习笔记2:动态添加view
xcode 学习笔记2:动态添加view 2011-07-06 16:48:39| 分类: 计算机学习|字号 订阅 前面说的都是用的Interface Builder来编辑.xib文件来给窗口添加各 ...
- android viewpager动态加载页面,Android viewpager中动态添加view并实现伪无限循环的方法...
本文实例讲述了Android viewpager中动态添加view并实现伪无限循环的方法.分享给大家供大家参考,具体如下: viewpager的使用,大家都熟悉,它可以实现页面之间左右滑动的切换,这里 ...
- 如何动态改变框架的大小[转]
如何动态改变框架的大小 解决思路: 在框架所加载页中用parent.frames["框架名"].cols="值1,值2..." 或者parent.frames[ ...
- 微信小程序view动态长度_微信小程序实现动态改变view标签宽度和高度的方法【附demo源码下载】...
本文实例讲述了微信小程序实现动态改变view标签宽度和高度的方法.分享给大家供大家参考,具体如下: 1.效果展示 2.关键代码 index.wxml文件 >我是view标签,我现在的宽度是{{v ...
- 动态调整linux分区大小,GParted 动态调整Linux分区大小
在虚拟化环境中虚拟机运行一段时间后数据量持续增长,磁盘分区都需要进行扩容,对于Windows系统相对简单,在磁盘瘦格式的状态下直接修改虚拟机磁盘大小,在系统中的磁盘管理里扩展分区即可,实时生效连重启都 ...
最新文章
- 0UL能做C语言常量吗,c语言中的0UL或1UL是什么意思
- 何玺对话苏宁金融洪蜀宁:区块链是颠覆性技术,意义远超互联网
- CentOS LVM
- property Alternative forms propretie
- CTF C#逆向Reverse
- 《系统集成项目管理工程师》必背100个知识点-12项目整体管理的过程
- 乐观锁的一种实现方式——CAS
- 11计算机,11-计算机科学与技术
- 通达OA - 数据备份与恢复指南
- 此更新不适用于您的计算机 kb4012212,这才是正确的全球勒索软件处置方法(含Windows补丁)...
- Mac OS X:单用户模式(Single User Mode)的操作和安全漏洞
- UbuntuX11VNC教程
- H3C新华三链路聚合介绍
- WIN32 2048游戏
- opencv 简单的裂缝检测
- WDM波分复用中什么是C波段、L波段?
- 每周一磁 · 矫顽力Hcb和内禀矫顽力Hcj
- 蓝代斯克和玖道在华设立合资企业
- 音频微商精准引流技巧有哪些?如何从音频平台吸引粉丝?
- 服务器上文件名太长,Git add命令失败,说“文件名太长”
热门文章
- x265 码率控制算法(三)CRF
- Python 中文分词并去除停用词
- Premiere 新建项目导入视频后 视频花屏解决办法
- ps—ps图层样式阴影样式详解/等高线/扩展/大小等
- 怎么压缩jp2文件?如何在线压缩jp2图片?
- 钉钉老版本下载3.31_钉钉旧版最新版_钉钉旧版官方下载_钉钉旧版PC版-华军软件园...
- javascript实现关键字搜索和匹配关键字高亮效果
- WIN10开机前自启进程
- 中国激光显示产业的三大中流砥柱
- 使用 ffmpeg 命令实现图片和视频相互转换