效果预览
自定义View第一步:确认View的大小
无论是自定义一个View还是ViewGroup我们必须得先为其制定在不同MeasureSpecMode下的大小,我这里就不讲解什么绘制源码了什么的,我们就直接实战。
我们在onMeasure中需要调用setMeasuredDimension(width,height)来为这个View确定宽高,调用这个方法确认完,我们就可以通过getMeasuredWidth和getMeasuredHeight来获取设置的这两个值了,而我们看过相关文章或者源码的童鞋们都知道,View的onMeasure默认实现是会处理 MeasureSpec.EXACTLY这种模式的,因为这种模式下代表宽高在XML或者代码中明确设置过了,或者是父View的大小。所以我们只需处理MeasureSpec.AT_MOST这种模式时,宽高是多少,因为这个模式代表了我们在XML设置了wrap_content,而包裹内容是多大,我们不知道,必须得自己明确的设置,你设置多大就是多大。一般的话,我们会根据绘制内容会绘制多大来确认这个View的大小,但是我们这种图表类的绘制内容要绘制的时候又需要根据控制的大小去设置一些变量,所以这样就产生了矛盾,所以我们这里的这个自定义View必须得先设置一个合适的宽高,我在这里就设置它为父View的2/3。
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
int widthSize = MeasureSpec.getSize(widthMeasureSpec);
int widthMode = MeasureSpec.getMode(widthMeasureSpec);
int heightSize = MeasureSpec.getSize(heightMeasureSpec);
int heightMode = MeasureSpec.getMode(heightMeasureSpec);
int resultWidth = widthSize;
int resultHeight = heightSize;
if(widthMode == MeasureSpec.AT_MOST){ //wrap_content的时候取父宽度的2/3
resultWidth &