Android GraphView实时逐点绘制图表问题求助
解决GraphView实时逐点绘制的问题
我来帮你排查下问题所在~你当前的代码每次调用mSeries1.resetData(generateData())都是把完整的数据集一次性替换到图表里,所以自然会直接显示所有点,没法实现逐点绘制的效果。要实现逐点实时绘制,我们需要每次只添加一个新数据点,而不是重置整个数据集。
修改思路
- 维护一个全局的数据集和当前绘制的索引,用来控制每次添加哪个点
- 初始化图表时先创建空的系列(或者只添加第一个点)
- 在定时任务中,每次向系列里追加一个新点,而不是重置全部数据
- 可选:设置图表的视口跟随最新数据,让用户始终能看到新添加的点
修改后的完整代码
public class MainActivity extends AppCompatActivity { private LineGraphSeries<DataPoint> mSeries1; private Runnable mTimer1; private final Handler mHandler = new Handler(); // 维护数据集和当前绘制索引 private DataPoint[] allDataPoints; private int currentPointIndex = 0; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); GraphView graph = (GraphView) findViewById(R.id.graph); // 初始化完整数据集 allDataPoints = generateData(); // 创建空的系列,或者先添加第一个点 mSeries1 = new LineGraphSeries<>(); graph.addSeries(mSeries1); // 可选:设置图表视口,让x轴跟随最新数据 graph.getViewport().setScalable(true); graph.getViewport().setScrollable(true); graph.getViewport().setYAxisBoundsManual(true); graph.getViewport().setMinY(0); graph.getViewport().setMaxY(12); // 根据你的数据范围调整 } private DataPoint[] generateData() { return new DataPoint[]{ new DataPoint(0, 1), new DataPoint(1, 5), new DataPoint(2, 4), new DataPoint(3, 6), new DataPoint(4, 8), new DataPoint(5, 10), }; } @Override protected void onResume() { super.onResume(); mTimer1 = new Runnable() { @Override public void run() { // 检查是否还有未绘制的点 if (currentPointIndex < allDataPoints.length) { // 追加单个点到系列中 mSeries1.appendData(allDataPoints[currentPointIndex], true, allDataPoints.length); currentPointIndex++; // 如果所有点都绘制完了,可以停止定时任务 if (currentPointIndex >= allDataPoints.length) { mHandler.removeCallbacks(this); return; } } // 继续下一次绘制 mHandler.postDelayed(this, 300); } }; // 启动定时任务 mHandler.postDelayed(mTimer1, 300); } @Override public void onPause() { mHandler.removeCallbacks(mTimer1); super.onPause(); } }
关键改动说明
- 使用
appendData()方法替代resetData():这个方法会把单个数据点追加到现有系列中,而不是替换全部数据,这是实现逐点绘制的核心 - 新增
currentPointIndex控制绘制进度:确保每次只添加下一个未绘制的点,直到所有点都绘制完成 - 可选的视口设置:让图表自动滚动到最新数据位置,提升用户体验
XML布局代码无需修改:
<com.jjoe64.graphview.GraphView android:layout_width="match_parent" android:layout_height="200dip" android:id="@+id/graph" />
内容的提问来源于stack exchange,提问作者Shadow
相关产品推荐
相关产品推荐

