`
wen742538485
  • 浏览: 238904 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

achartengine画出动态折线图的效果

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

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

package com.auto.chat;

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

</pre>Layout的xml如下:<p></p><pre name="code" class="html"><?xml version="1.0" encoding="utf-8"?>
<AbsoluteLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >

    <TextView
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="@string/hello" />

    <LinearLayout
        android:id="@+id/linearLayout1"
        android:layout_width="290dp"
        android:layout_height="122dp"
        android:layout_x="12dp"
        android:layout_y="41dp"
        android:orientation="vertical" >

    </LinearLayout>

    <LinearLayout
        android:id="@+id/linearLayout2"
        android:layout_width="290dp"
        android:layout_height="130dp"
        android:layout_x="13dp"
        android:layout_y="215dp"
        android:orientation="vertical" >
    </LinearLayout>

</AbsoluteLayout>

sdk的版本是2.2的,效果一般,不过至少能动起来了,上面是一个demo,做其它程序的时候可以写一个继承了View的类,把上面的代码装进去,然后在其它Activity中的任何布局中都可以用addView来添加上这里画出来的曲线了。



  • 大小: 82.8 KB
分享到:
评论
3 楼 Janne 2016-06-15  
你好 有源代码?可以发到我的邮箱里学学吗?2731049993@qq.com,谢谢
2 楼 anbo724 2012-10-26  
我的邮箱 anbo724@gmail.com谢谢@
1 楼 anbo724 2012-10-26  
你好 请问有源码没《?谢谢

相关推荐

    achartengine画出动态折线图

    有疑问可以到我的博客咨询, ... 本代码为前人在博客中所述代码改编的,因为原文只有博文没有代码,就写了一个。...原文地址:achartengine画出动态折线图http://blog.csdn.net/ykm0722/article/details/8106612

    使用AChartengine画折线图Demo

    在这个"使用AChartengine画折线图Demo"中,我们将深入探讨如何利用AChartEngine库在Android应用中绘制折线图,以展示动态数据或统计信息。 首先,我们需要在项目中集成AChartEngine库。这通常通过添加依赖或下载库...

    achartengine折线图和动态折线图

    本项目着重关注如何使用AChartEngine创建折线图,以及如何实现动态折线图,即在图表上实时更新数据。 首先,我们需要理解折线图的基本概念。折线图通过连接一系列数据点来展示数值变化趋势,常用于表示时间序列数据...

    AChartEngine绘图实时曲线 绘制折线图

    本实例是采用AChartEngine进行绘制折线图的一个例子,采用随机数作为采样点,同步参考博客http://blog.csdn.net/danming60520/article/details/14127639

    AchartEngine图表库之动态折线图(多条)

    本篇文章将深入探讨如何利用AchartEngine库创建动态折线图,并实现多条折线的同时刷新。 首先,我们需要在项目中引入AchartEngine库。通常,你可以通过添加Gradle依赖或下载jar文件来引入。如果选择Gradle依赖,...

    使用 achartengine实现 静态折线图 和 动态折线图

    该Demo使用 achartengine1.1 实现简单的折线图。先是实现的最普通的静态折线图,然后 实现了两种不同风格的折线图。希望对大家有所帮助 另提供一个achartengine1.1的下载链接...

    使用AChartEngine画动态曲线图

    本教程将深入探讨如何使用`AChartEngine`来实现动态折线图的自动滚动功能。 首先,我们需要了解`AChartEngine`的核心概念。它提供了丰富的API,允许开发者轻松地定制图表的颜色、样式、数据标签等。`Renderer`类是...

    achartEngine折线图和圆饼图的demo

    在这个"achartEngine折线图和圆饼图的demo"中,我们能看到如何利用AChartEngine库来实现这两种常见的图表类型。 首先,折线图是一种用于展示数据随时间变化趋势的图表。在Android应用中,折线图可用于显示用户的...

    achartengine开发的关于时间的折线图

    `ACHartEngine`是一款强大的开源图表库,它为开发者提供了丰富的图表类型,如折线图、柱状图、饼图等,使得在Android平台上创建交互式图表变得简单。本文将深入探讨如何使用`ACHartEngine`来开发一个关于时间的时间...

    android折线图(AChartEngine和ichartjs)

    本篇文章将详细探讨如何在Android应用中实现折线图,主要涉及两个库:AChartEngine和iChartJS。 首先,我们来看AChartEngine。AChartEngine是一个开源的Android图表库,它提供了丰富的图表类型,包括折线图、柱状图...

    使用Achartengine实现Android折线图开发

    Achartengine是一个开源的图表库,适用于Android平台,可以方便地创建各种类型的图表,如折线图、柱状图、饼图等。本篇将详细介绍如何使用Achartengine库在Android项目中实现折线图的开发。 首先,我们需要在项目中...

    Android 实时动态折线图Linechart

    在这里,我们将主要关注如何利用`AChartEngine`来创建动态更新的折线图。 首先,要创建一个折线图,你需要创建一个`Renderer`对象,这是`AChartEngine`的核心组件,用于设置图表的各种属性,如颜色、线条宽度、填充...

    利用aChartengine绘制折线图以及柱状图

    aChartEngine是一个流行的开源库,专为Android平台设计,用于绘制各种图表,包括折线图、柱状图、饼图等。本教程将详细介绍如何利用aChartEngine库来创建折线图和柱状图。 首先,我们需要在项目中引入aChartEngine...

    Android学习之AChartEngine折线图

    这篇博客“Android学习之AChartEngine折线图”将引导我们深入理解如何使用AChartEngine库来创建和定制折线图。 首先,我们需要了解AChartEngine的基本概念。AChartEngine是一个轻量级的库,它的主要功能是生成可...

    android动态折线图

    在Android平台上,实现动态折线图通常需要借助专门的图表库,如MPAndroidChart、AchartEngine或者Google的Charts等。MPAndroidChart是一个非常流行的开源库,它提供了丰富的图表类型,包括折线图,并且支持自定义...

    android基于AChartengine实现折线图

    AChartEngine是一个开源库,专门用于在Android平台上创建各种图表,包括折线图、柱状图、饼图等。本篇文章将深入探讨如何使用AChartEngine在Android应用中实现折线图。 首先,你需要在你的项目中集成AChartEngine库...

    android 绘制折线图(AChartEngine)Linechart 动态更新横轴为获取的当前时间

    本文将详细介绍如何使用`AChartEngine`库来创建一个动态更新横轴为当前时间的折线图。 首先,我们需要了解`AChartEngine`的基本用法。安装库后,通过添加依赖到项目中,我们可以在代码中引入所需的类。`Renderer`是...

    AChartEngine 折线图和EmbeddedChart示例

    **AChartEngine** 是一个流行的开源 Android 图表库,它为开发者提供了丰富的图表类型,包括折线图、柱状图、饼图等,用于在 Android 应用程序中展示数据。在这个示例中,我们将专注于 **折线图** 和如何在应用中 **...

Global site tag (gtag.js) - Google Analytics