package com.wang.avi; 
 | 
  
 | 
import android.animation.ValueAnimator; 
 | 
import android.graphics.Canvas; 
 | 
import android.graphics.Color; 
 | 
import android.graphics.ColorFilter; 
 | 
import android.graphics.Paint; 
 | 
import android.graphics.PixelFormat; 
 | 
import android.graphics.Rect; 
 | 
import android.graphics.drawable.Animatable; 
 | 
import android.graphics.drawable.Drawable; 
 | 
  
 | 
import java.util.ArrayList; 
 | 
import java.util.HashMap; 
 | 
  
 | 
/** 
 | 
 * Created by Jack Wang on 2016/8/5. 
 | 
 */ 
 | 
  
 | 
public abstract class Indicator extends Drawable implements Animatable { 
 | 
  
 | 
    private HashMap<ValueAnimator,ValueAnimator.AnimatorUpdateListener> mUpdateListeners=new HashMap<>(); 
 | 
  
 | 
    private ArrayList<ValueAnimator> mAnimators; 
 | 
    private int alpha = 255; 
 | 
    private static final Rect ZERO_BOUNDS_RECT = new Rect(); 
 | 
    protected Rect drawBounds = ZERO_BOUNDS_RECT; 
 | 
  
 | 
    private boolean mHasAnimators; 
 | 
  
 | 
    private Paint mPaint=new Paint(); 
 | 
  
 | 
    public Indicator(){ 
 | 
        mPaint.setColor(Color.WHITE); 
 | 
        mPaint.setStyle(Paint.Style.FILL); 
 | 
        mPaint.setAntiAlias(true); 
 | 
    } 
 | 
  
 | 
    public int getColor() { 
 | 
        return mPaint.getColor(); 
 | 
    } 
 | 
  
 | 
    public void setColor(int color) { 
 | 
        mPaint.setColor(color); 
 | 
    } 
 | 
  
 | 
    @Override 
 | 
    public void setAlpha(int alpha) { 
 | 
        this.alpha = alpha; 
 | 
    } 
 | 
  
 | 
    @Override 
 | 
    public int getAlpha() { 
 | 
        return alpha; 
 | 
    } 
 | 
  
 | 
    @Override 
 | 
    public int getOpacity() { 
 | 
        return PixelFormat.OPAQUE; 
 | 
    } 
 | 
  
 | 
    @Override 
 | 
    public void setColorFilter(ColorFilter colorFilter) { 
 | 
  
 | 
    } 
 | 
  
 | 
    @Override 
 | 
    public void draw(Canvas canvas) { 
 | 
        draw(canvas,mPaint); 
 | 
    } 
 | 
  
 | 
    public abstract void draw(Canvas canvas, Paint paint); 
 | 
  
 | 
    public abstract ArrayList<ValueAnimator> onCreateAnimators(); 
 | 
  
 | 
    @Override 
 | 
    public void start() { 
 | 
        ensureAnimators(); 
 | 
  
 | 
        if (mAnimators == null) { 
 | 
            return; 
 | 
        } 
 | 
  
 | 
        // If the animators has not ended, do nothing. 
 | 
        if (isStarted()) { 
 | 
            return; 
 | 
        } 
 | 
        startAnimators(); 
 | 
        invalidateSelf(); 
 | 
    } 
 | 
  
 | 
    private void startAnimators() { 
 | 
        for (int i = 0; i < mAnimators.size(); i++) { 
 | 
            ValueAnimator animator = mAnimators.get(i); 
 | 
  
 | 
            //when the animator restart , add the updateListener again because they 
 | 
            // was removed by animator stop . 
 | 
            ValueAnimator.AnimatorUpdateListener updateListener=mUpdateListeners.get(animator); 
 | 
            if (updateListener!=null){ 
 | 
                animator.addUpdateListener(updateListener); 
 | 
            } 
 | 
  
 | 
            animator.start(); 
 | 
        } 
 | 
    } 
 | 
  
 | 
    private void stopAnimators() { 
 | 
        if (mAnimators!=null){ 
 | 
            for (ValueAnimator animator : mAnimators) { 
 | 
                if (animator != null && animator.isStarted()) { 
 | 
                    animator.removeAllUpdateListeners(); 
 | 
                    animator.end(); 
 | 
                } 
 | 
            } 
 | 
        } 
 | 
    } 
 | 
  
 | 
    private void ensureAnimators() { 
 | 
        if (!mHasAnimators) { 
 | 
            mAnimators = onCreateAnimators(); 
 | 
            mHasAnimators = true; 
 | 
        } 
 | 
    } 
 | 
  
 | 
    @Override 
 | 
    public void stop() { 
 | 
        stopAnimators(); 
 | 
    } 
 | 
  
 | 
    private boolean isStarted() { 
 | 
        for (ValueAnimator animator : mAnimators) { 
 | 
            return animator.isStarted(); 
 | 
        } 
 | 
        return false; 
 | 
    } 
 | 
  
 | 
    @Override 
 | 
    public boolean isRunning() { 
 | 
        for (ValueAnimator animator : mAnimators) { 
 | 
            return animator.isRunning(); 
 | 
        } 
 | 
        return false; 
 | 
    } 
 | 
  
 | 
    /** 
 | 
     *  Your should use this to add AnimatorUpdateListener when 
 | 
     *  create animator , otherwise , animator doesn't work when 
 | 
     *  the animation restart . 
 | 
     * @param updateListener 
 | 
     */ 
 | 
    public void addUpdateListener(ValueAnimator animator, ValueAnimator.AnimatorUpdateListener updateListener){ 
 | 
        mUpdateListeners.put(animator,updateListener); 
 | 
    } 
 | 
  
 | 
    @Override 
 | 
    protected void onBoundsChange(Rect bounds) { 
 | 
        super.onBoundsChange(bounds); 
 | 
        setDrawBounds(bounds); 
 | 
    } 
 | 
  
 | 
    public void setDrawBounds(Rect drawBounds) { 
 | 
        setDrawBounds(drawBounds.left, drawBounds.top, drawBounds.right, drawBounds.bottom); 
 | 
    } 
 | 
  
 | 
    public void setDrawBounds(int left, int top, int right, int bottom) { 
 | 
        this.drawBounds = new Rect(left, top, right, bottom); 
 | 
    } 
 | 
  
 | 
    public void postInvalidate(){ 
 | 
        invalidateSelf(); 
 | 
    } 
 | 
  
 | 
    public Rect getDrawBounds() { 
 | 
        return drawBounds; 
 | 
    } 
 | 
  
 | 
    public int getWidth(){ 
 | 
        return drawBounds.width(); 
 | 
    } 
 | 
  
 | 
    public int getHeight(){ 
 | 
        return drawBounds.height(); 
 | 
    } 
 | 
  
 | 
    public int centerX(){ 
 | 
        return drawBounds.centerX(); 
 | 
    } 
 | 
  
 | 
    public int centerY(){ 
 | 
        return drawBounds.centerY(); 
 | 
    } 
 | 
  
 | 
    public float exactCenterX(){ 
 | 
        return drawBounds.exactCenterX(); 
 | 
    } 
 | 
  
 | 
    public float exactCenterY(){ 
 | 
        return drawBounds.exactCenterY(); 
 | 
    } 
 | 
  
 | 
} 
 |