自定义控件分为继承View和继承ViewGroup,两者不同。
1、继承View 必须重写 onLayout() 、onDraw()
因为View相当于没什么形状的控件,需要你去重写onDraw() 去自己画出来。重写onLayout() 为了指定 画在哪里。
2、继承ViewGroup 必须重写 onMeasure()、onLayout()
因为ViewGroup需要添加view进去,这里的view是指Android已经帮你画好的控件。但是手机不知道这个控件应该画多大,画在什么位置。所以要重写这个两个方法。而不用重写onDraw()。
下面说继承ViewGroup 我爬过的坑。
1、重写onMeasure()方法,一定要在最后设置这个自定义控件的测量值 setMeasuredDimension();
2、如果给自定义控件,加入的控件还是ViewGroup的控件组,(继承ViewGroup的也算,如LinearLayout)。在重写的onMeasure()中,也一定要对 自定义控件的 childs 测量。如下代码 : child.measure(child.getWidth(),child.getHeight()) 否则会导致控件不显示
因为自定义控件的 子控件还是继承ViewGroup的控件 所以还是需要测量大小。(自己的理解,不一定对。搜了许久没有看到合理解释)
3、关于setMeasuredDimension() 参数的选择。这个方法是设置 自定义控件 的大小。所以如果自定义控件的属性是 match_parent或者固定的数值,直接写 onMeasure()的两个参数就行,widthMeasureSpec和heightMeasureSpec 如果自定义控件的属性是 warp_content 就需要测量子控件的大小,把所有子控件所需要的长宽 当成参数,写到这个方法里。