计算尺寸的模式:
AT_MOST 父容器告诉空间,空间自身最大能够有多大,
如果空间内容超过了这个尺寸,空间进行换行的处理(对应wrap_content)
EXACTLY:父容器容空间有多大,控件必须多大
对应的布局属性:match_parent 以及特定的dp尺寸,就是300dp
当EXACTLY的模式,控件原有内容的尺寸就会忽略掉
当AT_MOST的时候,必须计算空间的尺寸;
代表 当一个空间,设置尺寸为wrap_content的时候,就需要计算空间内容的尺寸。
4:UNSPECIFIED 了解一下,就是ScrollView 内部的所有控件的onMeasure 参数模式,都是这个;
调研,ScrollView +ListView 显示的状态,以及ListView onMeasure 方法内部的执行方式。
((((((((((((((((((((((((((
<com.kodulf.fullycustomerview.widget.SimpleView
android:id="@+id/simple_view"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="#ccc"
/>
/**
* 当空间在布局中的时候,布局需要排版,就需要获取控件的尺寸
* 就会最终调用到这个onMeasure 方法
* 父容器会给这个测量的方法,传递两个重要的数值,代表入容器还有多少空间可以放控件
*
* @param widthMeasureSpec 是经过编码的数值,包含芙蓉起剩余的宽度,或者是控件可用的最大宽度,以及尺寸计算模式
* @param heightMeasureSpec 同上,代表高徒可用数值与高度尺寸计算模式。
*/
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
//调用父类的尺寸计算方法。如果调用了父类的,那么尺寸会计算出来,在super 调用之前可以
//拦击数值,进行替换。只有在拦截数值的时候,才会调用父类
//super.onMeasure(widthMeasureSpec, heightMeasureSpec);
//如果没有调用父类的方法,那么这个方法,必须要调用setMeasuredDimension();方法
//获取芙蓉起,可以用的宽度数值
int wSize = MeasureSpec.getSize(widthMeasureSpec);
//获取父容器希望空间如何计算宽度
int wMode = MeasureSpec.getMode(widthMeasureSpec);
int hSize = MeasureSpec.getSize(heightMeasureSpec);
int hMode = MeasureSpec.getMode(heightMeasureSpec);
switch(wMode){
case MeasureSpec.AT_MOST:
//因为绘制的时候,在中心点绘制了一个字符串,200像素的字符尺寸
//同时在生成圆形的时候,在右边空出了100像素,为了让文字被圆形覆盖,
//计算出来,整个控件的最小尺寸
wSize=400;
Log.d("151223MY", "width="+"AT_MOST");
break;
case MeasureSpec.EXACTLY:
Log.d("151223MY", "width="+"EXACTLY");
break;
case MeasureSpec.UNSPECIFIED:
Log.d("151223MY", "width="+"UNSPECIFIED");
break;
}
switch(hMode){
case MeasureSpec.AT_MOST://对应高度 wrap_content
Log.d("151223MY", "height="+"AT_MOST");
hSize=400;
break;
case MeasureSpec.EXACTLY:
Log.d("151223MY", "height="+"EXACTLY");
break;
case MeasureSpec.UNSPECIFIED:
Log.d("151223MY", "height="+"UNSPECIFIED");
break;
}
//计算了尺寸之后,必须调用setMeasuredDimension();
setMeasuredDimension(wSize,hSize);
//super.onMeasure(widthMeasureSpec, heightMeasureSpec);
}
AT_MOST 父容器告诉空间,空间自身最大能够有多大,
如果空间内容超过了这个尺寸,空间进行换行的处理(对应wrap_content)
EXACTLY:父容器容空间有多大,控件必须多大
对应的布局属性:match_parent 以及特定的dp尺寸,就是300dp
当EXACTLY的模式,控件原有内容的尺寸就会忽略掉
当AT_MOST的时候,必须计算空间的尺寸;
代表 当一个空间,设置尺寸为wrap_content的时候,就需要计算空间内容的尺寸。
4:UNSPECIFIED 了解一下,就是ScrollView 内部的所有控件的onMeasure 参数模式,都是这个;
调研,ScrollView +ListView 显示的状态,以及ListView onMeasure 方法内部的执行方式。
((((((((((((((((((((((((((
<com.kodulf.fullycustomerview.widget.SimpleView
android:id="@+id/simple_view"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="#ccc"
/>
/**
* 当空间在布局中的时候,布局需要排版,就需要获取控件的尺寸
* 就会最终调用到这个onMeasure 方法
* 父容器会给这个测量的方法,传递两个重要的数值,代表入容器还有多少空间可以放控件
*
* @param widthMeasureSpec 是经过编码的数值,包含芙蓉起剩余的宽度,或者是控件可用的最大宽度,以及尺寸计算模式
* @param heightMeasureSpec 同上,代表高徒可用数值与高度尺寸计算模式。
*/
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
//调用父类的尺寸计算方法。如果调用了父类的,那么尺寸会计算出来,在super 调用之前可以
//拦击数值,进行替换。只有在拦截数值的时候,才会调用父类
//super.onMeasure(widthMeasureSpec, heightMeasureSpec);
//如果没有调用父类的方法,那么这个方法,必须要调用setMeasuredDimension();方法
//获取芙蓉起,可以用的宽度数值
int wSize = MeasureSpec.getSize(widthMeasureSpec);
//获取父容器希望空间如何计算宽度
int wMode = MeasureSpec.getMode(widthMeasureSpec);
int hSize = MeasureSpec.getSize(heightMeasureSpec);
int hMode = MeasureSpec.getMode(heightMeasureSpec);
switch(wMode){
case MeasureSpec.AT_MOST:
//因为绘制的时候,在中心点绘制了一个字符串,200像素的字符尺寸
//同时在生成圆形的时候,在右边空出了100像素,为了让文字被圆形覆盖,
//计算出来,整个控件的最小尺寸
wSize=400;
Log.d("151223MY", "width="+"AT_MOST");
break;
case MeasureSpec.EXACTLY:
Log.d("151223MY", "width="+"EXACTLY");
break;
case MeasureSpec.UNSPECIFIED:
Log.d("151223MY", "width="+"UNSPECIFIED");
break;
}
switch(hMode){
case MeasureSpec.AT_MOST://对应高度 wrap_content
Log.d("151223MY", "height="+"AT_MOST");
hSize=400;
break;
case MeasureSpec.EXACTLY:
Log.d("151223MY", "height="+"EXACTLY");
break;
case MeasureSpec.UNSPECIFIED:
Log.d("151223MY", "height="+"UNSPECIFIED");
break;
}
//计算了尺寸之后,必须调用setMeasuredDimension();
setMeasuredDimension(wSize,hSize);
//super.onMeasure(widthMeasureSpec, heightMeasureSpec);
}