anroid achartengine折线的示例及问题

来源:互联网 发布:手机淘宝怎么登录卖家 编辑:程序博客网 时间:2024/05/17 06:13
package com.example.achartenginedemo;

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.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.ViewGroup.LayoutParams;
import android.widget.LinearLayout;
import android.app.Activity;
import android.content.Context;
import android.graphics.Color;
import android.graphics.Paint.Align;

/**
* 折线图: 点的最高处画上一个平行x轴垂直y轴的直线,x,y轴随着点的最高值变化
* */
/**
* 点击事件, 然后找到x坐标, 画一条线就可以了, 重写onkeydown事件**/
public class MainActivity extends Activity {
        private Timer timer = new Timer();
        private TimerTask task;
        private Handler handler;
        private String title = "线状报表";
        private XYSeries series;// 封装图表,放入x轴y轴的值
        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];
        private LinearLayout layout;


        @Override
        protected void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
                setContentView(R.layout.activity_main);
                context = getApplicationContext();
                // 这里获得main界面上的布局,下面会把图表画在这个布局里面
                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);
                // 设置好图表的样式,x,y在当前视图的最大值
                setChartSettings(renderer, "X", "Y", 0, 8, 0,8, 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
        protected 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.GRAY);
                renderer.setXLabels(2);//x轴显示的个数
                renderer.setYLabels(2);//y轴显示的个数
                renderer.setXTitle("Time");
                renderer.setYTitle("dBm");
                renderer.setPanEnabled(true, true); //x轴不可拖动,Y轴不可
                renderer.setYLabelsAlign(Align.RIGHT);
                renderer.setPointSize((float) 2);
                renderer.setShowLegend(false);
        }
        /**更新图表节点
         * **/
        private void updateChart() {

                // 设置好下一个需要增加的节点
                addX = 0;
                addY = (int) (Math.random()*10);

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

                // 判断当前点集中到底有多少点,因为屏幕总共只能容纳100个,所以当点数超过100时,长度永远是100
        int length = series.getItemCount();
                if (length > 8) {
                        length = 8;
                }

                // 将旧的点集中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();
        }

}


楼主,有一些问题不够明白,希望有高手不吝赐教~~就是如何让x轴的刻度根据x坐标的大小而改变,如何实现呢??还有就是根据如何根据这个线上的y的坐标上最大值再画一条线,平行于x轴垂直于y轴的,,~~~~~希望给个方法和思路~~~谢谢

0 0