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();
     }
}

achartengine画出动态折线图的更多相关文章

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

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

  2. 利用python画出动态高优先权优先调度

    之前写过一个文章. 利用python画出SJF调度图 动态高度优先权优先调度 动态优先权调度算法,以就绪队列中各个进程的优先权作为进程调度的依据.各个进程的优先权在创建进程时所赋予,随着进程的推进或其 ...

  3. 原生JS实现动态折线图

    原生JS实现动态折线图 <!DOCTYPE html> <html> <head> <meta charset="utf-8"> & ...

  4. 用matplotlib.pyplot画简单的折线图,直方图,散点图

    #coding=utf-8 """ 用matplotlib.pyplot画简单的折线图,直方图,散点图 """ import matplot ...

  5. Python 中 plt 画柱状图和折线图

    1. 背景 Python在一些数据可视化的过程中需要使用 plt 函数画柱状图和折线图. 2. 导入 import matplotlib.pyplot as plt 3. 柱状图 array= np. ...

  6. Chartist.js-同时画柱状图和折线图

    最近几天都在研究chartist,因为echarts生成的图是位图,导成PDF的时候不够清晰.而chartist是搜到的免费插件中呼声较高的,基于SVG. 今天主要是想举一些代码例子给大家,介绍下如何 ...

  7. Matplotlib中plot画点图和折线图

    引入: import matplotlib.pyplot as plt 基本语法: plt.plot(x, y, format_string, **kwargs) x:x轴数据,列表或数组,可选 y: ...

  8. 百度地图API实时画出动态运行轨迹(一条行驶轨迹),车头实时指向行驶方向,设置角度偏移

    参考网址:https://blog.csdn.net/skywqnan/article/details/79036262 改变车的方向:http://www.cnblogs.com/peixuanzh ...

  9. 利用python画出SJF调度图

    最先发布在csdn.本人原创. https://blog.csdn.net/weixin_43906799/article/details/105510046 SJF算法: 最短作业优先(SJF)调度 ...

随机推荐

  1. Git合并分支出现的冲突解决

    人生不如意之事十有八九,合并分支往往也不是一帆风顺的. 我们准备新的分支newbranch. LV@LV-PC MINGW32 /c/gitskill (master)$ git checkout - ...

  2. how to write a struct to a file directly?

    Using write and read system call. Following is an example: blk.h: #include <stdlib.h> #include ...

  3. subversion SVN global ignore pattern

    *.o *.lo *.la *.al .libs *.so *.so.[0-9]* *.a *.pyc *.pyo *.rej *~ #*# .#* .*.swp .DS_Store */bin */ ...

  4. 利用proxychains在终端使用socks5代理

    最近用各种脚本下载东西的时候发现有的站点需要当地IP才能下,比如.....nico, youtube等: 所以就找了下能在终端用socks5代理的工具,最后找到了proxychains,从此再无压力= ...

  5. 剑指offer 旋转数组

    class Solution { public: int minNumberInRotateArray(vector<int> rotateArray) { //常规的遍历方法时间是O(N ...

  6. seo优化 标点符号

    一.顿号“.” 顿号是一个只有在中文中使用的标点符号,这在英文中没有.毕竟该不该在标题中使用顿号呢,建议大家仍是不要使用,或者说在标题中就不要泛起中文的符号最好.不外,顿号可以使用在Descripti ...

  7. zf-删除重复数据只保留一条(转)

    http://blog.csdn.net/anya/article/details/6407280

  8. 大学二三事——那些人(1)

    校歌墙的对面是一座历史比较悠久的建筑,以前叫做12号楼,后来改成了"诚"字楼. 在诚字楼一楼昏暗的走廊上,你总是能看见一位大概四五十岁的大叔,有时他会指着挂在墙上的学校简介,一个人 ...

  9. ShellExecute快捷键大全

    文件夹,文件,网址可以创建快捷方式,控制面板 中的设置也可以创建快捷方式,下面是快捷方式的命令,使用方法:在桌面或文件夹的空白处点右键,选择新建,快捷方式,在"请键入项目的位置"输 ...

  10. 事务(JDBC、Hibernate、Spring)

    如果不用spring管理事务,我们自己写代码来操作事务.那么这个代码怎么写要看底层怎么访问数据库了. 当采用原生JDBC访问数据库时,操作事务需要使用java.sql.Connection的API.开 ...