ViewGroup要继续三个方法onMeasure()onLayout()onDraw()
查看只要继承二个方法onMeasure()onDraw()
onMeasure()绘制自己的位置
onLayout()绘制在容器中的位置
在没对onMeasure()测量的时候,不管你写成match_parent还是wrap_content显示都是一样的match_parent
onMeasure()模板代码:
int width = 0;
int height = 0;
int specMode = MeasureSpec.getMode(widthMeasureSpec);
int specSize = MeasureSpec.getSize(widthMeasureSpec);
switch (specMode) {
case MeasureSpec.UNSPECIFIED://父视图不约束子视图(一般不用)
break;
case MeasureSpec.EXACTLY:// 明确指定了
width = ...
break;
case MeasureSpec.AT_MOST:// 一般为WARP_CONTENT
width = ...
break;
}
specMode = MeasureSpec.getMode(heightMeasureSpec);
specSize = MeasureSpec.getSize(heightMeasureSpec);
switch (specMode) {
case MeasureSpec.UNSPECIFIED://父视图不约束子视图(一般不用)
break;
case MeasureSpec.EXACTLY:// 明确指定了
height=...
break;
case MeasureSpec.AT_MOST:// 一般为WARP_CONTENT
height=...
break;
}
setMeasuredDimension(width, height);
经过onMeasure()测量后
onMeasure() 中
EXACTLY (当我们将控件的layout_width或layout_height指定为具体数值时如andorid:layout_width="50dip",或者为FILL_PARENT是,都是控件大小已经确定的情况,都是精确尺寸)
边距 + getSize()
getPaddingTop() + getPaddingBottom() + MeasureSpec.getSize(heightMeasureSpec);
AT_MOST (当控件的layout_width或layout_height指定为WRAP_CONTENT时,控件大小一般随着控件的子空间或内容进行变化,此时控件尺寸只要不超过父控件允许的最大尺寸即可。因此,此时的mode是AT_MOST,size给出了父控件允许的最大尺寸)
边距 + 自定义View
Rect mBound = new Rect();
mPaint.getTextBounds(mTitleText, 0, mTitleText.length(), mBound);
getPaddingTop() + getPaddingBottom() + mBound.height();