今天看书,看到了关于自定义View的技巧,其中关于onMeasure这个方法是必须覆盖的。原因何在?因为在view的onMeasure方法中,有一个getDefaultSize的方法。方法中,对于AT_MOST和EXACTLY的处理是一样的。当然这些点都可以在网上找到相关的介绍。代码如下
public static int getDefaultSize(int size, int measureSpec) {
int result = size;
int specMode = MeasureSpec.getMode(measureSpec);
int specSize = MeasureSpec.getSize(measureSpec);
switch (specMode) {
case MeasureSpec.UNSPECIFIED:
result = size;
break;
case MeasureSpec.AT_MOST:
case MeasureSpec.EXACTLY:
result = specSize;
break;
}
return result;
}
也就是说,我们必须自己处理在wrap_content(AT_MOST)的情况下的view的大小。其推荐的解决方案是给view一个初始值,那我的问题是如何确定这个值呢?
根据view的测量机制,view的子类,比如textview和imageview,其在onMeasure方法中必定也是对wrap_content的情况做了处理。通过查看源码,确实是如此。拿textview的宽度来说,它对wrap_content的情况做的特殊处理就是测量内容(字符)的长度等等,再根据计算结果和传入的宽度值做比较取小,从而得到那个初始值。
最后,推而广之,也就是说,在wrap_content时,需要完成对内容的测量。