• Android图表引擎AChartEngine之折线图使用


            最近在帮老师做一个课题,其中app端需要显示折线图以便直观地看数据波动,上网查了些资料后发现了这款图标引擎,另外感谢李坤老师的博客,帮助很大。

      废话不多说,下面写代码。

    一.AChartEngine是一款非常强大的绘图引擎,不过我这里只需用到折线图,所以并没有其他图的使用。首先我们要导入achartengine-xxx.jar,我这里使用的是achartengine-0.7.0.jar.

    二.工欲善其事,必先利其器。由于在项目中需要使用图表的地方不止一处,我根据自己实际所需情况先封了个工具类。

      1 package xidian.zhr.utils;
      2 
      3 import java.util.ArrayList;
      4 import java.util.List;
      5 
      6 import org.achartengine.ChartFactory;
      7 import org.achartengine.chart.PointStyle;
      8 import org.achartengine.model.XYMultipleSeriesDataset;
      9 import org.achartengine.model.XYSeries;
     10 import org.achartengine.renderer.XYMultipleSeriesRenderer;
     11 import org.achartengine.renderer.XYSeriesRenderer;
     12 
     13 import android.content.Context;
     14 import android.graphics.Color;
     15 import android.graphics.Paint.Align;
     16 import android.view.View;
     17 import android.widget.LinearLayout;
     18 
     19 public class AChartEngineUtil 
     20 {
     21     
     22     
     23     /**
     24      * 获取坐标序列
     25      * @param size 序列点数
     26      * @param values  y轴值
     27      * @return  坐标x轴序列   或   坐标y轴序列
     28      */
     29     public static List<double[]> getlist(int size,List<String> values)
     30     {
     31         List<double[]> xy = new ArrayList<double[]>();
     32         
     33         double[] list =  new double[size];
     34         for(int i = 0 ; i < size ;i++)
     35         {
     36             list[i] = (values.isEmpty())? i : Double.valueOf(values.get(i));
     37         }
     38         
     39         xy.add(list);
     40         
     41         return xy;
     42     }
     43     
     44     
     45      /** 
     46        * 构建XYMultipleSeriesRenderer. 
     47        *  
     48        * @param colors 每个序列的颜色 
     49        * @param styles 每个序列点的类型(可设置三角,圆点,菱形,方块等多种) 
     50        *                            ( PointStyle.CIRCLE, PointStyle.DIAMOND,PointStyle.TRIANGLE, PointStyle.SQUARE )
     51        * @return XYMultipleSeriesRenderer 
     52        */  
     53     public static XYMultipleSeriesRenderer buildRenderer(int[] colors,PointStyle[] styles)
     54     {
     55         XYMultipleSeriesRenderer renderer = new XYMultipleSeriesRenderer();
     56         // 控制横纵轴的属性字大小
     57         renderer.setAxisTitleTextSize(15);
     58         // 控制横纵轴的值大小
     59         renderer.setChartTitleTextSize(20);
     60         renderer.setLabelsTextSize(15);
     61         renderer.setLegendTextSize(15);
     62         renderer.setPointSize(5f);
     63         renderer.setMargins(new int[]
     64         { 20, 30, 15, 0 });
     65         int length = colors.length;
     66         for (int i = 0; i < length; i++)
     67         {
     68             XYSeriesRenderer r = new XYSeriesRenderer();
     69             r.setColor(colors[i]);
     70             r.setPointStyle(styles[i]);
     71             renderer.addSeriesRenderer(r);
     72         }
     73         return renderer;
     74     }
     75 
     76      /** 
     77        * 设置renderer的一些坐标轴属性. 
     78        *  
     79        * @param renderer 要设置的renderer 
     80        * @param title 图表标题 
     81        * @param xTitle X轴标题 
     82        * @param yTitle Y轴标题 
     83        * @param xMin X轴最小值 
     84        * @param xMax X轴最大值 
     85        * @param yMin Y轴最小值 
     86        * @param yMax Y轴最大值 
     87        * @param axesColor X轴颜色 
     88        * @param labelsColor Y轴颜色 
     89        */  
     90     public static void setChartSettings(XYMultipleSeriesRenderer renderer,
     91             String title, String xTitle, String yTitle, double xMin,
     92             double xMax, double yMin, double yMax, int axesColor,
     93             int labelsColor)
     94     {
     95         renderer.setChartTitle(title);
     96         renderer.setXTitle(xTitle);
     97         renderer.setYTitle(yTitle);
     98         renderer.setXAxisMin(xMin);
     99         renderer.setXAxisMax(xMax);
    100         renderer.setYAxisMin(yMin);
    101         renderer.setYAxisMax(yMax);
    102         renderer.setAxesColor(axesColor);
    103         renderer.setLabelsColor(labelsColor);
    104     }
    105 
    106      /** 
    107        * 构建和时间有关的XYMultipleSeriesDataset,这个方法与buildDataset在参数上区别是需要List<Date[]>作参数. 
    108        *  
    109        * @param titles 序列图例 
    110        * @param xValues X轴值 
    111        * @param yValues Y轴值 
    112        * @return XYMultipleSeriesDataset 
    113        */  
    114     public static XYMultipleSeriesDataset buildDataset(String[] titles,
    115             List<double[]> xValues, List<double[]> yValues)
    116     {
    117         XYMultipleSeriesDataset dataset = new XYMultipleSeriesDataset();
    118         int length = titles.length;
    119         for (int i = 0; i < length; i++)
    120         {
    121             XYSeries series = new XYSeries(titles[i]);
    122             double[] xV = xValues.get(i);
    123             double[] yV = yValues.get(i);
    124             int seriesLength = xV.length;
    125             for (int k = 0; k < seriesLength; k++)
    126             {
    127                 series.add(xV[k], yV[k]);
    128             }
    129             dataset.addSeries(series);
    130         }
    131         return dataset;
    132     }
    133     
    134     
    135     
    136     /**
    137      * 绘制图表
    138      * @param context  当前环境
    139      * @param layout   承载图标的容器
    140      * @param titles   折线名称
    141      * @param colors   折线颜色
    142      * @param data     y轴坐标数据
    143      * @param xname    x轴名字
    144      * @param yname    y轴名字
    145      */
    146     public static void setchart(Context context,LinearLayout layout,String[] titles,int[] colors,
    147             List<String> data,String xname,String yname)
    148     {
    149         
    150         //获取x轴坐标
    151         List<double[]> x = getlist(data.size(), new ArrayList<String>());
    152         //获取y轴坐标
    153         List<double[]> values = getlist(data.size(),data);
    154         
    155         PointStyle[] styles = new PointStyle[] {PointStyle.CIRCLE};
    156         //构建XYMultipleSeriesRenderer
    157         XYMultipleSeriesRenderer renderer = buildRenderer(colors, styles);
    158         
    159         setChartSettings(renderer, "", xname, yname, 0.5, 12.5, 0, 30,Color.LTGRAY, Color.LTGRAY);
    160         
    161         int length = renderer.getSeriesRendererCount();//获取点数量
    162         for (int i = 0; i < length; i++) 
    163         {
    164               ((XYSeriesRenderer) renderer.getSeriesRendererAt(i)).setFillPoints(true);//设置图上的点为实心  
    165         }
    166         renderer.setXLabels(12);//设置x轴显示12个点,根据setChartSettings的最大值和最小值自动计算点的间隔  
    167         renderer.setYLabels(10);//设置y轴显示10个点,根据setChartSettings的最大值和最小值自动计算点的间隔  
    168         renderer.setShowGrid(true);//是否显示网格  
    169         renderer.setXLabelsAlign(Align.RIGHT);//刻度线与刻度标注之间的相对位置关系  
    170         renderer.setYLabelsAlign(Align.CENTER);//刻度线与刻度标注之间的相对位置关系  
    171         renderer.setZoomButtonsVisible(true);//是否显示放大缩小按钮  
    172         renderer.setPanLimits(new double[] { -10, 300, -10, 300 }); //设置拖动时X轴Y轴允许的最大值最小值.  
    173         renderer.setZoomLimits(new double[] {  -10, 300, -10, 300 });//设置放大缩小时X轴Y轴允许的最大最小值. 
    174         
    175         //构建view
    176         View v = ChartFactory.getLineChartView(context,buildDataset(titles, x, values),renderer); 
    177         
    178         layout.addView(v);
    179     }
    180 }

    三.下面是我的界面代码,由于这课题并不在乎界面,我这里也就简陋了点

     1 <?xml version="1.0" encoding="UTF-8"?>
     2 <LinearLayout 
     3     android:layout_width="fill_parent"
     4     android:layout_height="fill_parent"
     5     android:orientation="vertical"
     6     android:background="@color/black"
     7     xmlns:android="http://schemas.android.com/apk/res/android">
     8     
     9     <LinearLayout  
    10             android:layout_width="fill_parent"
    11             android:layout_height="25dp"
    12             android:orientation="horizontal"
    13             android:layout_marginLeft="25dp"
    14             android:layout_marginRight="10dp"
    15             android:layout_marginTop="5dp"
    16             android:gravity="left|center_vertical"
    17             android:background="@drawable/prompt">
    18             <TextView 
    19                 android:layout_width="wrap_content"
    20                 android:layout_height="wrap_content"
    21                 android:textColor="#FFFFFF" 
    22                 android:textStyle="bold"
    23                 android:textSize="15dp"
    24                 android:text="@string/glu_value"
    25                 android:layout_marginLeft="60dp"
    26                 android:paddingTop="3dp"/>
    27     </LinearLayout>
    28     
    29     <LinearLayout 
    30         android:id="@+id/gluc_glulay"
    31         android:orientation="vertical"
    32         android:layout_width="fill_parent"
    33         android:layout_height="230dp"
    34         android:gravity="center_horizontal">
    35     </LinearLayout>
    36     
    37     <LinearLayout  
    38             android:layout_width="fill_parent"
    39             android:layout_height="25dp"
    40             android:orientation="horizontal"
    41             android:layout_marginLeft="25dp"
    42             android:layout_marginRight="10dp"
    43             android:layout_marginTop="5dp"
    44             android:gravity="left|center_vertical"
    45             android:background="@drawable/prompt">
    46             <TextView 
    47                 android:layout_width="wrap_content"
    48                 android:layout_height="wrap_content"
    49                 android:textColor="#FFFFFF" 
    50                 android:textStyle="bold"
    51                 android:textSize="15dp"
    52                 android:text="@string/insulin_value"
    53                 android:layout_marginLeft="60dp"
    54                 android:paddingTop="3dp"/>
    55     </LinearLayout>
    56     
    57     <LinearLayout 
    58         android:id="@+id/gluc_ydslay"
    59         android:orientation="vertical"
    60         android:layout_width="fill_parent"
    61         android:layout_height="230dp"
    62         android:gravity="center_horizontal">
    63     </LinearLayout>
    64     
    65 </LinearLayout>

    四.下面来到我们的Activity,这部分代码就很简单了,就是实例化控件以及筹备数据,再调用工具类绘图方法即可,就不全部贴出了。

     1         glu_chart = (LinearLayout)findViewById(R.id.gluc_glulay);
     2         yds_chart = (LinearLayout)findViewById(R.id.gluc_ydslay);
     3         sqlitedatabase = DbManager.open(GlucoseChartA

    ctivity.this);
     4         GlucoseDao glucoseDao = new GlucoseDao(sqlitedatabase);
     5         glulist = glucoseDao.getglucose(getsql(" and GlucoseDate = ? "), new String[]{TimeUtil.getNowDate()});
     6         //获取数据
     7         List<String> glu_data = new ArrayList<String>();
     8         List<String> yds_data = new ArrayList<String>();
     9         for(int i = 0; i< glulist.size() ;i++)
    10         {
    11             glu_data.add(String.valueOf(glulist.get(i).getGlucoseValue()));
    12             yds_data.add(String.valueOf(glulist.get(i).getGlucoseYDSValue()));
    13         }
    14         //调用工具类方法
    15         AChartEngineUtil.setchart(GlucoseChartActivity.this,glu_chart,new String[]{"血糖值"},new int[]{Color.GREEN},glu_data,"时间","血糖值");
    16         AChartEngineUtil.setchart(GlucoseChartActivity.this,yds_chart,new String[]{"胰岛素值"},new int[]{Color.YELLOW},yds_data,"时间","胰岛素值");

    五,最后看看我们的效果图,我这里随便拟了几条数据

     
  • 相关阅读:
    poj 2886 Who Gets the Most Candies?(线段树)
    Android开发之SoundPool使用具体解释
    Win8.1应用开发之动态磁贴
    开发人员获取苹果技术支持
    Win32 Windows编程 十二
    华为上机练习题--压缩字符串
    PS 滤镜算法原理 ——马赛克
    JS版汉字与拼音互转终极方案,附简单的JS拼音输入法
    mybatis入门基础----动态SQL
    windows上如何搭建Git Server
  • 原文地址:https://www.cnblogs.com/zhrxidian/p/4285989.html
Copyright © 2020-2023  润新知