若在文中涉及到不清楚的知识点请看前面的文章
自定义ViewGroup首先就要继承于ViewGroup:
构造方法也是必须要实现的,
自定义ViewGroup必须要实现的方法还有两个,onMeasure,onLayout方法
在onMeasure方法对自控件进行测量,以确定父控件的大小,同时也可以在该方法中指定子控件的大小
在onMeasure方法中确定了父控件的大小,也知道了子控件的大小,在onLayout方法中就只是对子控件进行布局
1:child.measure(参数1,参数2)方法
通过该方法来告知父视图子视图的大小与模式,
参数1:由子视图的宽与模式组成
参数2:由子视图的高与模式组成
得到该参数的方式有两种
(1):通过MeasureSpec.makeMeasureSpec(参数1.1,参数1.2)方法
参数1.1是子视图的大小,这个大小要么是宽度,要么是高度,参数1.2是子视图的模式,模式又分为3种
MeasureSpec.EXACTLY:表示精确的,比如我告诉你宽20,那就是20,和父容器一样宽,大小很明确
MeasureSpec.AT_MOST:表示最大值,最大不能超过多少
MeasureSpec.UNSPECIFIED:无限制
val child = getChildAt(0) //得到子视图
val childWidth = parentWidth - 2*space //获取子视图的宽度
val childHeight = parentHeight -2*space //获取子视图的高度
val chidWidthSpec = MeasureSpec.makeMeasureSpec(childWidth,MeasureSpec.EXACTLY)
val childHeightSpec = MeasureSpec.makeMeasureSpec(childHeight,MeasureSpec.EXACTLY)
child.measure(chidWidthSpec,childHeightSpec)
(2):通过getChildMeasureSpec(参数2.1,参数2.2,参数2.3)方法·,
参数2.1:父容器宽度或高度的Spec,
参数2.2:子视图与父容器两边间隙之和,
参数2.3:子视图本身的大小
val child = getChildAt(0)
//获取控件的布局参数
val lp = child.layoutParams //获取子视图的布局参数
val childWidthSpec = getChildMeasureSpec(widthMeasureSpec,32,lp.width) //widthMeasureSpec父视图的宽度的spec,
32是子视图与父视图两边的间距之和,lp.width是子视图的宽度
val childHeightSpec = getChildMeasureSpec(heightMeasureSpec,32,lp.height)
child.measure(childWidthSpec,childHeightSpec)
(3):通过measureChild(child,widthMeasureSpec,heightMeasureSpec),
child:第一个参数,对哪个子视图进行测量,
后面两个分别是父视图的宽度和高度的spec,
2:设置父容器的大小
setMeasureDimension(w,h),
w:是父视图的宽度
h:是父视图的高度
3:对子视图的布局
child.Layout(左边,上边,右边,下边)