1. 说明
这里我们来把我们前边写的测量文字、测量圆弧、测量圆的代码总结下。
2. onMeasure()测量
2.1 onMeasure()测量文字
/**
* 测量文字
* @param widthMeasureSpec
* @param heightMeasureSpec
*/
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
// 如果自定义TextView中的宽高给的是确定的值,比如10dp、20dp、match_parent,这个时候不需要计算,给的多少就是多少
// 如果自定义TextView中的宽高给的是wrap_content,则需要计算宽高
int widthMode = MeasureSpec.getMode(widthMeasureSpec) ;
int heightMode = MeasureSpec.getMode(heightMeasureSpec) ;
// 1. 如果文字的大小给的是确定的值,比如10dp、20dp、match_parent,这个时候不需要计算,给的多少就是多少
int width = MeasureSpec.getSize(widthMeasureSpec) ;
// 2. 如果文字的大小给的是wrap_content,则需要计算大小
if (widthMode == MeasureSpec.AT_MOST){
// 区域
// 计算的宽度 与字体的大小、字体长度有关
Rect bounds = new Rect() ;
// 获取TextView文本的区域
// 参数1:要测量的文字 参数2:表示从位置0开始 参数3:表示到整个文字的长度
mPaint.getTextBounds(mText , 0 , mText.length() , bounds);
width = bounds.width() + getPaddingLeft() + getPaddingRight() ;
}
int height = MeasureSpec.getSize(heightMeasureSpec) ;
if (heightMode == MeasureSpec.AT_MOST){
// 区域
Rect bounds = new Rect() ;
mPaint.getTextBounds(mText , 0 , mText.length() , bounds);
height = bounds.height() + getPaddingTop() + getPaddingBottom() ;
}
// 设置控件的宽高,这里就是给文字设置宽高
setMeasuredDimension(width , height);
}
2.2 onMeasure()测量圆弧
// 画外圆弧、内圆弧、文字
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
// 调用者可能会在布局文件中给宽高设置 wrap_content
// 这里确保:如果宽高不一致,则取最小值,确保是一个正方形
int width = MeasureSpec.getSize(widthMeasureSpec) ;
int height = MeasureSpec.getSize(heightMeasureSpec) ;
// 在上边获取宽高后,重新设置控件宽高
setMeasuredDimension(width>height?height:width , width>height?height:width);
}
注意:
任何自定义View,凡是复写onMeasure()方法后,不要注释里边的super.onMeasure()方法,并且在获取到控件的宽高后,必须调用setMeasuredDimension()方法来重新给控件设置宽高,这个是固定的。