achartengine画出动态折线图的效果
最近有个项目需要用到实时曲线图,我也上网搜索了一下,最后还是选择使用achartengine这个现成的东西,毕竟自己再canvas一下实在是太麻烦,而且项目时间上也不允许,虽然这个画图引擎比较简单,不过勉强够用了。

下一步问题就来了,我仓促上手,只会画静态图,就是事先定义好几个坐标,然后activity载入的时候折线就已经画好了,可是我的项目要求我每隔一秒种都要把新搜集到的数据添加到图表中去,类似于windows中那个任务管理器里的性能统计图,网上搜来搜去也没找到可用的资源,学习api的文档也没看出门道,只好自己不停地试验了,最后终于用了一种笨方法实现了画动态曲线图,其它的几类图已经没时间在去试了,我想思路应该差不多,回头有空了在说吧。

package com.example.achartdemoactivity;

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.view.ViewGroup.LayoutParams;
import android.widget.LinearLayout;

public class AChartDemoActivity extends Activity {

private Timer timer = new Timer();
    private TimerTask task;
    private Handler handler;
    private String title = "Signal Strength";
    private XYSeries series;
    private XYMultipleSeriesDataset mDataset;
    private GraphicalView chart;
    private XYMultipleSeriesRenderer renderer;
    private Context context;
    private int addX = -1, addY;
    
    int[] xv = new int[100];
    int[] yv = new int[100];

/** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_achart_demo);
        
        context = getApplicationContext();
        
        //这里获得main界面上的布局,下面会把图表画在这个布局里面
        LinearLayout layout = (LinearLayout)findViewById(R.id.linearLayout1);
        
        //这个类用来放置曲线上的所有点,是一个点的集合,根据这些点画出曲线
        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(context, mDataset, renderer);
        
        //将图表添加到布局中去
        layout.addView(chart, new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_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);
        
    }
    
    @Override
    public void onDestroy() {
     //当结束程序时关掉Timer
     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 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);
     renderer.setShowGrid(true);
     renderer.setGridColor(Color.GREEN);
     renderer.setXLabels(20);
     renderer.setYLabels(10);
     renderer.setXTitle("Time");
     renderer.setYTitle("dBm");
     renderer.setYLabelsAlign(Align.RIGHT);
     renderer.setPointSize((float) 2);
     renderer.setShowLegend(false);
    }
    
    private void updateChart() {
    
    //设置好下一个需要增加的节点
    addX = 0;
    addY = (int)(Math.random() * 90);

//移除数据集中旧的点集
    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();
     }
}

转载于:https://www.cnblogs.com/senior-engineer/p/5005875.html

achartengine画出动态折线图相关推荐

  1. html5画布画出折线图,canvas 画出动态折线图

    canvas 是 html5 支持的一个标签,用于图形的绘制.canvas 标签仅仅提供了图形的容器,必须通过 js 脚本来绘制. 比如,绘制一个简单的矩形: 矩形.png var c=documen ...

  2. C#中实现文本读取数据并画出数据折线图

    1.题目 从文本文件中读取数据,数据格式为:空格分隔:每一行为一组数据,依次读取出来,之后将数据存于数组中:继而将其显示至图形中 2.完整代码 using System; using System.C ...

  3. matlab多折线图,MATLAB画出堆叠折线图

    用matlab画下面的图,上下堆叠起来,共用一个横坐标轴 subplot(311), %plot(...); set(gca,'xlim',[0 1.2]); set(gca,'ylim',[0 4. ...

  4. 动态折线图 python_python 怎么做个动态折线

    本文,用python调用matplotlib模块,画一个动态折线图. 工具/原料 电脑 python3.6(Anaconda) matplotlib模块 方法/步骤 1 先画一系列的折线图,代码如下图 ...

  5. 如何用Excel画出漂亮的图(office 2016)

          昨天有同学让我用Excel画一张简单的图,小编内心一顿嘲笑,这年代谁还用Excel画图,正准备用Matlab或者Python画图时. 那位同学给我展示了用Excel画出的折线图.我被震惊了 ...

  6. python plt 画动态折线图

    python plt 画动态折线图 # coding=utf-8import matplotlib.pyplot as plt import numpy as npdef main():plt_lis ...

  7. 模拟Windows任务管理器CPU使用率的动态折线图-农夫山泉

    Delphi的TCanvas类可以实现各种复杂的图形输出功能,基于近期项目的需求,利用它实现了一个很炫的动态折线图(模拟了资源管理器中CPU使用率的折线图),可以直观地展现出数值的实时变化情况. 这段 ...

  8. python做动态折线图_python matplotlib折线图样式实现过程

    python matplotlib 同时画箱线图和折线图的问题 python3 matplotlib画两个折线图,X轴相同,Y轴生...你的memo和cpui里面是字符串,不是数字 将memo.app ...

  9. Android之绘制动态折线图

    所谓动态折线图,就是折线图能随着手指的滑动进行动态绘制,这里很定会产生动画效果.基于这个效果,这里使用SurfaceView进行制图. 实现步奏如下: (1): 这里新建一个绘图ChartView,继 ...

  10. [VUE2/VUE3]基于echarts的动态折线图组件

    [VUE2/VUE3]基于echarts的动态折线图组件 时间格式化代码 export default function formatSecond(value: number) {let millis ...

最新文章

  1. HTML5中关于wheel事件兼容性处理
  2. 【问题】HDFS中块(block)的大小为什么设置为128M?
  3. 我用Python分析了“青你2”漂亮小姐姐的颜值,结果真香了!
  4. hdu 2648 Shopping
  5. jolokia_Hawtio和Jolokia的Hibernate统计
  6. 树的计数(prufer序列 或 purfer序列)
  7. uni-app获取腾讯地图计算两经纬度的实际距离(可批量)
  8. windows控制linux桌面图标,完全控制你的Windows桌面 (转)
  9. Spring Boot笔记-logback-spring.xml获取application.properties中的变量
  10. 广东省计算机考试图片大小,广东省计算机等级考试(20190423051419).doc
  11. 组策略应用到本地安全策略
  12. docker容器的常用命令以及访问tomcat报404的解决方法(二)
  13. 微信视频号如何申请认证,流程是什么?
  14. C语言求23阶行列式,AX=0通解,施密特正交化
  15. Python 结巴(jieba)库之花拳绣腿
  16. R非独立样本的 t 检验
  17. vue引入图片的方式
  18. 有参构造方法的作用和无参构造方法的作用
  19. velocity页面js引入#foreach遍历list
  20. java实验一目的_Java第一次实验要求

热门文章

  1. html img 能显示psd吗_教育一体机迈向大尺寸化,小间距显示屏能进入教室吗?
  2. 2.3谨慎活跃问题(Beware of Liveness Problems)
  3. jQuery事件相关方法
  4. 【渝粤教育】国家开放大学2018年秋季 2332T高等数学基础 参考试题
  5. 【5分钟paper】基于近似动态规划的学习、规划和反应的集成架构
  6. 求解偏微分方程开源有限元软件deal.II学习--Step 13
  7. Linux汇编调试器EDB
  8. 《Netty权威指南》(二)NIO 入门
  9. 51nod 1050 循环数组最大子段和 单调队列优化DP
  10. AngularJS学习之旅—AngularJS 事件(十四)