R1 + r = R0
R1 * sin0.9° = r
由以上两式能够得出:r = (R0*sin0.9°)/(1+sin0.9°)——R0已知
小蓝圆的圆心为:(centerX,centerY-R0+r)html
@Override
protected void onDraw(Canvas canvas) {
Log.i("onMeasure","执行了onDraw");
super.onDraw(canvas);
mSin_1 = (float) Math.sin(Math.toRadians(1));
// 大圆半径
float outerRadius = (getWidth() < getHeight() ? getWidth() : getHeight()) / 2f;
//小圆点半径
float dotRadius = mSin_1 * outerRadius / (1 + mSin_1);
float centerX = getWidth() / 2f;
float centerY = getHeight() / 2f;
mPaint.setStyle(Paint.Style.FILL);
int count = 0;
while (count++ < 50) {
canvas.drawCircle(centerX, centerY - outerRadius + dotRadius, dotRadius, mPaint);
canvas.rotate(7.2f, centerX, centerY);
}
}
复制代码
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
mPaint.setShader(null);
mPaint.setAntiAlias(true); // 抗锯齿
mPaint.setDither(true); // 防抖动
// 半径,这里减去40是将半径缩小40
float outerRadius = (getWidth() < getHeight() ? getWidth() : getHeight()) / 2f-40;
float centerX = getWidth() / 2f;
float centerY = getHeight() / 2f;
mPaint.setStyle(Paint.Style.FILL);
int count = 0;
int des = (int) TypedValue.applyDimension(
TypedValue.COMPLEX_UNIT_DIP, 6, getResources().getDisplayMetrics());
while (count++ < 50) {
canvas.drawRect(centerX-3,centerY-outerRadius,centerX+3,centerY-outerRadius+des,
mPaint);
canvas.rotate(10.0f, centerX, centerY);
}
}
复制代码
private void drawCircle(Canvas canvas, int center, int radius)
{
//画一个简单的圆
firstPaint.setShader(null); // 清除上一次的shader
firstPaint.setColor(firstColor); // 设置底部圆环的颜色,这里使用第一种颜色
firstPaint.setStyle(Paint.Style.STROKE); // 设置绘制的圆为空心
canvas.drawCircle(center, center, radius+40, firstPaint);
//画一个圆环
RectF oval = new RectF(center - radius, center - radius, center + radius, center + radius);
circlePaint.setShader(null);
// 绘制颜色渐变圆环
// shader类是Android在图形变换中很是重要的一个类。Shader在三维软件中咱们称之为着色器,其做用是来给图像着色。
LinearGradient linearGradient = new LinearGradient(circleWidth, circleWidth, getMeasuredWidth()
- circleWidth, getMeasuredHeight() - circleWidth, colorArray, null, Shader.TileMode.MIRROR);
circlePaint.setShader(linearGradient);
//这里注意设置为描边类型
circlePaint.setStyle(Paint.Style.STROKE);
circlePaint.setShadowLayer(10, 10, 10, Color.RED);
circlePaint.setColor(secondColor); // 设置圆弧的颜色
circlePaint.setStrokeCap(Paint.Cap.ROUND); // 把每段圆弧改为圆角的
// 计算每次画圆弧时扫过的角度,这里计算要注意分母要转为float类型,不然alphaAngle永远为0
alphaAngle = currentValue * 360.0f / maxValue * 1.0f;
canvas.drawArc(oval, -90, alphaAngle, false, circlePaint);
}
复制代码
public void setProgress(int progress)
{
int percent = progress * maxValue / 100;
if (percent < 0)
{
percent = 0;
}
if (percent > 100)
{
percent = 100;
}
this.currentValue = percent;
//更新View
invalidate();
}
复制代码
private void drawText(Canvas canvas, int center, int radius)
{
float result = (currentValue * 100.0f / maxValue * 1.0f); // 计算进度
String percent = String.format("%.1f", result) + "%";
textPaint.setTextAlign(Paint.Align.CENTER); // 设置文字居中,文字的x坐标要注意
textPaint.setColor(textColor); // 设置文字颜色
textPaint.setTextSize(40); // 设置要绘制的文字大小
textPaint.setStrokeWidth(0); // 注意此处必定要从新设置宽度为0,不然绘制的文字会重叠
Rect bounds = new Rect(); // 文字边框
textPaint.getTextBounds(percent, 0, percent.length(), bounds); // 得到绘制文字的边界矩形
Paint.FontMetricsInt fontMetrics = textPaint.getFontMetricsInt(); // 获取绘制Text时的四条线
int baseline = center + (fontMetrics.bottom - fontMetrics.top) / 2 - fontMetrics.bottom;
canvas.drawText(percent, center, baseline, textPaint); // 绘制表示进度的文字
}
复制代码
allprojects {
repositories {
maven { url 'https://jitpack.io' }
}
}
复制代码
implementation 'com.github.guoxiaozhou:AnimationDemo:0.5'
复制代码