一看就喜欢的loading动画效果Android分析实现

2019-12-10 19:13:34于丽

Math.acos()  -反余弦函数;
Math.toDegrees() - 弧度转化为角度,Math.toRadians 角度转化为弧度
所以圆弧的起始点为:

int startAngle = 180 - angle; 

圆弧划过的角度为:
2 * angle 

这一块的代码如下:

// mProgressWidth为进度条的宽度,根据当前进度算出进度条的位置 
mCurrentProgressPosition = mProgressWidth * mProgress / TOTAL_PROGRESS; 
// 即当前位置在图中所示1范围内 
if (mCurrentProgressPosition < mArcRadius) { 
  Log.i(TAG, "mProgress = " + mProgress + "---mCurrentProgressPosition = " 
      + mCurrentProgressPosition 
      + "--mArcProgressWidth" + mArcRadius); 
  // 1.绘制白色ARC,绘制orange ARC 
  // 2.绘制白色矩形 
 
  // 1.绘制白色ARC 
  canvas.drawArc(mArcRectF, 90, 180, false, mWhitePaint); 
 
  // 2.绘制白色矩形 
  mWhiteRectF.left = mArcRightLocation; 
  canvas.drawRect(mWhiteRectF, mWhitePaint); 
 
  // 3.绘制棕色 ARC 
  // 单边角度 
  int angle = (int) Math.toDegrees(Math.acos((mArcRadius - mCurrentProgressPosition) 
      / (float) mArcRadius)); 
  // 起始的位置 
  int startAngle = 180 - angle; 
  // 扫过的角度 
  int sweepAngle = 2 * angle; 
  Log.i(TAG, "startAngle = " + startAngle); 
  canvas.drawArc(mArcRectF, startAngle, sweepAngle, false, mOrangePaint); 
} else { 
  Log.i(TAG, "mProgress = " + mProgress + "---transfer-----mCurrentProgressPosition = " 
      + mCurrentProgressPosition 
      + "--mArcProgressWidth" + mArcRadius); 
  // 1.绘制white RECT 
  // 2.绘制Orange ARC 
  // 3.绘制orange RECT 
   
  // 1.绘制white RECT 
  mWhiteRectF.left = mCurrentProgressPosition; 
  canvas.drawRect(mWhiteRectF, mWhitePaint); 
   
  // 2.绘制Orange ARC 
  canvas.drawArc(mArcRectF, 90, 180, false, mOrangePaint); 
  // 3.绘制orange RECT 
  mOrangeRectF.left = mArcRightLocation; 
  mOrangeRectF.right = mCurrentProgressPosition; 
  canvas.drawRect(mOrangeRectF, mOrangePaint); 
 
}