大佬教程收集整理的这篇文章主要介绍了android – aChartEngine:如何显示实时更新,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
主要活动包含来自achartENGIne库(LineChart类)的4个图表,使用GraphicalView添加到其视图中
总而言之,每100毫秒,我的主要活动收到一个回调和
>复制捆绑包中的数据
>将其添加到4个不同的数据集中(XymultipleSeriesDataset)
>在包含数据集的4个图表上调用repaint()
调用重绘时,数据集将不会更新,直到下一个包从另一个线程到达,100毫秒后.我假设100毫秒应该足以重绘视图.
我在这里发布了一个包含数据集和视图的小版本,
以及实施和使用的主要活动的一部分
/** This class contains the data and renderer used to draw a chart */ public class LineChartData { public static enum Series {X,Y,Z}; public static final int MAX_NB_VALUES_PER_SERIE = 1000; private XymultipleSeriesDataset mDataset = new XymultipleSeriesDataset(); private XymultipleSeriesRenderer mRenderer = new XymultipleSeriesRenderer(); privatE int[] mColors = new int[]{Color.RED,Color.GREEN,Color.bLUE}; private GraphicalView mChartView; private Boolean mFollow = true; private Boolean mTouchedDown = false; public LineChartData(Context context,String title,String[] seriesNames) { // Since we save only 3 colors,the progrAMM will not support more than 3 series per chart for(int i = 0; i < seriesNames.length; ++i) { XYSeries serie = new XYSeries(seriesNames[i].toString()); mDataset.addSeries(seriE); XYSeriesRenderer serieRenderer = new XYSeriesRenderer(); serieRenderer.setColor(mColors[i]); mRenderer.addSeriesRenderer(serieRenderer); } mRenderer.setMargins(new int[] { 20,30,0 }); mRenderer.setLegendHeight(50); //mRenderer.setShowLegend(true); mRenderer.setCharttitle(titlE); mRenderer.setMarginsColor(Color.WHITE); mRenderer.setXAxismax(SetTingsActivity.DEFAULT_DISPLAY_RANGE); mRenderer.setXAxisMin(0); mChartView = ChartFactory.getLineChartView(context,mDataset,mRenderer); mChartView.repaint(); } public void addData(int seriEID,double x,double y) { mDataset.getSeriesAt(seriEID).add(x,y); } public void repaint() { mChartView.invalidate(); } public void updateDisplayWindow(int displayRangE) { if(!mFollow) { return; } double maxX = mDataset.getSeries()[0].getMaxX(); if(maxX > displayRangE) { mRenderer.setXAxismax(maxX); mRenderer.setXAxisMin(maxX-displayRangE); } else { mRenderer.setXAxismax(displayRangE); mRenderer.setXAxisMin(0); } } public void deleteOldestValues() { XYSeries[] series = mDataset.getSeries(); for(XYSeries serie : series) { while(serie.getItemCount() > MAX_NB_VALUES_PER_SERIE) { serie.remove(0); } } } }
创建4个图表:
protected void onCreate(Bundle b) { mAccelChartView = new LineChartData(this,getString(R.String.Accel),new String[] {getString(R.String.xAxis),getString(R.String.zAxis),getString(R.String.zAxis)}); mGyroChartView = new LineChartData(this,getString(R.String.Gyro),getString(R.String.zAxis)}); mPressureChartView = new LineChartData(this,getString(R.String.PressurE),new String[] {getString(R.String.pressureAxis)}); mEcgChartView = new LineChartData(this,getString(R.String.ECG),new String[] {getString(R.String.ecgAxis)}); LinearLayout layoutAccel = (LinearLayout) findViewById(R.id.accelChart); LinearLayout layoutGyro = (LinearLayout) findViewById(R.id.gyroChart); LinearLayout layoutPressure = (LinearLayout) findViewById(R.id.pressureChart); LinearLayout layoutEcg = (LinearLayout) findViewById(R.id.ecgChart); layoutAccel.addView(mAccelChartView.getView(),0); layoutGyro.addView(mGyroChartView.getView(),0); layoutPressure.addView(mPressureChartView.getView(),0); layoutEcg.addView(mEcgChartView.getView(),0); }
更新图表
private void updateViewUsingmessage(String action,Bundle newData) { if(action.equals(BluetoothCollecterThread.MSG_updatE_CHART)) { addFromBundle(newData,mLogger.isLogging()); mAccelChartView.updateDisplayWindow(mDisplayRangE); mAccelChartView.deleteOldestValues(); mGyroChartView.updateDisplayWindow(mDisplayRangE); mGyroChartView.deleteOldestValues(); mPressureChartView.updateDisplayWindow(mDisplayRangE); mPressureChartView.deleteOldestValues(); mEcgChartView.updateDisplayWindow(mDisplayRangE); mEcgChartView.deleteOldestValues(); mAccelChartView.repaint(); mGyroChartView.repaint(); mPressureChartView.repaint(); mEcgChartView.repaint(); } }
它可能看起来很大但实际上很容易.我有两个问题,我不知道是否有联系:
首先,每秒几次,一张图表中的第一个系列在另一张图表上绘制(见下图).我检查了我的代码,找不到任何解决方案.而且,它似乎真的是随机发生的,因此它看起来更像是来自achartENGIne库的并发问题.
这带来了我的第二个问题.日志显示来自垃圾收集器的消息过多,特别是WAIT_FOR_CONCURRENT_GC类型的消息被阻止,这显然是不好的.
我发现这个链接:http://www.voidcn.com/article/p-rembizwq-btn.html表明内存分配问题仍然存在于achartENGIne中,但最后一个版本应足以显示几个实时1000点的图形.即使我将数据更新设置为1秒而不是100毫秒,我仍然会遇到视觉故障
正确的行为:4个图表实时更新(两个第一个有3个系列,两个最后有1个系列)
@L_489_22@
错误:图表2中的红色系列显示在其他图表上
http://s903.photobucket.com/user/bperreno/media/wrong1_zpsd33eec83.png.html?sort=3&o=0
数据正在实时移动,但有时,第二张图片中显示的故障发生,一两帧,然后消失.
有没有人知道如何,至少,修复显示问题?也许希望告诉我如何解决achartENGIne垃圾收集的过度使用问题
非常感谢!
编辑04.12.2013
我现在使用achartENGIne源而不是.jar,@R_134_9447@查看值.看到“seTinScroll”不起作用后,我看了一下代码.在GraphicalView.onDraw方法中,我比较了seTinScroll为true或false时使用的值.
int top = mRect.top; int left = mRect.left; int width = mRect.width(); int height = mRect.getheight(); if(mRenderer.isInScroll()) { top = 0; left = 0; width = getMeasuredWidth(); height = getMeasuredHeight(); }
从mRect或getMeasuredXXX()传来的值始终相同.在这两种情况下,顶部和左侧都是零.所以(至少在这种情况下),inScroll = true无效
以上是大佬教程为你收集整理的android – aChartEngine:如何显示实时更新全部内容,希望文章能够帮你解决android – aChartEngine:如何显示实时更新所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。