返回

重写 onMeasure 和 onLayout 定制布局的内部布局

Android

前言

上一期我们学习了如何使用ConstraintLayout来实现一些复杂的布局,这期我们来学习如何重写onMeasure()和onLayout()方法来定制布局的内部布局。

重写onMeasure()方法

onMeasure()方法是用来测量View及其子View的大小。当View的父View调用其measure()方法时,View会调用onMeasure()方法来计算自己的大小。

onMeasure()方法有两个参数:

  • widthMeasureSpec:父View希望View的宽度。
  • heightMeasureSpec:父View希望View的高度。

这两个参数都是由父View的MeasureSpec对象生成的,MeasureSpec对象中包含了父View希望View的大小、测量模式和测量标志。

View可以通过MeasureSpec对象来获取父View希望View的大小。MeasureSpec对象的getMode()方法可以获取测量模式,MeasureSpec对象的getSize()方法可以获取测量标志。

如果测量模式是MeasureSpec.EXACTLY,则父View希望View的大小是MeasureSpec对象的getSize()。
如果测量模式是MeasureSpec.AT_MOST,则父View希望View的大小不能超过MeasureSpec对象的getSize()。
如果测量模式是MeasureSpec.UNSPECIFIED,则父View对View的大小没有任何限制。

View可以通过MeasureSpec对象的getMode()方法来获取测量模式,然后根据测量模式来计算自己的大小。

例如,如果View的测量模式是MeasureSpec.EXACTLY,则View的大小就应该是MeasureSpec对象的getSize()。如果View的测量模式是MeasureSpec.AT_MOST,则View的大小就应该是Math.min(View.getDesiredWidth(), MeasureSpec.getSize())。如果View的测量模式是MeasureSpec.UNSPECIFIED,则View的大小就应该是View.getDesiredWidth()。

重写onLayout()方法

onLayout()方法是用来布局View及其子View的位置。当View的父View调用其layout()方法时,View会调用onLayout()方法来布局自己的子View。

onLayout()方法有四个参数:

  • changed:View的位置是否发生变化。
  • left:View的左边位置。
  • top:View的顶部位置。
  • right:View的右边位置。
  • bottom:View的底部位置。

View可以通过这四个参数来布局自己的子View。

例如,View可以通过left和right来布局子View的水平位置,可以通过top和bottom来布局子View的垂直位置。

总结

本文介绍了如何重写onMeasure()和onLayout()方法来定制布局的内部布局。通过重写这两个方法,我们可以实现自定义布局,满足不同的布局需求。