在barChart上调用animateY时,将重绘整个图表,将条形图从y-zero设置为y-new.
barChart.invalidate(); barChart.animateY(1000);
是否可以将动画限制为值更改.因此,允许用户看到图表如何从y-old(例如100)增长到y-new(例如120)?
解决方法
我遇到了同样的问题,无法找到解决方案.所以,我创建了一个可以调用来处理这种任务的类.
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); } } } }
你可以像这样调用这个类:
List<Entry> oldEntries = ... List<Entry> newEntries = ... AnimateDataSetChanged changer = new AnimateDataSetChanged(600,mChart,oldEntries,currentDataEntries); changer.setInterpolator(new AccelerateInterpolator()); // optionally set the Interpolator changer.run();