您的位置:首页 > 移动开发 > Android开发

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()方法时要根据模式不同进行尺寸计算





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);

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: