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'
複製代碼