Android开发之初级开发_利用第三方架包绘制折线图

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 CO2LineAchart extends Activity
{
    private Timer timer = new Timer();
    private TimerTask task;
    private Handler handler;
    private String title = "CO2浓度折线图";
    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.colineachart);

        context = getApplicationContext();

        // 这里获得main界面上的布局,下面会把图表画在这个布局里面
        LinearLayout layout = (LinearLayout) findViewById(R.id.linearLayout1);

        // 这个类用来放置曲线上的所有点,是一个点的集合,根据这些点画出曲线
        series = new XYSeries(title);
        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);
        // 设置X.Y坐标原点位置及其最大值
        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);
        // 设置X,Y坐标间隔大小
        renderer.setXLabels(20);
        // 设置是否可以滑动及其缩放
        renderer.setClickEnabled(true);
        renderer.setYLabels(10);
        // 设置X轴标题
        renderer.setXTitle("时间");
        // 设置Y轴标题
        renderer.setYTitle("浓度");
        renderer.setYLabelsAlign(Align.RIGHT);
        // 设置曲线大小
        renderer.setPointSize((float) 4);
        // 是否显示图例
        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();
    }
}
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context="com.hql.MainActivity$PlaceholderFragment" >

    <LinearLayout
        android:id="@+id/linearLayout1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" >

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="500dp" />
    </LinearLayout>

</RelativeLayout>
        <activity
            android:name="com.topcsa.hql.CO2LineAchart"
            android:screenOrientation="landscape" />

 

//首先我们要用到的是第三方架包:achartengine-1.1.0

//下载地址网上百度即可。

// 1.将架包复制到我们项目的libs目录下

// 2.build path中将架包调到Android x.x下面

// 3.然后将libs中的架包删除。

//如遇到错误,请百度

 

posted @ 2014-09-14 09:00  loneliness__白色  阅读(546)  评论(0)    收藏  举报