*/
private int measureWidth(int measureSpec) {
int result = 0;
int specMode = MeasureSpec.getMode(measureSpec); //获取具体的测量模式(EXACTLY,AT_MOST,UNSPECIFIED)
int specSize = MeasureSpec.getSize(measureSpec); //获取具体的测量大小
if (specMode == MeasureSpec.EXACTLY) { //默认模式
result = measureSpec;
} else {
result = 400; //给一个默认的大小
if (specMode == MeasureSpec.AT_MOST) { //如果是wrap_content
result = Math.min(result, specSize); //取最小的 适合控件大小的
}
}
return result;
}
/*
-
这个是系统回调方法,是系统调用的,它的方法名已经告诉我们了,这个方法会在这个view的大小发生改变是被系统调用,
-
我们要记住的就是view
-
大小变化,这个方法就被执行就可以了。最主要的是,它还在onDraw方法之前调用。
-
*/
@Override
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
super.onSizeChanged(w, h, oldw, oldh);
mWidth = getWidth();
mHeight = getHeight();
//扇形外围的矩形
/*
首先需要一个矩形来包裹这个扇形,其次每隔一定的事件,扇形需要旋转(这个可以用重新绘制,然后让扇形的角度+1).
矩形的4边必须是相等的,其次中心必须在圆形的中心,这样一来,
矩形的4条边就很好决定了,矩形左侧的X坐标:mWidth * 0.1,矩形顶部的Y坐标:mWidth * 0.1,
矩形右侧的X坐标:mWidth * 0.9,
矩形底部的Y坐标:mWidth * 0.9
-
参数:left float:矩形左侧的X坐标 top float:矩形顶部的Y坐标
-
right float:矩形右侧的X坐标 bottom float:矩形底部的Y坐标
-
*/
mRectF = new RectF((float) (mWidth * 0.1), (float) (mWidth * 0.1),
(float) (mWidth * 0.9), (float) (mWidth * 0.9));
// 绘制渐变效果
LinearGradient gradient = new LinearGradient((float) (mWidth * 0.3),
(float) (mWidth * 0.9), (float) (mWidth * 0.1),
(float) (mWidth * 0.5),
new int[]{Color.parseColor(“#B1D6FD”), Color.TRANSPARENT},
null, Shader.TileMode.CLAMP);
mArcPaint.setShader(gradient);
// 2个圆的半径
radiusExt = (float) (mWidth * 0.4);
radiusInside = (float) (mWidth * 0.25);
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
canvasArc(canvas); //话扇形
canvasArc2(canvas); //画扇形 引导
canvasLines(canvas); //画线
canvasCircle(canvas); //画圆
canvasSche(canvas); //画进度
canvasPercent(canvas); //画 %
}
/**
-
画 % 符号
-
@param canvas
*/
private void canvasPercent(Canvas canvas) {
//符号的X
float perSignX = mTextX + mTextWidth + 5;
//符号的Y
float perSignY = getHeight() / 2 + 20;
//画字
canvas.drawText(“%”, perSignX, perSignY, mPercentSignPaint);
}
/**
-
画文字 进度