achartengine.jar绘制动态图形三 --折线图

PS:折线图前两个图形式是一样的,只是方法变了,毕竟绘制的图不一样,方法当然要不一样。

无非就是数据源和渲染器,数据源是每条线的数据,渲染器就是绘制xy轴、线的颜色、点的样式等,只要是分开一步一步写,思路是非常简单的,只不过是属性有点多。


1:创建MainActivity.java,和之前一样也是在xml文件分配一个空间。

view = ChartFactory.getLineChartView(DiscountActivity.this, getDataSet(), getRenderer());
来获取view。

2:数据源和渲染器创建

public XYMultipleSeriesDataset getDataSet() {
        //创建数据源
        XYMultipleSeriesDataset dataset = new XYMultipleSeriesDataset();//这里需要注意的是,饼图和柱状图和折线图创建的对象都不一样。

        //定义线,
        xySeries = new XYSeries("111");
        xySeries2 = new XYSeries("222");
        /*xySeries.add(0,3);
        xySeries.add(1,10);
        xySeries.add(2,4);
        xySeries.add(3,1);
        xySeries.add(4,6);
        xySeries.add(5,8);*/
        // xySeries.clear();
            /*一次性赋值,
            xySeries.add(0,rd.nextInt(10));
            xySeries.add(1,rd.nextInt(10));
            xySeries.add(2,rd.nextInt(10));
            xySeries.add(3,rd.nextInt(10));
            xySeries.add(4,rd.nextInt(10));
            xySeries.add(5,rd.nextInt(10));
        Log.e("试试1",rd.nextInt(10)+"");
        Log.e("试试2",rd.nextInt(10)+"");
        Log.e("试试3",rd.nextInt(10)+"");
        Log.e("试试4",rd.nextInt(10)+"");*/

        dataset.addSeries(xySeries);
        dataset.addSeries(xySeries2);


        return dataset;
    }
 //定义渲染器
    public XYMultipleSeriesRenderer getRenderer() {
        XYMultipleSeriesRenderer renderer = new XYMultipleSeriesRenderer();
        renderer.setXTitle("时间");
        renderer.setYTitle("温度");
        renderer.setAxisTitleTextSize(30);//设置轴标题文本大小
        renderer.setChartTitle("测试");//设置图表标题
        renderer.setChartTitleTextSize(30);//设置图表标题文字的大小
        renderer.setLabelsTextSize(18);//设置标签的文字大小
        renderer.setLegendTextSize(30);//设置图例文本大小
        renderer.setPointSize(3f);//设置点的大小

        renderer.setYAxisMin(0);//设置y轴最小值是0
        renderer.setYAxisMax(15);//设置Y轴的最大值为15,   0--15

        renderer.setYLabels(10);//设置Y轴刻度个数(貌似不太准确)
        renderer.setXAxisMax(20);  //设置X轴的屏幕显示长度,
        renderer.setShowGrid(true);//显示网格
        renderer.setApplyBackgroundColor(true);
        renderer.setBackgroundColor(Color.BLACK);

        //线的属性
        XYSeriesRenderer r = new XYSeriesRenderer();//(类似于一条线对象)
        r.setColor(Color.BLUE);//设置颜色
        r.setPointStyle(PointStyle.CIRCLE);//设置点的样式
        r.setFillPoints(true);//填充点(显示的点是空心还是实心)
        r.setDisplayChartValues(true);//将点的值显示出来
        r.setChartValuesSpacing(10);//显示的点的值与图的距离
        r.setChartValuesTextSize(25);//点的值的文字大小

        XYSeriesRenderer r2 = new XYSeriesRenderer();//(类似于一条线对象)
        r2.setColor(Color.RED);//设置颜色
        r2.setPointStyle(PointStyle.CIRCLE);//设置点的样式
        r2.setFillPoints(true);//填充点(显示的点是空心还是实心)
        r2.setDisplayChartValues(true);//将点的值显示出来
        r2.setChartValuesSpacing(10);//显示的点的值与图的距离
        r2.setChartValuesTextSize(25);//点的值的文字大小

        renderer.addSeriesRenderer(r);
        renderer.addSeriesRenderer(r2);
        return renderer;

    }
3:其实这样子就可以了,只不过是静态的,下面就是定时器的创建。

先写一样动态赋值,这里是从左向右开始移动,每次创建只创建x=0,y=数据(如30);在创建下一个的同时,把这一个放在x=1,y=30坐标;以此类推

 //动态赋值,
    private void initLine(XYSeries series) {

        Random r = new Random();
        xTemp = 0;
        yTemp = r.nextInt(10);

        count = series.getItemCount();//返回本系列的条目的数量,如,第一次如果没有赋值的话,那这就是0。
        Log.e("ssssss", count + "");
        if (count > 20) {
            count = 20;
        }


        //这里是给第几个点赋值坐标,并不是多个赋值,仅仅是一个,如第九个,x[9]=series.getX(9);
        for (int i = 0; i < count; i++) {
            x[i] = series.getX(i);//这个地方是getX(i)来获取的是再次调用series对象时,取出的数据,存放在x[],y[]数组里
            //为下面赋值做铺垫。
            y[i] = series.getY(i);
            Log.e("x[i]:", "" + x[i]);
            Log.e("Y[i]:", "" + x[i]);
        }
        series.clear();

        series.add(xTemp, yTemp);

        for (int i = 0; i < count; i++) { //取出上一个的值,存放在下一个坐标上
            series.add(x[i] + 1, y[i]);
        }
    }

定时器:写在onCreate()里

        Timer timer = new Timer();
        timer.schedule(task, 1, 1000);//一秒执行一次

    TimerTask task = new TimerTask() {

        @Override
        public void run() {
            // 需要做的事:发送消息
            initLine(xySeries);
            initLine(xySeries2);

            view.postInvalidate();

        }
    };


-----------------------------------------------------------------------完---------------------------------------------

总代码:

package cn.liu.main;

import android.app.Activity;
import android.graphics.Color;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.LinearLayout;

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 java.util.Random;
import java.util.Timer;
import java.util.TimerTask;



public class DiscountActivity extends Activity {

    private GraphicalView view;
    private int i = 0;
    private int TIME = 1000;
    public int obj2;
    //以下属性用于initLine(XYSeries series)方法中更新数据
    private double[] x, y;
    private int count;
    private int xTemp, yTemp;


    private LinearLayout ll;
    private View viewShow;
    private XYSeries xySeries, xySeries2;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        //setContentView(R.layout.achart1layout);
        ll = new LinearLayout(this);


        // timer.schedule(task, 1, 1000);
        x = new double[20];
        y = new double[20];


        view = ChartFactory.getLineChartView(DiscountActivity.this, getDataSet(), getRenderer());
        ll.addView(view);
        setContentView(ll);
        refreshChart();


    }

    //动态赋值,
    private void initLine(XYSeries series) {

        Random r = new Random();
        xTemp = 0;
        yTemp = r.nextInt(10);

        count = series.getItemCount();//返回本系列的条目的数量,只有2条,一开始
        Log.e("ssssss", count + "");
        if (count > 20) {
            count = 20;
        }


        //这里是给第几个点赋值坐标,并不是多个赋值,仅仅是一个,如第九个,x[9]=series.getX(9);
        for (int i = 0; i < count; i++) {
            x[i] = series.getX(i);//这个地方是getX(i)来获取的是再次调用series对象时,取出的数据,存放在x[],y[]数组里
            //为下面赋值做铺垫。
            y[i] = series.getY(i);
            Log.e("x[i]:", "" + x[i]);
            Log.e("Y[i]:", "" + x[i]);
        }
        series.clear();

        series.add(xTemp, yTemp);

        for (int i = 0; i < count; i++) { //取出上一个的值,存放在下一个坐标上
            series.add(x[i] + 1, y[i]);
        }
    }

    private void refreshChart() {
        Timer timer = new Timer();
        timer.schedule(task, 1, 1000);//一秒执行一次
    }


    TimerTask task = new TimerTask() {

        @Override
        public void run() {
            // 需要做的事:发送消息
            initLine(xySeries);
            initLine(xySeries2);

            view.postInvalidate();

        }
    };

    public XYMultipleSeriesDataset getDataSet() {
        //创建数据源
        XYMultipleSeriesDataset dataset = new XYMultipleSeriesDataset();

        //定义线,
        xySeries = new XYSeries("111");
        xySeries2 = new XYSeries("222");
        /*xySeries.add(0,3);
        xySeries.add(1,10);
        xySeries.add(2,4);
        xySeries.add(3,1);
        xySeries.add(4,6);
        xySeries.add(5,8);*/
        // xySeries.clear();

            /*一次性赋值,
            xySeries.add(0,rd.nextInt(10));
            xySeries.add(1,rd.nextInt(10));
            xySeries.add(2,rd.nextInt(10));
            xySeries.add(3,rd.nextInt(10));
            xySeries.add(4,rd.nextInt(10));
            xySeries.add(5,rd.nextInt(10));
        Log.e("试试1",rd.nextInt(10)+"");
        Log.e("试试2",rd.nextInt(10)+"");
        Log.e("试试3",rd.nextInt(10)+"");
        Log.e("试试4",rd.nextInt(10)+"");*/

        dataset.addSeries(xySeries);
        dataset.addSeries(xySeries2);


        return dataset;
    }

    //定义渲染器
    public XYMultipleSeriesRenderer getRenderer() {
        XYMultipleSeriesRenderer renderer = new XYMultipleSeriesRenderer();
        renderer.setXTitle("时间");
        renderer.setYTitle("温度");
        renderer.setAxisTitleTextSize(30);//设置轴标题文本大小
        renderer.setChartTitle("测试");//设置图表标题
        renderer.setChartTitleTextSize(30);//设置图表标题文字的大小
        renderer.setLabelsTextSize(18);//设置标签的文字大小
        renderer.setLegendTextSize(30);//设置图例文本大小
        renderer.setPointSize(3f);//设置点的大小

        renderer.setYAxisMin(0);//设置y轴最小值是0
        renderer.setYAxisMax(15);//设置Y轴的最大值为15,   0--15

        renderer.setYLabels(10);//设置Y轴刻度个数(貌似不太准确)
        renderer.setXAxisMax(20);  //设置X轴的屏幕显示长度,
        renderer.setShowGrid(true);//显示网格
        renderer.setApplyBackgroundColor(true);
        renderer.setBackgroundColor(Color.BLACK);

        //线的属性
        XYSeriesRenderer r = new XYSeriesRenderer();//(类似于一条线对象)
        r.setColor(Color.BLUE);//设置颜色
        r.setPointStyle(PointStyle.CIRCLE);//设置点的样式
        r.setFillPoints(true);//填充点(显示的点是空心还是实心)
        r.setDisplayChartValues(true);//将点的值显示出来
        r.setChartValuesSpacing(10);//显示的点的值与图的距离
        r.setChartValuesTextSize(25);//点的值的文字大小

        XYSeriesRenderer r2 = new XYSeriesRenderer();//(类似于一条线对象)
        r2.setColor(Color.RED);//设置颜色
        r2.setPointStyle(PointStyle.CIRCLE);//设置点的样式
        r2.setFillPoints(true);//填充点(显示的点是空心还是实心)
        r2.setDisplayChartValues(true);//将点的值显示出来
        r2.setChartValuesSpacing(10);//显示的点的值与图的距离
        r2.setChartValuesTextSize(25);//点的值的文字大小

        renderer.addSeriesRenderer(r);
        renderer.addSeriesRenderer(r2);
        return renderer;

    }
}




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值