@@ -68,9 +68,7 @@ LoadingRenderer主要负责给LoadingDrawable绘制的。 核心方法 draw(Canv
68
68
首先draw方法进行详解, 详见下面代码注释:
69
69
``` java
70
70
public void draw(Canvas canvas, Rect bounds) {
71
- // 给画笔设置颜色
72
- mPaint. setColor(mCurrentColor);
73
- // 保存画布
71
+ // 保存画布状态
74
72
int saveCount = canvas. save();
75
73
// 围绕bounds中心旋转画布mGroupRotation角度
76
74
canvas. rotate(mGroupRotation, bounds. exactCenterX(), bounds. exactCenterY());
@@ -79,39 +77,33 @@ public void draw(Canvas canvas, Rect bounds) {
79
77
// 这个绘制圆环总要设置的,无论在View的onDraw 还是在Drawable 的draw方法里都是不能紧贴边界绘制圆环的
80
78
// 否则会发现所绘制圆环的边界有一半被裁剪掉
81
79
arcBounds. inset(mStrokeInset, mStrokeInset);
82
- // 这句主要是为了防止canvas调用drawArc方法绘制sweepAngle为0时闪烁的问题
83
- if (mStartTrim == mEndTrim) {
84
- mStartTrim = mEndTrim + getMinProgressArc();
85
- }
80
+ // 给画笔设置颜色
81
+ mPaint. setColor(mCurrentColor);
86
82
// 下面代码是这个动画的核心代码, 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
+ // 恢复画布状态
91
85
canvas. restoreToCount(saveCount);
92
86
}
93
87
```
94
- 对于mStartTrim和mEndTrim是如何计算的呢 ?
88
+ 对于mStartDegrees和mSwipeDegrees是如何计算的呢 ?
95
89
96
90
``` java
97
91
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;
104
92
// 更新所绘制弧度的颜色,从本次动画的最后20%进行颜色渐变切换
105
93
updateRingColor(renderProgress);
106
94
// 动画的前50% 不断增大开始角度的大小(不改变结束角度的大小)从而不断增大绘制弧度的大小
107
95
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);
110
98
}
111
99
// 动画的后50% 不断增大结束角度的大小(不改变开始角度的大小)从而不断减小绘制弧度的大小
112
100
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;
115
107
}
116
108
// 下面这两行用于旋转画布是绘制的弧度看起来是在不断转动
117
109
mGroupRotation = ((FULL_ROTATION / NUM_POINTS ) * renderProgress) + (FULL_ROTATION * (mRotationCount / NUM_POINTS ));
0 commit comments