http://blog.sina.com.cn/s/blog_4a0238270101jsu9.html
里面的参考资料不错,比较浅显易懂
============================================================================
一、 覆写onMeasure的例子(自定义View)
1. 覆写onMeasure
- @Override
- protected
void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { -
- }
2. 分别计算出宽高,后面解释使用的方法的作用
- private
int measureWidth(int pWidthMeasureSpec) { -
int result = 0; -
-
int widthMode = MeasureSpec.getMode(pWidthMeasureSpec); -
int widthSize = MeasureSpec.getSize(pWidthMeasureSpec); -
-
switch (widthMode) { -
case MeasureSpec.AT_MOST: -
case MeasureSpec.EXACTLY: -
result = widthSize; -
break; -
} -
return result; - }
-
-
- private
int measureHeight(int pHeightMeasureSpec) { -
int result = 0; -
-
int heightMode = MeasureSpec.getMode(pHeightMeasureSpec); -
int heightSize = MeasureSpec.getSize(pHeightMeasureSpec); -
-
switch (heightMode) { -
case MeasureSpec.AT_MOST: -
case MeasureSpec.EXACTLY: -
result = heightSize; -
break; -
} -
-
return result; - }
3. 调用setMeasuredDimension,指定视图在屏幕上的大小、
- int
measureWidth = measureWidth(widthMeasureSpec); - int
measureHeight = measureHeight(heightMeasureSpec); -
- setMeasuredDimension(measureWidth,
measureHeight);
二、解释例子中使用的MeasureSpec
1. MeasureSpec的方法介绍:
类名.方法名 | 解释 |
MeasureSpec.getMode(int measureSpec) | 根据提供的测量值(格式)提取模式(上述三个模式之一) |
MeasureSpec.getSize(int measureSpec) | 根据提供的测量值(格式)提取大小值(这个大小也就是我们通常所说的大小) |
MeasureSpec.makeMeasureSpec(int size,intmode) | 根据提供的大小值和模式创建一个测量值(格式) |
2. MeasureSpec有三种mode,分别说明并描述模式与layout参数值的对应关系
模式 | 模式翻译 | 模式与Layout参数的对应关系 android:layout_width=“” android:layout_height=“” | 模式描述 |
UNSPECIFIED | 无限制 | | parent view不约束child view的大小 |
AT_MOST | 最多的 | wrap_content | parent view 为child view指定最大的值,childview可以在范围内设置 |
EXACTLY | 准确的 | fill_parent,精确值(例如50dip) | parent view为child view指定固定大小 |
三、疑惑
例子总只写了一个view,在onMeasure中添加log获知此方法执行2次? 在ADT20.3中同样的代码onMeasure执行4次?不是应该只执行一次吗?
*** 待添加
1.如果视图还未添加到ViewGroup中,还想获取其宽高,需要手动调用View.measure()方法,可以传入三种模式或者具体值
2. child.measure(MeasureSpec.EXACTLY | itemWidth,MeasureSpec.UNSPECIFIED);
3. View.setMeasuredDimension() 与ViewGroup.measureChildren()的区别?
四、 资料
官方资料:Custom Components
计算控件尺寸
MeasureSpec介绍
( 如何计算size和mode )
重写onMeasure典型例子:
提高:
自定义view改成addview多个,每个layout参数不同
各种模式画图比较
2013-02-28
“待添加” 内容
2013-03-31 添加与onLayout关联
2013-04-07
添加MeasureSpec.EXACTLY| itemWidth