package me.cyning.widget;
import android.animation.Animator;
import android.animation.AnimatorSet;
import android.animation.ObjectAnimator;
import android.content.Context;
import android.content.res.TypedArray;
import android.util.AttributeSet;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.animation.AccelerateInterpolator;
import android.view.animation.DecelerateInterpolator;
import android.widget.FrameLayout;
import android.widget.ImageView;
import android.widget.TextView;
import me.cyning.loading.R;
/**
* Created by zzz40500 on 15/4/6.
*/
public class LoadingView extends FrameLayout {
private ShapeLoadingView shapeLoadingView;
private ImageView indicationIm;
private TextView loadTextView;
private static final int ANIMATION_DURATION=500;
private String loadText;
private float mDistance =200;
public LoadingView(Context context) {
super(context);
}
public LoadingView(Context context, AttributeSet attrs) {
super(context, attrs,0);
init(context,attrs);
}
private void init(Context context,AttributeSet attrs) {
TypedArray typedArray= context
.obtainStyledAttributes(attrs, R.styleable.LoadingView);
loadText= typedArray.getString(R.styleable.LoadingView_loadingText);
typedArray.recycle();
}
public LoadingView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
init(context,attrs);
}
public LoadingView(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
super(context, attrs, defStyleAttr, defStyleRes);
init(context,attrs);
}
public int dip2px( float dipValue){
final float scale = getContext().getResources().getDisplayMetrics().density;
return (int)(dipValue * scale + 0.5f);
}
@Override
protected void onFinishInflate() {
super.onFinishInflate();
View view= LayoutInflater.from(getContext()).inflate(R.layout.load_view,null);
mDistance =dip2px(54f);
LayoutParams layoutParams=new LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);
layoutParams.gravity= Gravity.CENTER;
shapeLoadingView= (ShapeLoadingView) view.findViewById(R.id.shapeLoadingView);
indicationIm= (ImageView) view.findViewById(R.id.indication);
loadTextView= (TextView) view.findViewById(R.id.promptTV);
setLoadingText(loadText);
addView(view,layoutParams);
this.postDelayed(new Runnable() {
@Override
public void run() {
freeFall();
}
},900);
}
public void setLoadingText(CharSequence loadingText){
loadTextView.setText(loadingText);
}
/**
* 上抛
*/
public void upThrow( ){
ObjectAnimator objectAnimator=ObjectAnimator.ofFloat(shapeLoadingView,"translationY", mDistance,0);
ObjectAnimator scaleIndication=ObjectAnimator.ofFloat(indicationIm,"scaleX",0.2f,1);
ObjectAnimator objectAnimator1=null;
switch (shapeLoadingView.getShape()){
case SHAPE_RECT:
objectAnimator1 = ObjectAnimator.ofFloat(shapeLoadingView, "rotation", 0, -120);
break;
case SHAPE_CIRCLE:
objectAnimator1= ObjectAnimator.ofFloat(shapeLoadingView,"rotation",0,180);
break;
case SHAPE_TRIANGLE:
objectAnimator1 = ObjectAnimator.ofFloat(shapeLoadingView, "rotation", 0, 180);
break;
}
objectAnimator.setDuration(ANIMATION_DURATION);
objectAnimator1.setDuration(ANIMATION_DURATION);
objectAnimator.setInterpolator(new DecelerateInterpolator());
objectAnimator1.setInterpolator(new DecelerateInterpolator());
AnimatorSet animatorSet=new AnimatorSet();
animatorSet.setDuration(ANIMATION_DURATION);
animatorSet.playTogether(objectAnimator,objectAnimator1,scaleIndication);
animatorSet.addListener(new Animator.AnimatorListener() {
@Override
public void onAnimationStart(Animator animation) {
}
@Override
public void onAnimationEnd(Animator animation) {
freeFall();
}
@Override
public void onAnimationCancel(Animator animation) {
}
@Override
public void onAnimationRepeat(Animator animation) {
}
});
animatorSet.start();
}
/**
* 下落
*/
public void freeFall(){
ObjectAnimator objectAnimator=ObjectAnimator.ofFloat(shapeLoadingView,"translationY",0, mDistance);
ObjectAnimator scaleIndication=ObjectAnimator.ofFloat(indicationIm,"scaleX",1,0.2f);
objectAnimator.setDuration(ANIMATION_DURATION);
objectAnimator.setInterpolator(new AccelerateInterpolator());
AnimatorSet animatorSet=new AnimatorSet();
animatorSet.setDuration(ANIMATION_DURATION);
animatorSet.playTogether(objectAnimator,scaleIndication);
animatorSet.addListener(new Animator.AnimatorListener() {
@Override
public void onAnimationStart(Animator animation) {
}
@Override
public void onAnimationEnd(Animator animation) {
shapeLoadingView.changeShape();
upThrow();
}
@Override
public void onAnimationCancel(Animator animation) {
}
@Override
public void onAnimationRepeat(Animator animation) {
}
});
animatorSet.start();
}
}