一起Talk Android吧(第一百四十二回:Android自定义View之Measure六)

各位看官们,大家好,上一回中咱们说的是Android中自定义View之Measure的例子,这一回咱们继续说该例子。闲话休提,言归正转。让我们一起Talk Android吧!

看官们,我们在上一回中介绍了View中的onMeasure()方法,介绍的比较详细,不过还有一个小细节没有介绍,这一回中我们将介绍这个小细节,它就是:getDefaultSize()方法。接下来我们看看它的源代码:

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

从上面的源代码中可以看出,该方法主要是通过参数传递进来的尺寸和具有MeasureSpec特征的变量值来返回一个尺寸值,至于返回什么样的尺寸值与具体的测量模式有关。

  • 如果测量模式是UNSPECIFIED,那么把传递进来的尺寸直接返回;
  • 如果测量模式是AT_MOST或者EXACTLY,那么返回从具有MeasureSpec特征的变量中取出的尺寸值。

“这样返回不合理吧”,有看官这样说。是的,看来已经有细心的看官发现了。这样的返回方式对于EXACTLY测量模式没有问题,但是对于AT_MOST模式就不合理。如果有看官不清楚具体原因的话可以看第一百三十七回中关于MeasureSpec的介绍。

那么它会导致什么后果呢?当View的属性被设置为wrap_content时,它不会产生效果。
“那么该如何避免这种后果呢”,有看官问到。我们前面介绍过继承自View的各种控件都重写了onMeasure()方法,因此只需要在重写onMeasure()方法时获取到这种测量标准,然后重新计算测量尺寸就可以,其实系统提供的各种控件都是这么做的,大家可以随便找一些控件的源代码看一看,我们在这里就不具体说明了。

既然系统提供的控件都这么做了,我们在自定义View时也要针对AT_MOST这种测量标准做处理,不然只能是“后果自负”了。

看官们,虽然我们介绍的是小细节,但是它却对View测量有重大影响,希望大家能够重视它。

各位看官,关于Androd中自定义View之Measure的例子咱们就介绍到这里,欲知后面还有什么例子,且听下回分解!

发布了520 篇原创文章 · 获赞 131 · 访问量 62万+

猜你喜欢

转载自blog.csdn.net/talk_8/article/details/99657243