热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

曲线实时AChartEngine实现Android实时曲线绘制

PS:今天上午,非常郁闷,有很多简单基础的问题搞得我有些迷茫,哎,代码几天不写就忘。目前又不当COO,还是得用心记代码哦!前两天由于项目需要做了一个基于Android的实时采集系统,需要对参

PS:今天上午,非常郁闷,有很多简单基础的问题搞得我有些迷茫,哎,代码几天不写就忘。目前又不当COO,还是得用心记代码哦!

    前两天由于项目需要做了一个基于Android的实时采集系统,需要对参数以实时曲线的形式表现,在网上找了找基于Android的图表工具以及源码,最终还是选取了AChartEngine来绘制,这个图表库用起来非常方便。上面将自己写的一个随机数的实时曲线和大家分享一下~~

    本程序是基于Android2.2的

    思绪比较简单,即在一个MainActivity中点击按钮跳入另一个RtChartsActivity并表现实时曲线。

    MainActivity中

public class MainActivity extends Activity {
private Button button;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
button=(Button)this.findViewById(R.id.button);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent();
intent.setClass(MainActivity.this, RtChartsActivity.class);
startActivity(intent);
}
});
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.activity_main, menu);
return true;
}
}

    在RtChartsActivity中,首先初始化曲线,然后在Timer中准时updateChart()曲线

    每日一道理
无知者为梦想中的虚幻而苦苦等待,换回的不是所求的,而是岁月在脸上留下的印痕,一事无成的人一生便是虚度。生活中,与其花时间去等待,不如加快步伐去追寻理想,试着与时间赛跑,也许身躯、心理会感到劳累,但这样的生活毕竟是充实的。
public class RtChartsActivity extends Activity {

private Timer timer = new Timer();
private GraphicalView chart;
private TextView textview;
private TimerTask task;
private int addY = -1;
private long addX;
/**曲线数量*/
private static final int SERIES_NR=1;
private static final String TAG = "message";
private TimeSeries series1;
private XYMultipleSeriesDataset dataset1;
private Handler handler;
private Random random=new Random();
/**时间数据*/
Date[] xcache = new Date[20];
/**数据*/
int[] ycache = new int[20];
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.rtchart);
LinearLayout layout = (LinearLayout)findViewById(R.id.linearlayout);
//生成图表
chart = ChartFactory.getTimeChartView(this, getDateDemoDataset(), getDemoRenderer(), "hh:mm:ss");
layout.addView(chart, new LayoutParams(LayoutParams.WRAP_CONTENT,380));
//为TextView添加事件
textview = (TextView)findViewById(R.id.myview);
textview.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(RtChartsActivity.this, "ceshiview", 1).show();
Intent intent = new Intent();
intent.setClass(RtChartsActivity.this, MainActivity.class);
startActivity(intent);
}
});
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 = 200;
handler.sendMessage(message);
}
};
timer.schedule(task, 2*1000,1000);
}
private void updateChart() {
//设定长度为20
int length = series1.getItemCount();
if(length>=20) length = 20;
addY=random.nextInt()%10;
addX=new Date().getTime();

//将后面的点放入缓存
for (int i = 0; i xcache[i] = new Date((long)series1.getX(i));
ycache[i] = (int) series1.getY(i);
}
series1.clear();
series1.add(new Date(addX), addY);
for (int k = 0; k series1.add(xcache[k], ycache[k]);
}
//在数据集中添加新的点集
dataset1.removeSeries(series1);
dataset1.addSeries(series1);
//曲线更新
chart.invalidate();
}
/**
* 设定如表样式
* @return
*/
private XYMultipleSeriesRenderer getDemoRenderer() {
XYMultipleSeriesRenderer renderer = new XYMultipleSeriesRenderer();
renderer.setChartTitle("实时曲线");//标题
renderer.setChartTitleTextSize(20);
renderer.setXTitle("时间"); //x轴说明
renderer.setAxisTitleTextSize(16);
renderer.setAxesColor(Color.BLACK);
renderer.setLabelsTextSize(15); //数轴刻度字体巨细
renderer.setLabelsColor(Color.BLACK);
renderer.setLegendTextSize(15); //曲线说明
renderer.setXLabelsColor(Color.BLACK);
renderer.setYLabelsColor(0,Color.BLACK);
renderer.setShowLegend(false);
renderer.setMargins(new int[] {20, 30, 100, 0});
XYSeriesRenderer r = new XYSeriesRenderer();
r.setColor(Color.BLUE);
r.setChartValuesTextSize(15);
r.setChartValuesSpacing(3);
r.setPointStyle(PointStyle.CIRCLE);
r.setFillBelowLine(true);
r.setFillBelowLineColor(Color.WHITE);
r.setFillPoints(true);
renderer.addSeriesRenderer(r);
renderer.setMarginsColor(Color.WHITE);
renderer.setPanEnabled(false,false);
renderer.setShowGrid(true);
renderer.setYAxisMax(50);
renderer.setYAxisMin(-30);
renderer.setInScroll(true); //调整巨细
return renderer;
}
/**
* 数据对象
* @return
*/
private XYMultipleSeriesDataset getDateDemoDataset() {
dataset1 = new XYMultipleSeriesDataset();
final int nr = 10;
long value = new Date().getTime();
Random r = new Random();
for (int i = 0; i series1 = new TimeSeries("Demo series " + (i + 1));
for (int k = 0; k series1.add(new Date(value+k*1000), 20 +r.nextInt() % 10);
}
dataset1.addSeries(series1);
}
Log.i(TAG, dataset1.toString());
return dataset1;
}
@Override
public void onDestroy() {
//当结束程序时关掉Timer
timer.cancel();
super.onDestroy();
};
}

    效果是这样的~~

    曲线和实时

    源程序可以在这里下载http://download.csdn.net/detail/best198706/5408151

文章结束给大家分享下程序员的一些笑话语录: PC软件体积大,是因为一个PC软件功能往往较多,能够满足你一个方面的需求,而一个iphone软件往往没几行代码,干一件很小的事情,自然需要的软件就多。就像吃西瓜和吃瓜子的来比数目,单位不同啊。


推荐阅读
  • Java容器中的compareto方法排序原理解析
    本文从源码解析Java容器中的compareto方法的排序原理,讲解了在使用数组存储数据时的限制以及存储效率的问题。同时提到了Redis的五大数据结构和list、set等知识点,回忆了作者大学时代的Java学习经历。文章以作者做的思维导图作为目录,展示了整个讲解过程。 ... [详细]
  • JavaSE笔试题-接口、抽象类、多态等问题解答
    本文解答了JavaSE笔试题中关于接口、抽象类、多态等问题。包括Math类的取整数方法、接口是否可继承、抽象类是否可实现接口、抽象类是否可继承具体类、抽象类中是否可以有静态main方法等问题。同时介绍了面向对象的特征,以及Java中实现多态的机制。 ... [详细]
  • 如何自行分析定位SAP BSP错误
    The“BSPtag”Imentionedintheblogtitlemeansforexamplethetagchtmlb:configCelleratorbelowwhichi ... [详细]
  • Java太阳系小游戏分析和源码详解
    本文介绍了一个基于Java的太阳系小游戏的分析和源码详解。通过对面向对象的知识的学习和实践,作者实现了太阳系各行星绕太阳转的效果。文章详细介绍了游戏的设计思路和源码结构,包括工具类、常量、图片加载、面板等。通过这个小游戏的制作,读者可以巩固和应用所学的知识,如类的继承、方法的重载与重写、多态和封装等。 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • Java中包装类的设计原因以及操作方法
    本文主要介绍了Java中设计包装类的原因以及操作方法。在Java中,除了对象类型,还有八大基本类型,为了将基本类型转换成对象,Java引入了包装类。文章通过介绍包装类的定义和实现,解答了为什么需要包装类的问题,并提供了简单易用的操作方法。通过本文的学习,读者可以更好地理解和应用Java中的包装类。 ... [详细]
  • 先看官方文档TheJavaTutorialshavebeenwrittenforJDK8.Examplesandpracticesdescribedinthispagedontta ... [详细]
  • 欢乐的票圈重构之旅——RecyclerView的头尾布局增加
    项目重构的Git地址:https:github.comrazerdpFriendCircletreemain-dev项目同步更新的文集:http:www.jianshu.comno ... [详细]
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • 目录实现效果:实现环境实现方法一:基本思路主要代码JavaScript代码总结方法二主要代码总结方法三基本思路主要代码JavaScriptHTML总结实 ... [详细]
  • android listview OnItemClickListener失效原因
    最近在做listview时发现OnItemClickListener失效的问题,经过查找发现是因为button的原因。不仅listitem中存在button会影响OnItemClickListener事件的失效,还会导致单击后listview每个item的背景改变,使得item中的所有有关焦点的事件都失效。本文给出了一个范例来说明这种情况,并提供了解决方法。 ... [详细]
  • 本文主要解析了Open judge C16H问题中涉及到的Magical Balls的快速幂和逆元算法,并给出了问题的解析和解决方法。详细介绍了问题的背景和规则,并给出了相应的算法解析和实现步骤。通过本文的解析,读者可以更好地理解和解决Open judge C16H问题中的Magical Balls部分。 ... [详细]
  • 本文详细介绍了Java中vector的使用方法和相关知识,包括vector类的功能、构造方法和使用注意事项。通过使用vector类,可以方便地实现动态数组的功能,并且可以随意插入不同类型的对象,进行查找、插入和删除操作。这篇文章对于需要频繁进行查找、插入和删除操作的情况下,使用vector类是一个很好的选择。 ... [详细]
  • Java学习笔记之面向对象编程(OOP)
    本文介绍了Java学习笔记中的面向对象编程(OOP)内容,包括OOP的三大特性(封装、继承、多态)和五大原则(单一职责原则、开放封闭原则、里式替换原则、依赖倒置原则)。通过学习OOP,可以提高代码复用性、拓展性和安全性。 ... [详细]
  • JDK源码学习之HashTable(附带面试题)的学习笔记
    本文介绍了JDK源码学习之HashTable(附带面试题)的学习笔记,包括HashTable的定义、数据类型、与HashMap的关系和区别。文章提供了干货,并附带了其他相关主题的学习笔记。 ... [详细]
author-avatar
kaxiaoliog_334
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有