Android控件测量相关
2016-03-18 12:00
471 查看
在自定义View和ViewGroup时,我们经常会遇到int型的MeasureSpec来表示一个组件的大小,这个变量里面不仅有
组件的大小,还有大小的模式。
MeasureSpec是一个int型整数,他有32位,而模式有三种,要表示三种状态,至少得2位二进制位。于是系统采用
了最高的2位表示模式。
最高两位是00的时候表示"未指定模式"。即MeasureSpec.UNSPECIFIED
最高两位是01的时候表示"精确模式"。即MeasureSpec.EXACTLY
最高两位是11的时候表示"最大模式"。即MeasureSpec.ATMOST
MeasureSpec工具类有四个方法和三个常量供我们使用:
//由我们给出的尺寸大小和模式生成一个包含这两个信息的int变量,这里模式参数,传三个常量中的一个
public static int makeMeasureSpec(int size,int mode)
public static int getMode(int measureSpec)
public static int getSize(int measureSpec)
//把这个变量里面的模式和大小组成字符串反回来,方便打日志
public static String toString(int measureSpec)
MeasureSpec.EXACTLY:当我们将控件的layout_width或layout_height指定为具体数值时如
andorid:layout_width="50dip",或者为FILL_PARENT是,都是控件大小已经确定的情况,都是精确尺寸。
MeasureSpec.AT_MOST是最大尺寸,当控件的layout_width或layout_height指定为WRAP_CONTENT时,控
件大小一般随着控件的子空间或内容进行变化,此时控件尺寸只要不超过父控件允许的最大尺寸即可。因此,此
时的mode是AT_MOST,size给出了父控件允许的最大尺寸。
MeasureSpec.UNSPECIFIED是未指定尺寸,这种情况不多,一般都是父控件是AdapterView,通过
measure()方法传入的模式
因此,在重写onMeasure()方法时要根据模式不同进行尺寸计算
![](https://oscdn.geek-share.com/Uploads/Images/Content/201908/25/32fa079376dae0433655359438f6e151)
![](https://oscdn.geek-share.com/Uploads/Images/Content/201908/25/2122cfc04646a294f61eadb1a8ce1b9a)
ScrollView中嵌套ListView,禁止ListView的滚动事件
组件的大小,还有大小的模式。
MeasureSpec是一个int型整数,他有32位,而模式有三种,要表示三种状态,至少得2位二进制位。于是系统采用
了最高的2位表示模式。
最高两位是00的时候表示"未指定模式"。即MeasureSpec.UNSPECIFIED
最高两位是01的时候表示"精确模式"。即MeasureSpec.EXACTLY
最高两位是11的时候表示"最大模式"。即MeasureSpec.ATMOST
MeasureSpec工具类有四个方法和三个常量供我们使用:
//由我们给出的尺寸大小和模式生成一个包含这两个信息的int变量,这里模式参数,传三个常量中的一个
public static int makeMeasureSpec(int size,int mode)
public static int getMode(int measureSpec)
public static int getSize(int measureSpec)
//把这个变量里面的模式和大小组成字符串反回来,方便打日志
public static String toString(int measureSpec)
MeasureSpec.EXACTLY:当我们将控件的layout_width或layout_height指定为具体数值时如
andorid:layout_width="50dip",或者为FILL_PARENT是,都是控件大小已经确定的情况,都是精确尺寸。
MeasureSpec.AT_MOST是最大尺寸,当控件的layout_width或layout_height指定为WRAP_CONTENT时,控
件大小一般随着控件的子空间或内容进行变化,此时控件尺寸只要不超过父控件允许的最大尺寸即可。因此,此
时的mode是AT_MOST,size给出了父控件允许的最大尺寸。
MeasureSpec.UNSPECIFIED是未指定尺寸,这种情况不多,一般都是父控件是AdapterView,通过
measure()方法传入的模式
因此,在重写onMeasure()方法时要根据模式不同进行尺寸计算
ScrollView中嵌套ListView,禁止ListView的滚动事件
public void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { int expandSpec = MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE >> 2, MeasureSpec.AT_MOST); super.onMeasure(widthMeasureSpec, expandSpec); }
相关文章推荐
- 不能为虚拟电脑 Custom Phone - 4.1.1 - API 16 - 768x1280 打开一个新任务.
- Activity的创建
- Android之Android Studio 启动异常
- Android Bottom Navigation
- 扣丁学堂笔记第01天Android开发环境搭建
- android 高德地图Maker infoWin窗口中TextView不换行问题
- android使用shape实现布局文件呈圆角
- android 加载自定义图片并在图片上绘图
- mac下android-ndk-r10e-darwin-x86_64.bin解压
- Android常用的第三方组件
- Android含资源文件引用的项目打包成jar包
- 安卓动画android:interpolator
- Android Studio 打包以及获取数字签名
- Android 屏幕适配方案
- android ScrollVIew中嵌套GridView,如何显示GridView
- ANDROID L - Material Design详解(动画篇)
- ANDROID L - Material Design详解(主题和布局)
- ANDROID L - Material Design详解(视图和阴影)
- 去除AndroidStudio中libpng关于iCCP的警告
- Android自学学习资料