content: package com.rsen.github.loadview.indicator;
  
  import android.animation.Animator;
  import android.animation.ValueAnimator;
  import android.graphics.Canvas;
  import android.graphics.Paint;
  import android.graphics.RectF;
  import android.view.animation.LinearInterpolator;
  
  import java.util.ArrayList;
  import java.util.List;
  
  /**
   * Created by Jack on 2015/10/16.
   */
  public class PacmanIndicator extends BaseIndicatorController{
  
      private float translateX;
  
      private int alpha;
  
      private float degrees1,degrees2;
  
      @Override
      public void draw(Canvas canvas, Paint paint) {
          drawPacman(canvas,paint);
          drawCircle(canvas,paint);
      }
  
      private void drawPacman(Canvas canvas,Paint paint){
          float x=getWidth()/2;
          float y=getHeight()/2;
  
          canvas.save();
  
          canvas.translate(x, y);
          canvas.rotate(degrees1);
          paint.setAlpha(255);
          RectF rectF1=new RectF(-x/1.7f,-y/1.7f,x/1.7f,y/1.7f);
          canvas.drawArc(rectF1, 0, 270, true, paint);
  
          canvas.restore();
  
          canvas.save();
          canvas.translate(x, y);
          canvas.rotate(degrees2);
          paint.setAlpha(255);
          RectF rectF2=new RectF(-x/1.7f,-y/1.7f,x/1.7f,y/1.7f);
          canvas.drawArc(rectF2,90,270,true,paint);
          canvas.restore();
      }
  
  
      private void drawCircle(Canvas canvas, Paint paint) {
          float radius=getWidth()/11;
          paint.setAlpha(alpha);
          canvas.drawCircle(translateX, getHeight() / 2, radius, paint);
      }
  
      @Override
      public List<Animator> createAnimation() {
          List<Animator> animators=new ArrayList<>();
          float startT=getWidth()/11;
          ValueAnimator translationAnim=ValueAnimator.ofFloat(getWidth()-startT,getWidth()/2);
          translationAnim.setDuration(650);
          translationAnim.setInterpolator(new LinearInterpolator());
          translationAnim.setRepeatCount(-1);
          translationAnim.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
              @Override
              public void onAnimationUpdate(ValueAnimator animation) {
                  translateX = (float) animation.getAnimatedValue();
                  postInvalidate();
              }
          });
          translationAnim.start();
  
          ValueAnimator alphaAnim=ValueAnimator.ofInt(255,122);
          alphaAnim.setDuration(650);
          alphaAnim.setRepeatCount(-1);
          alphaAnim.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
              @Override
              public void onAnimationUpdate(ValueAnimator animation) {
                  alpha = (int) animation.getAnimatedValue();
                  postInvalidate();
              }
          });
          alphaAnim.start();
  
          ValueAnimator rotateAnim1=ValueAnimator.ofFloat(0, 45, 0);
          rotateAnim1.setDuration(650);
          rotateAnim1.setRepeatCount(-1);
          rotateAnim1.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
              @Override
              public void onAnimationUpdate(ValueAnimator animation) {
                  degrees1 = (float) animation.getAnimatedValue();
                  postInvalidate();
              }
          });
          rotateAnim1.start();
  
          ValueAnimator rotateAnim2=ValueAnimator.ofFloat(0,-45,0);
          rotateAnim2.setDuration(650);
          rotateAnim2.setRepeatCount(-1);
          rotateAnim2.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
              @Override
              public void onAnimationUpdate(ValueAnimator animation) {
                  degrees2 = (float) animation.getAnimatedValue();
                  postInvalidate();
              }
          });
          rotateAnim2.start();
  
          animators.add(translationAnim);
          animators.add(alphaAnim);
          animators.add(rotateAnim1);
          animators.add(rotateAnim2);
          return animators;
      }
  }
  