[关闭]
@myron-lee 2015-03-14T12:23:27.000000Z 字数 2019 阅读 1295

Material Progress

Blog


前言

各式各样的progress、loading效果已经很多。不过,总要推陈出新,让用户眼前一亮,让等待显得不那么漫长。这篇文章介绍的效果灵感来自 Safari 插件——“妈妈再也不用担心我的 macbook 发热计划”。

效果图

原理

这个效果并不复杂——外侧较窄的弧(outerArc)逆时针转动、内侧 较宽的弧(innerArc)逆时针转动。不断转动,不断产生交叉、分离的效果。outerArc、innerArc 的弧长均是180度。用 Animation 做节拍器,不断的更新outerArc、innerArc的起始位置(outerArcStartAngle、innerArcStartAngle)。

关键源码

  1. @Override
  2. protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
  3. super.onLayout(changed, left, top, right, bottom);
  4. init();
  5. }
  6. private void init() {
  7. int sideLen = Math.min(getWidth(), getHeight());
  8. float outerArcStrokeWidth = sideLen / 20f;
  9. float innerArcStrokeWidth = outerArcStrokeWidth * 3;
  10. outerRectF = new RectF(outerArcStrokeWidth*0.5f, outerArcStrokeWidth*0.5f, sideLen-outerArcStrokeWidth*0.5f, sideLen-outerArcStrokeWidth*0.5f);
  11. innerRectF = new RectF(outerArcStrokeWidth+innerArcStrokeWidth*0.5f, outerArcStrokeWidth+innerArcStrokeWidth*0.5f, sideLen-(outerArcStrokeWidth+innerArcStrokeWidth*0.5f),sideLen-(outerArcStrokeWidth+innerArcStrokeWidth*0.5f) );
  12. mainColor = Color.parseColor("#e7e7e7");
  13. outerArcPaint = new Paint();
  14. outerArcPaint.setAntiAlias(true);
  15. outerArcPaint.setColor(mainColor);
  16. outerArcPaint.setStrokeWidth(outerArcStrokeWidth);
  17. outerArcPaint.setStyle(Paint.Style.STROKE);
  18. innerArcPaint = new Paint();
  19. innerArcPaint.setAntiAlias(true);
  20. innerArcPaint.setColor(mainColor);
  21. innerArcPaint.setStrokeWidth(innerArcStrokeWidth);
  22. innerArcPaint.setStyle(Paint.Style.STROKE);
  23. outerArcStartAngle = 90;
  24. innerArcStartAngle = 270;
  25. Animation animation = new LoadAnimation();
  26. animation.setInterpolator(new LinearInterpolator());
  27. animation.setDuration(DURATION);
  28. animation.setRepeatCount(Animation.INFINITE);
  29. startAnimation(animation);
  30. }
  31. class LoadAnimation extends Animation{
  32. @Override
  33. protected void applyTransformation(float interpolatedTime, Transformation t) {
  34. outerArcStartAngle = 90 - 360*interpolatedTime;
  35. innerArcStartAngle = 270 + 360*interpolatedTime;
  36. invalidate();
  37. }
  38. }
  39. @Override
  40. protected void onDraw(Canvas canvas) {
  41. canvas.drawArc(outerRectF, outerArcStartAngle, SWEEP_ANGLE, false, outerArcPaint);
  42. canvas.drawArc(innerRectF, innerArcStartAngle, SWEEP_ANGLE, false, innerArcPaint);
  43. }
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注