当调用整个图表时animateY
,barChart
会重新绘制整个图表,将条形从 y-zero 设置为 y-new。
barChart.invalidate();
barChart.animateY(1000);
是否可以将动画限制为值更改。从而允许用户查看图表如何从 y-old(例如 100)增长到 y-new(例如 120)?
当调用整个图表时animateY
,barChart
会重新绘制整个图表,将条形从 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();