2015-01-31 16 views
8

Khi gọi animateY trên barChart toàn bộ biểu đồ được vẽ lại, làm động các thanh từ y-0 sang y mới.mpandroidchart - animate y-giá trị thay đổi trong barchart

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

Có thể hạn chế hoạt ảnh cho thay đổi giá trị không. Do đó cho phép người dùng xem biểu đồ phát triển từ tuổi già (ví dụ: 100) thành y-new (ví dụ: 120)?

+0

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

+0

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. –

Trả lời

-1

Nếu animate (...) (của bất kỳ loại nào) được gọi, không cần gọi thêm invalidate() là cần thiết để làm mới biểu đồ. read more here

2

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(); 
Các vấn đề liên quan