public class MainActivity extends AppCompatActivity { private Timer timer = new Timer(); private TimerTask task; private Handler handler; private String title = "随机数"; private XYSeries series; private XYMultipleSeriesDataset mDataset; private GraphicalView chart; private XYMultipleSeriesRenderer renderer; private int addX = -1, addY; int[] xv = new int[100]; int[] yv = new int[100]; private LinearLayout layout1; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); layout1 = (LinearLayout) findViewById(R.id.chart); //这个类用来放置曲线上的所有点,是一个点的集合,根据这些点画出曲线 series = new XYSeries(title); //创建一个数据集的实例,这个数据集将被用来创建图表 mDataset = new XYMultipleSeriesDataset(); //将点集添加到这个数据集中 mDataset.addSeries(series); //以下都是曲线的样式和属性等等的设置,renderer相当于一个用来给图表做渲染的句柄 int color = Color.GREEN; PointStyle style = PointStyle.CIRCLE; renderer = buildRenderer(color, style, true); //设置好图表的样式 setChartSettings(renderer, "X", "Y", 0, 100, 0, 90, Color.WHITE, Color.WHITE); //生成图表 chart =ChartFactory.getLineChartView(this,mDataset,renderer); // chart = ChartFactory.getTimeChartView(this, getDateDemoDataset(), getDemoRenderer(), "mm:ss"); layout1.addView(chart, new ViewGroup.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.MATCH_PARENT)); ; //这里的Handler实例将配合下面的Timer实例,完成定时更新图表的功能 handler = new Handler() { @Override public void handleMessage(Message msg) { //刷新图表 updateChart(); super.handleMessage(msg); } }; task = new TimerTask() { @Override public void run() { Message message = new Message(); message.what = 1; handler.sendMessage(message); } }; timer.schedule(task, 500, 500); } protected XYMultipleSeriesRenderer buildRenderer(int color, PointStyle style, boolean fill) { XYMultipleSeriesRenderer renderer = new XYMultipleSeriesRenderer(); //设置图表中曲线本身的样式,包括颜色、点的大小以及线的粗细等 XYSeriesRenderer r = new XYSeriesRenderer(); r.setColor(color); r.setPointStyle(style); r.setFillPoints(fill); r.setLineWidth(5); renderer.addSeriesRenderer(r); return renderer; } protected void setChartSettings(XYMultipleSeriesRenderer renderer, String xTitle, String yTitle, double xMin, double xMax, double yMin, double yMax, int axesColor, int labelsColor) { //有关对图表的渲染可参看api文档 renderer.setChartTitle(title); renderer.setXTitle(xTitle); renderer.setYTitle(yTitle); renderer.setXAxisMin(xMin); renderer.setXAxisMax(xMax); renderer.setYAxisMin(yMin); renderer.setYAxisMax(yMax); renderer.setAxesColor(Color.BLACK);//设置坐标轴颜色 renderer.setLabelsColor(labelsColor); renderer.setXLabelsColor(Color.BLACK); renderer.setYLabelsColor(0,Color.BLACK); //网格线 //renderer.setShowGrid(true); // renderer.setGridColor(Color.GREEN); renderer.setXLabels(20); renderer.setYLabels(10); // renderer.setXTitle("间隔"); renderer.setYTitle("dBm"); renderer.setYLabelsAlign(Align.RIGHT); renderer.setPointSize((float) 2); renderer.setShowLegend(false); renderer.setPanEnabled(true,true); //renderer.setBackgroundColor(Color.WHITE); renderer.setLabelsTextSize(20.0f); renderer.setMarginsColor(Color.WHITE); //renderer.setAxisTitleTextSize(16.0f); // render = new XYMultipleSeriesRenderer(); // render.setChartTitle("光照度实时曲线"); // render.setChartTitleTextSize(20);//设置整个图表标题文字的大小 // render.setAxisTitleTextSize(16);//设置轴标题文字的大小 // render.setAxesColor(Color.BLACK); // render.setXTitle("时间"); // render.setYTitle("光照度"); // // render.setLabelsTextSize(16);//设置轴刻度文字的大小 // render.setLabelsColor(Color.BLACK); // render.setXLabelsColor(Color.BLACK); // render.setYLabelsColor(0, Color.BLACK); // render.setLegendTextSize(15);//设置图例文字大小 // //render.setShowLegend(false);//显示不显示在这里设置,非常完美 // // XYSeriesRenderer r = new XYSeriesRenderer();//设置颜色和点类型 // r.setColor(Color.RED); // r.setPointStyle(PointStyle.CIRCLE); // r.setFillPoints(true); // r.setChartValuesSpacing(3); // // render.addSeriesRenderer(r); // render.setYLabelsAlign(Align.RIGHT);//刻度值相对于刻度的位置 // render.setShowGrid(true);//显示网格 // render.setYAxisMax(12);//设置y轴的范围 // render.setYAxisMin(-2); // render.setYLabels(7);//分七等份 // // // render.setInScroll(true); // render.setLabelsTextSize(14); // render.setLabelsColor(Color.BLACK); // //render.getSeriesRendererAt(0).setDisplayChartValues(true); //显示折线上点的数值 // render.setPanEnabled(false,false);//禁止报表的拖动 // render.setPointSize(5f);//设置点的大小(图上显示的点的大小和图例中点的大小都会被设置) // render.setMargins(new int[]{20,30,90,10}); //设置图形四周的留白 // render.setMarginsColor(Color.WHITE); // render.setXLabels(0);// 取消X坐标的数字zjk,只有自己定义横坐标是才设为此值 } private void updateChart() { //设置好下一个需要增加的节点 addX = 0; addY = (int)(Math.random() * 90); // addY=new Random().nextInt(5) + 1; //移除数据集中旧的点集 mDataset.removeSeries(series); //判断当前点集中到底有多少点,因为屏幕总共只能容纳100个,所以当点数超过100时,长度永远是100 int length = series.getItemCount(); if (length > 100) { length = 100; } //将旧的点集中x和y的数值取出来放入backup中,并且将x的值加1,造成曲线向右平移的效果 for (int i = 0; i < length; i++) { xv[i] = (int) series.getX(i) + 1; yv[i] = (int) series.getY(i); } //点集先清空,为了做成新的点集而准备 series.clear(); //将新产生的点首先加入到点集中,然后在循环体中将坐标变换后的一系列点都重新加入到点集中 //这里可以试验一下把顺序颠倒过来是什么效果,即先运行循环体,再添加新产生的点 series.add(addX, addY); for (int k = 0; k < length; k++) { series.add(xv[k], yv[k]); } //在数据集中添加新的点集 mDataset.addSeries(series); //视图更新,没有这一步,曲线不会呈现动态 //如果在非UI主线程中,需要调用postInvalidate(),具体参考api chart.invalidate(); } @Override public void onDestroy() { //当结束程序时关掉Timer timer.cancel(); super.onDestroy(); } }
AChartEngine之动态折线图
最新推荐文章于 2017-11-12 20:22:50 发布
本文介绍了一个使用Java实现的动态图表更新程序。通过Timer和Handler机制定时生成随机数据并更新图表,展示了如何创建XYSeries和XYMultipleSeriesDataset来绘制动态曲线图,并对图表样式进行了详细配置。
8603

被折叠的 条评论
为什么被折叠?



