package com.bdc.ociney.view;
import android.animation.AnimatorSet;
import android.animation.IntEvaluator;
import android.animation.ValueAnimator;
import android.annotation.SuppressLint;
import android.content.Context;
import android.content.res.TypedArray;
import android.util.AttributeSet;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.ViewTreeObserver;
import android.view.animation.AccelerateInterpolator;
import android.widget.LinearLayout;
import android.widget.TextView;
import com.bdc.ociney.R;
/**
* Created by florentchampigny on 29/04/2014.
*/
public class DoubleProgress extends LinearLayout {
private static final String TAG = "DoubleProgress";
View mView;
String stringHaut = "Haut";
String stringBas = "Bas";
float max;
int temps;
int attente;
int textFromAlpha = 40;
int textToAlpha = 100;
View barreHaut, barreBas;
View progressBarHaut, progressBarBas;
TextView valeurHaut, valeurBas;
TextView texteHaut, texteBas;
float vHaut = 0;
float vBas = 0;
public DoubleProgress(Context context) {
this(context, null);
}
public DoubleProgress(Context context, AttributeSet attrs) {
super(context, attrs);
TypedArray styledAttrs = context.obtainStyledAttributes(attrs, R.styleable.DoubleProgress);
try {
stringHaut = styledAttrs.getString(R.styleable.DoubleProgress_texteHaut);
stringBas = styledAttrs.getString(R.styleable.DoubleProgress_texteBas);
max = styledAttrs.getFloat(R.styleable.DoubleProgress_max, 5);
temps = styledAttrs.getInt(R.styleable.DoubleProgress_temps, 1000);
attente = styledAttrs.getInt(R.styleable.DoubleProgress_attente, 0);
textFromAlpha = styledAttrs.getInt(R.styleable.DoubleProgress_attente, 0);
textToAlpha = styledAttrs.getInt(R.styleable.DoubleProgress_attente, 0);
} catch (Exception e) {
e.printStackTrace();
} finally {
styledAttrs.recycle();
}
LayoutInflater inflater = (LayoutInflater) context
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
mView = inflater.inflate(R.layout.double_progress, this, true); //ajoute la view
charger();
remplir();
}
@Override
protected void onAttachedToWindow() {
super.onAttachedToWindow();
}
@Override
protected void onDetachedFromWindow() {
super.onDetachedFromWindow();
}
private void charger() {
barreHaut = mView.findViewById(R.id.barreHaut);
barreBas = mView.findViewById(R.id.barreBas);
progressBarHaut = barreHaut.findViewById(R.id.progressBar);
progressBarBas = barreBas.findViewById(R.id.progressBar);
valeurHaut = (TextView) barreHaut.findViewById(R.id.valeur);
valeurBas = (TextView) barreBas.findViewById(R.id.valeur);
texteHaut = (TextView) barreHaut.findViewById(R.id.text);
texteBas = (TextView) barreBas.findViewById(R.id.text);
}
private void remplir() {
texteHaut.setText(stringHaut);
texteBas.setText(stringBas);
}
public void setValeurHaut(float f) {
vHaut = f;
}
public void setValeurBas(float f) {
vBas = f;
}
public void animer() {
/**
* Attente de la largeur de la vue barreHaut
*/
barreHaut.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
@SuppressLint("NewApi")
@SuppressWarnings("deprecation")
@Override
public void onGlobalLayout() {
//now we can retrieve the width and height
int width = barreHaut.getWidth();
animer(width);
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.JELLY_BEAN)
barreHaut.getViewTreeObserver().removeOnGlobalLayoutListener(this);
else
barreHaut.getViewTreeObserver().removeGlobalOnLayoutListener(this);
}
});
}
private void animer(int width) {
valeurHaut.setText("");
valeurBas.setText("");
ViewGroup.LayoutParams params = progressBarHaut.getLayoutParams();
params.width = 0;
progressBarHaut.setLayoutParams(params);
ViewGroup.LayoutParams params2 = progressBarBas.getLayoutParams();
params2.width = 0;
progressBarBas.setLayoutParams(params2);
float largeurMax = barreHaut.getWidth();
float pourcentHaut = vHaut / max;
float pourcentBas = vBas / max;
int largeurHaut = (int) (largeurMax * pourcentHaut);
int largeurtBas = (int) (largeurMax * pourcentBas);
final AnimatorSet anim = new AnimatorSet();
anim.setInterpolator(new AccelerateInterpolator());
anim.setDuration((long) temps);
anim.playTogether(
ValueAnimator.ofObject(new WidthEvaluator(progressBarHaut, valeurHaut, vHaut), 0, largeurHaut),
ValueAnimator.ofObject(new WidthEvaluator(progressBarBas, valeurBas, vBas), 0, largeurtBas)
);
this.postDelayed(new Runnable() {
@Override
public void run() {
anim.start();
}
}, attente);
}
private class WidthEvaluator extends IntEvaluator {
private View v;
private TextView tv;
private float valeur;
public WidthEvaluator(View v, TextView tv, float valeur) {
this.v = v;
this.tv = tv;
this.valeur = valeur;
}
@Override
public Integer evaluate(float fraction, Integer startValue, Integer endValue) {
int num = super.evaluate(fraction, startValue, endValue);
tv.setText(String.format("%.1f", fraction * valeur).replace(",", "."));
ViewGroup.LayoutParams params = v.getLayoutParams();
params.width = num;
v.setLayoutParams(params);
return num;
}
}
}