2015-01-31 17 views
8

Quando si chiama animateY su un barChart l'intero grafico viene ridisegnato, animando le barre da y-zero a y-nuovo.mpandroidchart - anima il cambiamento del valore y nel diagramma a barre

barChart.invalidate(); 
barChart.animateY(1000); 

E 'possibile limitare l'animazione alla variazione di valore. Così permettendo all'utente di vedere come il grafico cresce da y-vecchio (per esempio 100) a y-nuovo (ad esempio 120)?

+0

Io non la penso così. La versione corrente di MPChart non supporta questo. – abhinav

+0

È possibile ma dovresti implementarlo da solo. Un modo semplice sarebbe quello di disegnare valori y da 100 a 120 usando un timer. Quindi disegni 100 e 101 poi 102 ... fino a 120. –

risposta

-1

Se viene chiamato (...) (di qualsiasi tipo), non è necessario alcun ulteriore richiamo di invalidate() per aggiornare il grafico. read more here

2

Mi trovavo di fronte allo stesso problema e non sono riuscito a trovare una soluzione. Quindi, ho creato una classe che può essere chiamata per gestire questo tipo di attività.

import android.view.animation.Interpolator; 
import android.view.animation.LinearInterpolator; 
import com.github.mikephil.charting.charts.BarLineChartBase; 
import com.github.mikephil.charting.charts.Chart; 
import com.github.mikephil.charting.data.Entry; 
import java.util.ArrayList; 
import java.util.Calendar; 
import java.util.List; 
import android.os.Handler; 

public class AnimateDataSetChanged { 
    private int duration; 
    private long startTime; 
    private int fps = 30; 
    private Handler timerHandler; 
    private Chart chart; 
    private List<Entry> oldData; 
    private List<Entry> newData; 
    private Interpolator interpolator; 

    public AnimateDataSetChanged(int duration, Chart chart, List<Entry> oldData, List<Entry> newData){ 
     this.duration = duration; 
     this.chart = chart; 
     this.oldData = new ArrayList<>(oldData); 
     this.newData = new ArrayList<>(newData); 
     interpolator = new LinearInterpolator(); 
    } 

    public void setInterpolator(Interpolator interpolator){ 
     this.interpolator = interpolator; 
    } 

    public void run(int fps){ 
     this.fps = fps; 
     run(); 
    } 

    public void run(){ 
     startTime = Calendar.getInstance().getTimeInMillis(); 
     timerHandler = new Handler(); 
     Runner runner = new Runner(); 
     runner.run(); 
    } 

    private class Runner implements Runnable{ 
     @Override 
     public void run() { 
      float increment = (Calendar.getInstance().getTimeInMillis() - startTime)/(float)duration; 
      increment = interpolator.getInterpolation(increment < 0f ? 0f : increment > 1f ? 1f :increment); 
      chart.getData().getDataSetByIndex(0).clear(); 
      for(int i = 0; i < newData.size(); i++){ 
       float oldY = oldData.size() > i ? oldData.get(i).getY() : newData.get(i).getY(); 
       float oldX = oldData.size() > i ? oldData.get(i).getX() : newData.get(i).getX(); 
       float newX = newData.get(i).getX(); 
       float newY = newData.get(i).getY(); 
       Entry e = new Entry(oldX + (newX - oldX) * increment, oldY + (newY - oldY) * increment); 
       chart.getData().getDataSetByIndex(0).addEntry(e); 
      } 
      chart.getXAxis().resetAxisMaximum(); 
      chart.getXAxis().resetAxisMinimum(); 
      chart.notifyDataSetChanged(); 
      chart.refreshDrawableState(); 
      chart.invalidate(); 
      if(chart instanceof BarLineChartBase){ 
       ((BarLineChartBase)chart).setAutoScaleMinMaxEnabled(true); 
      } 
      if(increment < 1f){ 
       timerHandler.postDelayed(this, 1000/fps); 
      } 
     } 
    } 
} 

È possibile chiamare la classe in questo modo:

List<Entry> oldEntries = ... 
List<Entry> newEntries = ... 

AnimateDataSetChanged changer = new AnimateDataSetChanged(600, mChart, oldEntries, currentDataEntries); 
changer.setInterpolator(new AccelerateInterpolator()); // optionally set the Interpolator 
changer.run(); 
Problemi correlati