重写 onMeasure 和 onLayout 定制布局的内部布局
2023-11-03 03:47:27
前言
上一期我们学习了如何使用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()方法来定制布局的内部布局。通过重写这两个方法,我们可以实现自定义布局,满足不同的布局需求。