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

AChartEngine应用之LineChart(模拟动态生命特征值图)

原文链接:https:my.oschina.netqiuzhpingblog611664AChartEngine应用之LineChart(模拟动态生命特征值图)接着上一次写的内容,


原文链接:https://my.oschina.net/qiuzhping/blog/611664

AChartEngine应用之LineChart(模拟动态生命特征值图)

接着上一次写的内容,构建动态曲线图,并产生与用户交互,考虑到数据都是活动的,不可能总是用静态数据,所以我下面的demo就是模拟。项目作用:模拟生命特征值图,动态显示分钟脉搏生命特征值走向每隔1000ms产生50组数据,并填充到表格中,主要使用的到是Handler+Task,因为我是用Activity显示这个表格每次产生的数据都需要快速的填充到主线程UI中,所以我就用Handler,这里的数据我都是采用随机数表示,这个demo可以作为开发医疗设备显示生命症状的表格信息参考,实际项目中如果需要用的每隔XX时间产生XX数据,最好是用Web提供数据,这样可以实现多个客户端 共享数据

构建LineChart图的步骤主要分为以下四步,还需要在项目中引入AChartEngine依赖jar包,在Manifest中添加:


1.     设置XYMultipleSeriesRenderer



mXYRenderer = buildRenderer(color, style, true);

                   mXYRenderer.setShowGrid(true);// 显示表格

                   mXYRenderer.setGridColor(Color.GREEN);// 据说绿色代表健康色调,不过我比较喜欢灰色

                   mXYRenderer.setXLabels(20);

                   mXYRenderer.setYLabels(10);

                   mXYRenderer.setYLabelsAlign(Align.RIGHT);// 右对齐

                   // mXYRenderer.setPointSize((float) 2);

                   mXYRenderer.setShowLegend(false);// 不显示图例

                   mXYRenderer.setZoomEnabled(false);

                   mXYRenderer.setPanEnabled(true, false);

                   mXYRenderer.setClickEnabled(false);

                   setChartSettings(mXYRenderer, title, "时间", "数量", 0, X, 0, Y,

                                     Color.WHITE, Color.WHITE);// 这个是采用官方APIdemo提供给的方法

                                                                                                       // 设置好图表的样式

 


2.     构建数据源CategorySeries



series = new XYSeries(title);// 这个类用来放置曲线上的所有点,是一个点的集合,根据这些点画出曲线

mDataset = new XYMultipleSeriesDataset(); // 创建一个数据集的实例,这个数据集将被用来创建图表

mDataset.removeSeries(series);// 移除数据集中旧的点集

                   series.clear();// 点集先清空,为了做成新的点集而准备

 

                   for (int k = 0; k

                            int y = (int) (Math.random() * Y);

                            series.add(k, y);

                   }

                   mDataset.addSeries(series);// 在数据集中添加新的点集

                   mViewChart.invalidate();// 视图更新,没有这一步,曲线不会呈现动态

 


3.     通过ChartFactory.getLineChartView生成曲线图



mViewChart = ChartFactory.getLineChartView(context, mDataset,

                                     mXYRenderer);// 通过ChartFactory生成图表

 

                   mLayout.addView(mViewChart, new LayoutParams(LayoutParams.FILL_PARENT,

                                     LayoutParams.FILL_PARENT));// 将图表添加到布局中去

4.     构建定时器任务



private final class StartBtn implements OnClickListener {

                   @Override

                   public void onClick(View arg0) {

                            Log.i("qiuzhping", "startBtn onClick");

                            handler = new Handler() {// 简单的通过Handler+Task形成一个定时任务,从而完成定时更新图表的功能

                                     @Override

                                     public void handleMessage(Message msg) {

                                               if (msg.what == 1) {

                                                        Log.i("qiuzhping", "Handler handleMessage");

                                                        updateChart(); // 刷新图表,handler的作用是将此方法并入主线程,在非主线程是不能修改UI的

                                                        super.handleMessage(msg);

                                               }

                                     }

                            };

 

                            task = new TimerTask() {// 定时器

                                     @Override

                                     public void run() {

                                               Message message = new Message();

                                               message.what = 1;// 设置标志

                                               handler.sendMessage(message);

                                               Log.i("qiuzhping", "TimerTask run");

                                     }

                            };

                            timer.schedule(task, 1000, 1000);// 运行时间和间隔都是1000ms

                   }

         }

效果图:



Code:

package com.qiuzhping.achart.app;
import java.util.Timer;
import java.util.TimerTask;
import org.achartengine.ChartFactory;
import org.achartengine.GraphicalView;
import org.achartengine.chart.PointStyle;
import org.achartengine.model.XYMultipleSeriesDataset;
import org.achartengine.model.XYSeries;
import org.achartengine.renderer.XYMultipleSeriesRenderer;
import org.achartengine.renderer.XYSeriesRenderer;
import android.app.Activity;
import android.content.Context;
import android.graphics.Color;
import android.graphics.Paint.Align;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup.LayoutParams;
import android.widget.Button;
import android.widget.LinearLayout;
import com.qiuzhping.achart.R;
/**
* @项目名称:模拟生命特征值图
* @类名称:AnalogPulse
* @作者:Qiuzhping
* @时间:2014-1-17上午11:46:51
* @作用 :模拟生命特征值图,动态显示分钟脉搏走向
* 每隔1000ms产生50组数据,并填充到表格中,主要使用的到是Handler+Task,因为我是用Activity显示这个表格
* 每次产生的数据都需要快速的填充到主线程UI中,所以我就用Handler,这里的数据我都是采用随机数表示,这个demo可以作为开发
* 医疗设备显示生命症状的表格信息参考,实际项目中如果需要用的每隔XX时间产生XX数据,最好是用Web提供数据,这样可以实现多个客户端 共享数据
* @说明:环境是android4.0
*/
public class LifeEigenvalues extends Activity {
private Button startBtn = null;
private Button stopBtn = null;
private Timer timer = new Timer();// 定时器
private TimerTask task;// 任务
private Handler handler;// 主要用于更新表格视图
private String title = "线性统计图示例";
private XYSeries series;// XY数据点
private XYMultipleSeriesDataset mDataset;// XY轴数据集
private GraphicalView mViewChart;// 用于显示现行统计图
private XYMultipleSeriesRenderer mXYRenderer;// 线性统计图主描绘器
private Context context;// 用于获取上下文对象
private LinearLayout mLayout;
private int X = 50;// X数据集大小
private int Y = 50;//
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.analog_pulse);
startBtn = (Button) findViewById(R.id.startBtn);
startBtn.setOnClickListener(new StartBtn());
stopBtn = (Button) findViewById(R.id.stopBtn);
stopBtn.setOnClickListener(new StopBtn());
cOntext= getApplicationContext();// 获取上下文对象
mLayout = (LinearLayout) findViewById(R.id.chart);// 这里获得xy_chart的布局,下面会把图表画在这个布局里面
series = new XYSeries(title);// 这个类用来放置曲线上的所有点,是一个点的集合,根据这些点画出曲线
mDataset = new XYMultipleSeriesDataset(); // 创建一个数据集的实例,这个数据集将被用来创建图表
mDataset.addSeries(series);// 将点集添加到这个数据集中
int color = Color.RED;// 设置颜色
PointStyle style = PointStyle.CIRCLE;// 设置外观周期性显示
mXYRenderer = buildRenderer(color, style, true);
mXYRenderer.setShowGrid(true);// 显示表格
mXYRenderer.setGridColor(Color.GREEN);// 据说绿色代表健康色调,不过我比较喜欢灰色
mXYRenderer.setXLabels(20);
mXYRenderer.setYLabels(10);
mXYRenderer.setYLabelsAlign(Align.RIGHT);// 右对齐
// mXYRenderer.setPointSize((float) 2);
mXYRenderer.setShowLegend(false);// 不显示图例
mXYRenderer.setZoomEnabled(false);
mXYRenderer.setPanEnabled(true, false);
mXYRenderer.setClickEnabled(false);
setChartSettings(mXYRenderer, title, "时间", "数量", 0, X, 0, Y,
Color.WHITE, Color.WHITE);// 这个是采用官方APIdemo提供给的方法
// 设置好图表的样式
mViewChart = ChartFactory.getLineChartView(context, mDataset,
mXYRenderer);// 通过ChartFactory生成图表
mLayout.addView(mViewChart, new LayoutParams(LayoutParams.FILL_PARENT,
LayoutParams.FILL_PARENT));// 将图表添加到布局中去
}
@Override
public void onDestroy() {
if (timer != null) {// 当结束程序时关掉Timer
timer.cancel();
Log.i("qiuzhping", "onDestroy timer cancel");
super.onDestroy();
}
}
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(3);
renderer.addSeriesRenderer(r);
return renderer;
}
protected void setChartSettings(XYMultipleSeriesRenderer renderer,
String title, 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(axesColor);
renderer.setLabelsColor(labelsColor);
}
/**
* @方法名: updateChart
* @作者:Qiuzhping
* @作用: 主要工作是每隔1000ms刷新整个统计图 产生50组数据,完全填充表格
*/
private void updateChart() {// 主要工作是每隔1000ms刷新整个统计图
Log.i("qiuzhping", "updateChart ok");
mDataset.removeSeries(series);// 移除数据集中旧的点集
series.clear();// 点集先清空,为了做成新的点集而准备
for (int k = 0; k int y = (int) (Math.random() * Y);
series.add(k, y);
}
mDataset.addSeries(series);// 在数据集中添加新的点集
mViewChart.invalidate();// 视图更新,没有这一步,曲线不会呈现动态
}
private final class StartBtn implements OnClickListener {
@Override
public void onClick(View arg0) {
Log.i("qiuzhping", "startBtn onClick");
handler = new Handler() {// 简单的通过Handler+Task形成一个定时任务,从而完成定时更新图表的功能
@Override
public void handleMessage(Message msg) {
if (msg.what == 1) {
Log.i("qiuzhping", "Handler handleMessage");
updateChart(); // 刷新图表,handler的作用是将此方法并入主线程,在非主线程是不能修改UI的
super.handleMessage(msg);
}
}
};
task = new TimerTask() {// 定时器
@Override
public void run() {
Message message = new Message();
message.what = 1;// 设置标志
handler.sendMessage(message);
Log.i("qiuzhping", "TimerTask run");
}
};
timer.schedule(task, 1000, 1000);// 运行时间和间隔都是1000ms
}
}
private final class StopBtn implements OnClickListener {
@Override
public void onClick(View arg0) {
Log.i("qiuzhping", "stopBtn onClick");
LifeEigenvalues.this.finish();
}
}
}


对应项目:http://download.csdn.net/detail/qiu_11/6858385

未完待续。。。。


AChartEngine应用系列文章

(一)AChartEngine简介

(二)AChartEngine应用之PieChart(饼图)

(三)AChartEngine应用之BarChart(柱形图)

(四)AChartEngine应用之PieChart(动态饼图,允许产生动态数据并显示)

(五)AChartEngine应用之LineChart(模拟生命特征值图)

(六)AChartEngine应用之LineChart(模拟三角函数sin,cos)

(七)AChartEngine高级应用CombinedXYChart(组合统计图)







 

转载于:https://my.oschina.net/qiuzhping/blog/611664



推荐阅读
  • 在Docker中,将主机目录挂载到容器中作为volume使用时,常常会遇到文件权限问题。这是因为容器内外的UID不同所导致的。本文介绍了解决这个问题的方法,包括使用gosu和suexec工具以及在Dockerfile中配置volume的权限。通过这些方法,可以避免在使用Docker时出现无写权限的情况。 ... [详细]
  • ASP.NET2.0数据教程之十四:使用FormView的模板
    本文介绍了在ASP.NET 2.0中使用FormView控件来实现自定义的显示外观,与GridView和DetailsView不同,FormView使用模板来呈现,可以实现不规则的外观呈现。同时还介绍了TemplateField的用法和FormView与DetailsView的区别。 ... [详细]
  • 本文介绍了Swing组件的用法,重点讲解了图标接口的定义和创建方法。图标接口用来将图标与各种组件相关联,可以是简单的绘画或使用磁盘上的GIF格式图像。文章详细介绍了图标接口的属性和绘制方法,并给出了一个菱形图标的实现示例。该示例可以配置图标的尺寸、颜色和填充状态。 ... [详细]
  • 本文介绍了pack布局管理器在Perl/Tk中的使用方法及注意事项。通过调用pack()方法,可以控制部件在显示窗口中的位置和大小。同时,本文还提到了在使用pack布局管理器时,应注意将部件分组以便在水平和垂直方向上进行堆放。此外,还介绍了使用Frame部件或Toplevel部件来组织部件在窗口内的方法。最后,本文强调了在使用pack布局管理器时,应避免在中间切换到grid布局管理器,以免造成混乱。 ... [详细]
  • 带添加按钮的GridView,item的删除事件
    先上图片效果;gridView无数据时显示添加按钮,有数据时,第一格显示添加按钮,后面显示数据:布局文件:addr_manage.xml<?xmlve ... [详细]
  • OpenMap教程4 – 图层概述
    本文介绍了OpenMap教程4中关于地图图层的内容,包括将ShapeLayer添加到MapBean中的方法,OpenMap支持的图层类型以及使用BufferedLayer创建图像的MapBean。此外,还介绍了Layer背景标志的作用和OMGraphicHandlerLayer的基础层类。 ... [详细]
  • 本文介绍了解决java开源项目apache commons email简单使用报错的方法,包括使用正确的JAR包和正确的代码配置,以及相关参数的设置。详细介绍了如何使用apache commons email发送邮件。 ... [详细]
  • [echarts] 同指标对比柱状图相关的知识介绍及应用示例
    本文由编程笔记小编为大家整理,主要介绍了echarts同指标对比柱状图相关的知识,包括对比课程通过率最高的8个课程和最低的8个课程以及全校的平均通过率。文章提供了一个应用示例,展示了如何使用echarts制作同指标对比柱状图,并对代码进行了详细解释和说明。该示例可以帮助读者更好地理解和应用echarts。 ... [详细]
  • ZSI.generate.Wsdl2PythonError: unsupported local simpleType restriction ... [详细]
  • XML介绍与使用的概述及标签规则
    本文介绍了XML的基本概念和用途,包括XML的可扩展性和标签的自定义特性。同时还详细解释了XML标签的规则,包括标签的尖括号和合法标识符的组成,标签必须成对出现的原则以及特殊标签的使用方法。通过本文的阅读,读者可以对XML的基本知识有一个全面的了解。 ... [详细]
  • 关键词:Golang, Cookie, 跟踪位置, net/http/cookiejar, package main, golang.org/x/net/publicsuffix, io/ioutil, log, net/http, net/http/cookiejar ... [详细]
  • 开发笔记:spring boot项目打成war包部署到服务器的步骤与注意事项
    本文介绍了将spring boot项目打成war包并部署到服务器的步骤与注意事项。通过本文的学习,读者可以了解到如何将spring boot项目打包成war包,并成功地部署到服务器上。 ... [详细]
  • Question该提问来源于开源项目:react-native-device-info/react-native-device-info ... [详细]
  • 我用Tkinter制作了一个图形用户界面,有两个主按钮:“开始”和“停止”。请您就如何使用“停止”按钮终止“开始”按钮为以下代码调用的已运行功能提供建议 ... [详细]
  • 前端开发工程师必读书籍有哪些值得推荐?我们直接进入代码复杂版式设置,如下所示,先写些标签,源码在这个链接里面:https://codepen.io/Shadid ... [详细]
author-avatar
PANJIANSHUANG_406
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有