Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 351a05e

Browse files
author
dinuscxj
committed
Multiple code improvements
1 parent a4ba2ac commit 351a05e

File tree

3 files changed

+408
-448
lines changed

3 files changed

+408
-448
lines changed

README-ZH.md

Lines changed: 14 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -68,9 +68,7 @@ LoadingRenderer主要负责给LoadingDrawable绘制的。 核心方法 draw(Canv
6868
首先draw方法进行详解, 详见下面代码注释:
6969
```java
7070
public void draw(Canvas canvas, Rect bounds) {
71-
//给画笔设置颜色
72-
mPaint.setColor(mCurrentColor);
73-
//保存画布
71+
//保存画布状态
7472
int saveCount = canvas.save();
7573
//围绕bounds中心旋转画布mGroupRotation角度
7674
canvas.rotate(mGroupRotation, bounds.exactCenterX(), bounds.exactCenterY());
@@ -79,39 +77,33 @@ public void draw(Canvas canvas, Rect bounds) {
7977
//这个绘制圆环总要设置的,无论在View的onDraw 还是在Drawable 的draw方法里都是不能紧贴边界绘制圆环的
8078
//否则会发现所绘制圆环的边界有一半被裁剪掉
8179
arcBounds.inset(mStrokeInset, mStrokeInset);
82-
//这句主要是为了防止canvas调用drawArc方法绘制sweepAngle为0时闪烁的问题
83-
if (mStartTrim == mEndTrim) {
84-
mStartTrim = mEndTrim + getMinProgressArc();
85-
}
80+
//给画笔设置颜色
81+
mPaint.setColor(mCurrentColor);
8682
//下面代码是这个动画的核心代码, Material效果的动画无非就是通过不断改变绘制弧度的开始角度和绘制弧度的大小
87-
float startAngle = (mStartTrim + mRotation) * DEGREE_360;
88-
float endAngle = (mEndTrim + mRotation) * DEGREE_360;
89-
float sweepAngle = endAngle - startAngle;
90-
canvas.drawArc(arcBounds, startAngle, sweepAngle, false, mPaint);
83+
canvas.drawArc(arcBounds, mStartDegrees, mSwipeDegrees, false, mPaint);
84+
//恢复画布状态
9185
canvas.restoreToCount(saveCount);
9286
}
9387
```
94-
对于mStartTrim和mEndTrim是如何计算的呢
88+
对于mStartDegrees和mSwipeDegrees是如何计算的呢
9589

9690
```java
9791
public void computeRender(float renderProgress) {
98-
//绘制的最小弧度数
99-
final float minProgressArc = getMinProgressArc();
100-
//下面这三行主要是为了让此次动画起始点是上次动画的结束点,因为每次动画的结束点不是明确的
101-
final float originEndTrim = mOriginEndTrim;
102-
final float originStartTrim = mOriginStartTrim;
103-
final float originRotation = mOriginRotation;
10492
//更新所绘制弧度的颜色,从本次动画的最后20%进行颜色渐变切换
10593
updateRingColor(renderProgress);
10694
//动画的前50% 不断增大开始角度的大小(不改变结束角度的大小)从而不断增大绘制弧度的大小
10795
if (renderProgress <= START_TRIM_DURATION_OFFSET) {
108-
float startTrimProgress = (renderProgress) / START_TRIM_DURATION_OFFSET;
109-
mStartTrim = originStartTrim + ((MAX_PROGRESS_ARC - minProgressArc) * MATERIAL_INTERPOLATOR.getInterpolation(startTrimProgress));
96+
float startTrimProgress = (renderProgress) / START_TRIM_DURATION_OFFSET;
97+
mStartDegrees = mOriginStartDegrees + MAX_SWIPE_DEGREES * MATERIAL_INTERPOLATOR.getInterpolation(startTrimProgress);
11098
}
11199
//动画的后50% 不断增大结束角度的大小(不改变开始角度的大小)从而不断减小绘制弧度的大小
112100
if (renderProgress > START_TRIM_DURATION_OFFSET) {
113-
float endTrimProgress = (renderProgress - START_TRIM_DURATION_OFFSET) / (END_TRIM_DURATION_OFFSET - START_TRIM_DURATION_OFFSET);
114-
mEndTrim = originEndTrim + ((MAX_PROGRESS_ARC - minProgressArc) * MATERIAL_INTERPOLATOR.getInterpolation(endTrimProgress));
101+
float endTrimProgress = (renderProgress - START_TRIM_DURATION_OFFSET) / (END_TRIM_DURATION_OFFSET - START_TRIM_DURATION_OFFSET);
102+
mEndDegrees = mOriginEndDegrees + MAX_SWIPE_DEGREES * MATERIAL_INTERPOLATOR.getInterpolation(endTrimProgress);
103+
}
104+
//这句主要是为了防止canvas调用drawArc方法绘制sweepAngle为0时闪烁的问题
105+
if (Math.abs(mEndDegrees - mStartDegrees) > MIN_SWIPE_DEGREE) {
106+
mSwipeDegrees = mEndDegrees - mStartDegrees;
115107
}
116108
//下面这两行用于旋转画布是绘制的弧度看起来是在不断转动
117109
mGroupRotation = ((FULL_ROTATION / NUM_POINTS) * renderProgress) + (FULL_ROTATION * (mRotationCount / NUM_POINTS));

0 commit comments

Comments
 (0)