Tôi đang đối mặt với cùng một vấn đề và không thể tìm thấy giải pháp. Vì vậy, tôi đã tạo một lớp có thể được gọi để xử lý loại nhiệm vụ này.
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);
}
}
}
}
Bạn có thể gọi các lớp như sau:
List<Entry> oldEntries = ...
List<Entry> newEntries = ...
AnimateDataSetChanged changer = new AnimateDataSetChanged(600, mChart, oldEntries, currentDataEntries);
changer.setInterpolator(new AccelerateInterpolator()); // optionally set the Interpolator
changer.run();
Tôi không nghĩ như vậy. Phiên bản hiện tại của MPChart không hỗ trợ điều này. – abhinav
Có thể nhưng bạn sẽ phải tự mình thực hiện nó. Một cách đơn giản là vẽ các giá trị y từ 100 đến 120 bằng bộ hẹn giờ. Vì vậy, bạn vẽ 100 rồi 101 rồi 102 ... cho đến 120. –