Android第三方acharrtengine绘制折线图

来源:互联网 发布:tinyumbrella java 编辑:程序博客网 时间:2024/05/19 02:30
public class ChartView {/** * 绘制图表方法 *  * @param context *            上下文对象 * @param chartPagerBean *            图表容器 * @param layout *            展示图表的Layout * @param xAxisMax *            最大X轴的值 */public void draw(Context context, ChartPagerBean chartPagerBean,LinearLayout layout, int xAxisMax) {// 曲线图表信息对象,最多存储两个曲线图的信息ChartPagerBean mChartPagerBean = chartPagerBean;// 图表数据集合XYMultipleSeriesDataset mDataset;// 图表数据渲染器XYMultipleSeriesRenderer mRenderer;// 图表viewGraphicalView mChartView;// 创建图表数据集合mDataset = new XYMultipleSeriesDataset();mRenderer = setRenderer();int yAxisMin = mChartPagerBean.majorMin;// Y轴的最小值int yAxisMax = mChartPagerBean.majorMax;// Y轴的最大值// 创建一个数据子集XYSeries seriesMajor = new XYSeries(mChartPagerBean.majorName);int i = 1;// 将数据添加到数据子集中,并动态修改最大值和最小值for (int value : mChartPagerBean.majorValueList) {seriesMajor.add(i, value);if (value < yAxisMin) {yAxisMin = value;}if (value > yAxisMax) {yAxisMax = value;}i++;}// 将数据子集添加到图表数据集合中mDataset.addSeries(seriesMajor);ColoursXYSeriesRenderer rendererMajor = setMajorSeriesRenderer(mChartPagerBean);// 将曲线渲染对象添加到图表渲染器中mRenderer.addSeriesRenderer(rendererMajor);// 如果图表中存在两条曲线,则再分别创建一个数据子集和一个曲线渲染对象if (mChartPagerBean.isHasSlave) {// 创建一个数据子集XYSeries seriesSlave = new XYSeries(mChartPagerBean.slaveName);i = 1;// 将数据添加到数据子集中,并动态修改最大值和最小值for (int value : mChartPagerBean.slaveValueList) {value = mChartPagerBean.slaveValueList.get(i - 1);seriesSlave.add(i, value);if (value < yAxisMin) {yAxisMin = value;}if (value > yAxisMax) {yAxisMax = value;}i++;}// 将数据子集添加到图表数据集合中mDataset.addSeries(seriesSlave);// ColoursXYSeriesRenderer是在Achartengine开源的项目中自定义的类ColoursXYSeriesRenderer rendererSlave = setSlaveSeriesRenderer(mChartPagerBean);// 将曲线渲染对象添加到图表渲染器中mRenderer.addSeriesRenderer(rendererSlave);}setMaxMinVallue(xAxisMax, mRenderer, yAxisMin, yAxisMax);layout.removeAllViews();mChartView = setView(context, mDataset, mRenderer);// 将图表view添加图表容器中layout.addView(mChartView, new LayoutParams(LayoutParams.MATCH_PARENT,LayoutParams.MATCH_PARENT));// 图表重绘mChartView.repaint();}/** * 设置图表XY轴的最大值和最小值 *  * @param xAxisMax *            X轴最大值 * @param mRenderer *            渲染器 * @param yAxisMin *            Y轴最小值 * @param yAxisMax *            Y轴最大值 */private void setMaxMinVallue(int xAxisMax,XYMultipleSeriesRenderer mRenderer, int yAxisMin, int yAxisMax) {mRenderer.setYAxisMin(yAxisMin);mRenderer.setYAxisMax(yAxisMax);mRenderer.setXAxisMin(1);mRenderer.setXAxisMax(xAxisMax + 1);}/** * 创建图表View *  * @param context *            上下文对象 * @param mDataset *            数据集 * @param mRenderer *            渲染器 * @return 图表视图 */private GraphicalView setView(Context context,XYMultipleSeriesDataset mDataset, XYMultipleSeriesRenderer mRenderer) {GraphicalView mChartView;mChartView = ChartFactory.getLineChartView(context, mDataset, mRenderer);mRenderer.setApplyBackgroundColor(true);// 开启背景颜色mRenderer.setBackgroundColor(Color.TRANSPARENT);// 设置背景透明mRenderer.setMarginsColor(Color.TRANSPARENT);// 设置边缘透明mRenderer.setSelectableBuffer(10);return mChartView;}/** * 创建次曲线渲染对象 *  * @param mChartPagerBean *            图表容器 * @return 曲线渲染对象 */private ColoursXYSeriesRenderer setSlaveSeriesRenderer(ChartPagerBean mChartPagerBean) {ColoursXYSeriesRenderer rendererSlave = new ColoursXYSeriesRenderer();rendererSlave.setPointStyle(PointStyle.CIRCLE);// 设置为曲线图rendererSlave.setFillPoints(true);// 数据点被填充rendererSlave.setDisplayChartValues(true);// 在图表中显示点的值rendererSlave.setDisplayChartValuesDistance(1);// 在X轴上,设置两点之间的距离rendererSlave.setColor(Color.YELLOW);// 设置点的颜色rendererSlave.setChartValuesTextSize(25);// 设置点值文本的尺寸大小rendererSlave.setChartValuesSpacing(15f);// 实时数据文本到中心点的间距rendererSlave.setUseColor(true);// 设置当前为双色曲线图rendererSlave.setWarningMinValue(mChartPagerBean.slaveWarningMin);// 设置告警最小值rendererSlave.setWarningMaxValue(mChartPagerBean.slaveWarningMax);// 设置告警最大值return rendererSlave;}/** * 创建主曲线渲染对象 *  * @param mChartPagerBean *            图表容器 * @return 曲线渲染对象 */private ColoursXYSeriesRenderer setMajorSeriesRenderer(ChartPagerBean mChartPagerBean) {ColoursXYSeriesRenderer rendererMajor = new ColoursXYSeriesRenderer();rendererMajor.setPointStyle(PointStyle.CIRCLE);// 设置为曲线图rendererMajor.setFillPoints(true);// 数据点被填充rendererMajor.setDisplayChartValues(true);// 在图表中显示点的值rendererMajor.setDisplayChartValuesDistance(1);// 在X轴上,设置两点之间的距离rendererMajor.setColor(Color.BLUE);// 设置点的颜色rendererMajor.setChartValuesTextSize(25);// 设置点值文本的尺寸大小rendererMajor.setChartValuesSpacing(15f);// 实时数据文本到中心点的间距rendererMajor.setUseColor(true);// 设置当前为双色曲线图rendererMajor.setPointColor(Color.GREEN);// 设置点的颜色rendererMajor.setChartValueTextColor(Color.WHITE);// 设置数值文本的颜色rendererMajor.setWarningMinValue(mChartPagerBean.majorWarningMin);// 设置告警最小值rendererMajor.setWarningMaxValue(mChartPagerBean.majorWarningMax);// 设置告警最大值return rendererMajor;}/** * 创建图表数据渲染器 *  * @return 图表数据渲染器 */private XYMultipleSeriesRenderer setRenderer() {XYMultipleSeriesRenderer mRenderer;mRenderer = new XYMultipleSeriesRenderer();mRenderer.setApplyBackgroundColor(true);// 开启背景颜色mRenderer.setAxisTitleTextSize(25);// 设置坐标文字尺寸大小mRenderer.setAxesColor(Color.BLACK);// /设置坐标文字颜色mRenderer.setChartTitleTextSize(20);// 设置图表标题文字尺寸大小mRenderer.setLabelsTextSize(18);// 设置刻度显示文字的大小(XY轴都会被设置)mRenderer.setLabelsColor(Color.BLACK);// 设置XY轴线的颜色mRenderer.setLegendTextSize(25);// 图例文字大小mRenderer.setMargins(new int[] { 0, 20, 0, 20 });// 设置图表的外边框(上/左/下/右)mRenderer.setZoomButtonsVisible(true);// 是否显示放大缩小按钮mRenderer.setPointSize(10);// 设置点的大小(图上显示的点的大小和图例中点的大小都会被设置)mRenderer.setXLabelsColor(Color.WHITE);// 设置X轴标签文本的颜色mRenderer.setYLabelsColor(0, Color.WHITE);// 设置Y轴标签文本的颜色return mRenderer;}}

/** * 曲线图表信息类,存储曲线图的信息 *  * */public class ChartPagerBean {public ChartPagerBean(String majorName) {this.majorName = majorName;}// 主曲线图的名称public String majorName = "";// 主曲线图的点集合public LinkedList<Integer> majorValueList = new LinkedList<Integer>();// 主曲线图y轴最小值public int majorMin = 0;// 主曲线图y轴最大值public int majorMax = 0;// 告警最小值public int majorWarningMin = 0;// 告警最大值public int majorWarningMax = 0;// 是否存在次曲线图public boolean isHasSlave = false;// 次曲线图的名称public String slaveName = "";// 次曲线图的点集合public LinkedList<Integer> slaveValueList = new LinkedList<Integer>();// 次曲线图y轴最小值public int slaveMin = 0;// 次曲线图y轴最大值public int slaveMax = 0;// 告警最小值public int slaveWarningMin = 0;// 告警最大值public int slaveWarningMax = 0;}

/** * App运行控制主类 *  * */public class MainActivity extends Activity {private ChartView mChartView;private ChartPagerBean mBean;private LinkedList<Integer> mList;private Random mRandom = new Random();private Handler mHandler = new Handler();private Runnable mRunnable;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);getWindow();requestWindowFeature(Window.FEATURE_NO_TITLE);setContentView(R.layout.activity_main);initData();mChartView = new ChartView();setRunnable();mHandler.postDelayed(mRunnable, 50);}/** * 设置Runnable对象 *  */private void setRunnable() {mRunnable = new Runnable() {@Overridepublic void run() {if (mList.size() <= 8) {mList.add(mRandom.nextInt(6) * 100);mChartView.draw(MainActivity.this, mBean,(LinearLayout) findViewById(R.id.chart_show), 6);mHandler.postDelayed(mRunnable, 1500);} else {mList.poll();mList.add(mRandom.nextInt(6) * 100);mChartView.draw(MainActivity.this, mBean,(LinearLayout) findViewById(R.id.chart_show), 6);mHandler.postDelayed(mRunnable, 1500);}}};}/** * 初始化mBean *  */private void initData() {mList = new LinkedList<Integer>();mBean = new ChartPagerBean(getString(R.string.temp));mBean.isHasSlave = false;mBean.majorMax = 800;mBean.majorMin = 50;mBean.majorWarningMax = 500;mBean.majorWarningMin = 100;mBean.majorValueList = mList;}}

1 0