package com.example.administrator.cookman.ui.component.twinklingrefreshlayout.Footer;
import android.annotation.TargetApi;
import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.os.Build;
import android.support.annotation.IntDef;
import android.util.AttributeSet;
import android.view.View;
import com.example.administrator.cookman.R;
import com.wang.avi.indicator.BallBeatIndicator;
import com.wang.avi.indicator.BallClipRotateIndicator;
import com.wang.avi.indicator.BallClipRotateMultipleIndicator;
import com.wang.avi.indicator.BallClipRotatePulseIndicator;
import com.wang.avi.indicator.BallGridBeatIndicator;
import com.wang.avi.indicator.BallGridPulseIndicator;
import com.wang.avi.indicator.BallPulseIndicator;
import com.wang.avi.indicator.BallPulseRiseIndicator;
import com.wang.avi.indicator.BallPulseSyncIndicator;
import com.wang.avi.indicator.BallRotateIndicator;
import com.wang.avi.indicator.BallScaleIndicator;
import com.wang.avi.indicator.BallScaleMultipleIndicator;
import com.wang.avi.indicator.BallScaleRippleIndicator;
import com.wang.avi.indicator.BallScaleRippleMultipleIndicator;
import com.wang.avi.indicator.BallSpinFadeLoaderIndicator;
import com.wang.avi.indicator.BallTrianglePathIndicator;
import com.wang.avi.indicator.BallZigZagDeflectIndicator;
import com.wang.avi.indicator.BallZigZagIndicator;
import com.wang.avi.indicator.BaseIndicatorController;
import com.wang.avi.indicator.CubeTransitionIndicator;
import com.wang.avi.indicator.LineScaleIndicator;
import com.wang.avi.indicator.LineScalePartyIndicator;
import com.wang.avi.indicator.LineScalePulseOutIndicator;
import com.wang.avi.indicator.LineScalePulseOutRapidIndicator;
import com.wang.avi.indicator.LineSpinFadeLoaderIndicator;
import com.wang.avi.indicator.PacmanIndicator;
import com.wang.avi.indicator.SemiCircleSpinIndicator;
import com.wang.avi.indicator.SquareSpinIndicator;
import com.wang.avi.indicator.TriangleSkewSpinIndicator;
/**
* Created by fangxiao on 15/12/2.
*/
public class ProgressView extends View {
//indicators
public static final int BallPulse=0;
public static final int BallGridPulse=1;
public static final int BallClipRotate=2;
public static final int BallClipRotatePulse=3;
public static final int SquareSpin=4;
public static final int BallClipRotateMultiple=5;
public static final int BallPulseRise=6;
public static final int BallRotate=7;
public static final int CubeTransition=8;
public static final int BallZigZag=9;
public static final int BallZigZagDeflect=10;
public static final int BallTrianglePath=11;
public static final int BallScale=12;
public static final int LineScale=13;
public static final int LineScaleParty=14;
public static final int BallScaleMultiple=15;
public static final int BallPulseSync=16;
public static final int BallBeat=17;
public static final int LineScalePulseOut=18;
public static final int LineScalePulseOutRapid=19;
public static final int BallScaleRipple=20;
public static final int BallScaleRippleMultiple=21;
public static final int BallSpinFadeLoader=22;
public static final int LineSpinFadeLoader=23;
public static final int TriangleSkewSpin=24;
public static final int Pacman=25;
public static final int BallGridBeat=26;
public static final int SemiCircleSpin=27;
@IntDef(flag = true,
value = {
BallPulse,
BallGridPulse,
BallClipRotate,
BallClipRotatePulse,
SquareSpin,
BallClipRotateMultiple,
BallPulseRise,
BallRotate,
CubeTransition,
BallZigZag,
BallZigZagDeflect,
BallTrianglePath,
BallScale,
LineScale,
LineScaleParty,
BallScaleMultiple,
BallPulseSync,
BallBeat,
LineScalePulseOut,
LineScalePulseOutRapid,
BallScaleRipple,
BallScaleRippleMultiple,
BallSpinFadeLoader,
LineSpinFadeLoader,
TriangleSkewSpin,
Pacman,
BallGridBeat,
SemiCircleSpin
})
public @interface Indicator{}
//Sizes (with defaults in DP)
public static final int DEFAULT_SIZE=50;
//attrs
int mIndicatorId;
int mIndicatorColor;
Paint mPaint;
BaseIndicatorController mIndicatorController;
private boolean mHasAnimation;
public ProgressView(Context context) {
super(context);
init(null, 0);
}
public ProgressView(Context context, AttributeSet attrs) {
super(context, attrs);
init(attrs, 0);
}
public ProgressView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
init(attrs, defStyleAttr);
}
@TargetApi(Build.VERSION_CODES.LOLLIPOP)
public ProgressView(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
super(context, attrs, defStyleAttr, defStyleRes);
init(attrs, defStyleAttr);
}
private void init(AttributeSet attrs, int defStyle) {
TypedArray a = getContext().obtainStyledAttributes(attrs, R.styleable.AVLoadingIndicatorView);
mIndicatorId=a.getInt(R.styleable.AVLoadingIndicatorView_indicator, BallPulse);
mIndicatorColor=a.getColor(R.styleable.AVLoadingIndicatorView_indicator_color, Color.WHITE);
a.recycle();
mPaint=new Paint();
mPaint.setColor(mIndicatorColor);
mPaint.setStyle(Paint.Style.FILL);
mPaint.setAntiAlias(true);
applyIndicator();
}
public void setIndicatorId(int indicatorId){
mIndicatorId = indicatorId;
applyIndicator();
}
public void setIndicatorColor(int color){
mIndicatorColor = color;
mPaint.setColor(mIndicatorColor);
this.invalidate();
}
private void applyIndicator(){
switch (mIndicatorId){
case BallPulse:
mIndicatorController=new BallPulseIndicator();
break;
case BallGridPulse:
mIndicatorController=new BallGridPulseIndicator();
break;
case BallClipRotate:
mIndicatorController=new BallClipRotateIndicator();
break;
case BallClipRotatePulse:
mIndicatorController=new BallClipRotatePulseIndicator();
break;
case SquareSpin:
mIndicatorController=new SquareSpinIndicator();
break;
case BallClipRotateMultiple:
mIndicatorController=new BallClipRotateMultipleIndicator();
break;
case BallPulseRise:
mIndicatorController=new BallPulseRiseIndicator();
break;
case BallRotate:
mIndicatorController=new BallRotateIndicator();
break;
case CubeTransition:
mIndicatorController=new CubeTransitionIndicator();
break;
case BallZigZag:
mIndicatorController=new BallZigZagIndicator();
break;
case BallZigZagDeflect:
mIndicatorController=new BallZigZagDeflectIndicator();
break;
case BallTrianglePath:
mIndicatorController=new BallTrianglePathIndicator();
break;
case BallScale:
mIndicatorController=new BallScaleIndicator();
break;
case LineScale:
mIndicatorController=new LineScaleIndicator();
break;
case LineScaleParty:
mIndicatorController=new LineScalePartyIndicator();
break;
case BallScaleMultiple:
mIndicatorController=new BallScaleMultipleIndicator();
break;
case BallPulseSync:
mIndicatorController=new BallPulseSyncIndicator();
break;
case BallBeat:
mIndicatorController=new BallBeatIndicator();
break;
case LineScalePulseOut:
mIndicatorController=new LineScalePulseOutIndicator();
break;
case LineScalePulseOutRapid:
mIndicatorController=new LineScalePulseOutRapidIndicator();
break;
case BallScaleRipple:
mIndicatorController=new BallScaleRippleIndicator();
break;
case BallScaleRippleMultiple:
mIndicatorController=new BallScaleRippleMultipleIndicator();
break;
case BallSpinFadeLoader:
mIndicatorController=new BallSpinFadeLoaderIndicator();
break;
case LineSpinFadeLoader:
mIndicatorController=new LineSpinFadeLoaderIndicator();
break;
case TriangleSkewSpin:
mIndicatorController=new TriangleSkewSpinIndicator();
break;
case Pacman:
mIndicatorController=new PacmanIndicator();
break;
case BallGridBeat:
mIndicatorController=new BallGridBeatIndicator();
break;
case SemiCircleSpin:
mIndicatorController=new SemiCircleSpinIndicator();
break;
}
mIndicatorController.setTarget(this);
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
int width = dp2px(DEFAULT_SIZE);//measureDimension(dp2px(DEFAULT_SIZE), widthMeasureSpec);
int height = dp2px(DEFAULT_SIZE);//measureDimension(dp2px(DEFAULT_SIZE), heightMeasureSpec);
setMeasuredDimension(width, height);
}
private int measureDimension(int defaultSize,int measureSpec){
int result = defaultSize;
int specMode = MeasureSpec.getMode(measureSpec);
int specSize = MeasureSpec.getSize(measureSpec);
if (specMode == MeasureSpec.EXACTLY) {
result = specSize;
} else if (specMode == MeasureSpec.AT_MOST) {
result = Math.min(defaultSize, specSize);
} else {
result = defaultSize;
}
return result;
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
drawIndicator(canvas);
}
@Override
protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
super.onLayout(changed, left, top, right, bottom);
if (!mHasAnimation){
mHasAnimation=true;
applyAnimation();
}
}
@Override
public void setVisibility(int v) {
if (getVisibility() != v) {
super.setVisibility(v);
if (v == GONE || v == INVISIBLE) {
mIndicatorController.setAnimationStatus(BaseIndicatorController.AnimStatus.END);
} else {
mIndicatorController.setAnimationStatus(BaseIndicatorController.AnimStatus.START);
}
}
}
public void stopAnim(){
mIndicatorController.setAnimationStatus(BaseIndicatorController.AnimStatus.END);
}
public void startAnim(){
mIndicatorController.setAnimationStatus(BaseIndicatorController.AnimStatus.START);
}
@Override
protected void onDetachedFromWindow() {
super.onDetachedFromWindow();
mIndicatorController.setAnimationStatus(BaseIndicatorController.AnimStatus.CANCEL);
}
@Override
protected void onAttachedToWindow() {
super.onAttachedToWindow();
mIndicatorController.setAnimationStatus(BaseIndicatorController.AnimStatus.START);
}
void drawIndicator(Canvas canvas){
mIndicatorController.draw(canvas, mPaint);
}
void applyAnimation(){
mIndicatorController.initAnimation();
}
private int dp2px(int dpValue) {
return (int) getContext().getResources().getDisplayMetrics().density * dpValue;
}
}