码迷,mamicode.com
首页 > 移动开发 > 详细

安卓图表引擎AChartEngine(四) - 源码示例 嵌入Acitivity中的折线图

时间:2015-11-21 19:52:35      阅读:269      评论:0      收藏:0      [点我收藏+]

标签:

前面几篇博客中都是调用ChartFactory.get***Intent()方法,本节讲的内容调用ChartFactory.get***View()方法,这个方法调用的结果可以嵌入到任何一个Activity中,作为Activity的一部分。

技术分享

XYChartBuilder.java(源码分析见注释)

 

[java] view plaincopy
 
  1. package org.achartengine.chartdemo.demo.chart;  
  2.   
  3. import java.io.File;  
  4. import java.io.FileOutputStream;  
  5.   
  6. import org.achartengine.ChartFactory;  
  7. import org.achartengine.GraphicalView;  
  8. import org.achartengine.chart.PointStyle;  
  9. import org.achartengine.chartdemo.demo.R;  
  10. import org.achartengine.model.SeriesSelection;  
  11. import org.achartengine.model.XYMultipleSeriesDataset;  
  12. import org.achartengine.model.XYSeries;  
  13. import org.achartengine.renderer.XYMultipleSeriesRenderer;  
  14. import org.achartengine.renderer.XYSeriesRenderer;  
  15. import org.achartengine.tools.PanListener;  
  16. import org.achartengine.tools.ZoomEvent;  
  17. import org.achartengine.tools.ZoomListener;  
  18.   
  19. import android.app.Activity;  
  20. import android.graphics.Bitmap;  
  21. import android.graphics.Bitmap.CompressFormat;  
  22. import android.graphics.Color;  
  23. import android.os.Bundle;  
  24. import android.os.Environment;  
  25. import android.view.View;  
  26. import android.view.ViewGroup.LayoutParams;  
  27. import android.widget.Button;  
  28. import android.widget.EditText;  
  29. import android.widget.LinearLayout;  
  30. import android.widget.Toast;  
  31.   
  32. public class XYChartBuilder extends Activity {  
  33.   public static final String TYPE = "type";  
  34.   
  35.   private XYMultipleSeriesDataset mDataset = new XYMultipleSeriesDataset();  
  36.   
  37.   private XYMultipleSeriesRenderer mRenderer = new XYMultipleSeriesRenderer();  
  38.   
  39.   private XYSeries mCurrentSeries;  
  40.   
  41.   private XYSeriesRenderer mCurrentRenderer;  
  42.   
  43.   private String mDateFormat;  
  44.   
  45.   private Button mNewSeries;  
  46.   
  47.   private Button mAdd;  
  48.   
  49.   private EditText mX;  
  50.   
  51.   private EditText mY;  
  52.   
  53.   private GraphicalView mChartView;  
  54.     
  55.   private int index = 0;  
  56.   
  57.   @Override  
  58.   protected void onRestoreInstanceState(Bundle savedState) {  
  59.     super.onRestoreInstanceState(savedState);  
  60.     mDataset = (XYMultipleSeriesDataset) savedState.getSerializable("dataset");  
  61.     mRenderer = (XYMultipleSeriesRenderer) savedState.getSerializable("renderer");  
  62.     mCurrentSeries = (XYSeries) savedState.getSerializable("current_series");  
  63.     mCurrentRenderer = (XYSeriesRenderer) savedState.getSerializable("current_renderer");  
  64.     mDateFormat = savedState.getString("date_format");  
  65.   }  
  66.   
  67.   @Override  
  68.   protected void onSaveInstanceState(Bundle outState) {  
  69.     super.onSaveInstanceState(outState);  
  70.     outState.putSerializable("dataset", mDataset);  
  71.     outState.putSerializable("renderer", mRenderer);  
  72.     outState.putSerializable("current_series", mCurrentSeries);  
  73.     outState.putSerializable("current_renderer", mCurrentRenderer);  
  74.     outState.putString("date_format", mDateFormat);  
  75.   }  
  76.   
  77.   @Override  
  78.   protected void onCreate(Bundle savedInstanceState) {  
  79.     super.onCreate(savedInstanceState);  
  80.     setContentView(R.layout.xy_chart);  
  81.     mX = (EditText) findViewById(R.id.xValue);  
  82.     mY = (EditText) findViewById(R.id.yValue);  
  83.     mRenderer.setApplyBackgroundColor(true);//设置是否显示背景色  
  84.     mRenderer.setBackgroundColor(Color.argb(100, 50, 50, 50));//设置背景色  
  85.     mRenderer.setAxisTitleTextSize(16); //设置轴标题文字的大小  
  86.     mRenderer.setChartTitleTextSize(20);//?设置整个图表标题文字大小  
  87.     mRenderer.setLabelsTextSize(15);//设置刻度显示文字的大小(XY轴都会被设置)  
  88.     mRenderer.setLegendTextSize(15);//图例文字大小  
  89.     mRenderer.setMargins(new int[] { 30, 70, 0, 10 });//设置图表的外边框(上/左/下/右)  
  90.     mRenderer.setZoomButtonsVisible(true);//是否显示放大缩小按钮  
  91.     mRenderer.setPointSize(10);//设置点的大小(图上显示的点的大小和图例中点的大小都会被设置)  
  92.     mAdd = (Button) findViewById(R.id.add);  
  93.     mNewSeries = (Button) findViewById(R.id.new_series);  
  94.     mNewSeries.setOnClickListener(new View.OnClickListener() {  
  95.       public void onClick(View v) {  
  96.         String seriesTitle = "Series " + (mDataset.getSeriesCount() + 1);//图例    
  97.         XYSeries series = new XYSeries(seriesTitle);//定义XYSeries  
  98.         mDataset.addSeries(series);//在XYMultipleSeriesDataset中添加XYSeries  
  99.         mCurrentSeries = series;//设置当前需要操作的XYSeries  
  100.         XYSeriesRenderer renderer = new XYSeriesRenderer();//定义XYSeriesRenderer  
  101.         mRenderer.addSeriesRenderer(renderer);//将单个XYSeriesRenderer增加到XYMultipleSeriesRenderer  
  102.         renderer.setPointStyle(PointStyle.CIRCLE);//点的类型是圆形  
  103.         renderer.setFillPoints(true);//设置点是否实心  
  104.         mCurrentRenderer = renderer;  
  105.         setSeriesEnabled(true);  
  106.       }  
  107.     });  
  108.       
  109.     //增加一个点后重画图  
  110.     mAdd.setOnClickListener(new View.OnClickListener() {  
  111.       public void onClick(View v) {  
  112.         double x = 0;  
  113.         double y = 0;  
  114.         try {  
  115.           x = Double.parseDouble(mX.getText().toString());  
  116.         } catch (NumberFormatException e) {  
  117.           // TODO  
  118.           mX.requestFocus();  
  119.           return;  
  120.         }  
  121.         try {  
  122.           y = Double.parseDouble(mY.getText().toString());  
  123.         } catch (NumberFormatException e) {  
  124.           // TODO  
  125.           mY.requestFocus();  
  126.           return;  
  127.         }  
  128.         mCurrentSeries.add(x, y);  
  129.         mX.setText("");  
  130.         mY.setText("");  
  131.         mX.requestFocus();  
  132.         if (mChartView != null) {  
  133.           mChartView.repaint();//重画图表  
  134.         }  
  135.         //生成图片保存,注释掉下面的代码不影响图表的生成.  
  136.         //-->start  
  137.         Bitmap bitmap = mChartView.toBitmap();  
  138.         try {  
  139.           File file = new File(Environment.getExternalStorageDirectory(), "test" + index++ + ".png");  
  140.           FileOutputStream output = new FileOutputStream(file);  
  141.           bitmap.compress(CompressFormat.PNG, 100, output);  
  142.         } catch (Exception e) {  
  143.           e.printStackTrace();  
  144.         }  
  145.         //-->end  
  146.       }  
  147.     });  
  148.   }  
  149.   
  150.   @Override  
  151.   protected void onResume() {  
  152.     super.onResume();  
  153.     if (mChartView == null) {  
  154.       LinearLayout layout = (LinearLayout) findViewById(R.id.chart);  
  155.       mChartView = ChartFactory.getLineChartView(this, mDataset, mRenderer);  
  156.       mRenderer.setClickEnabled(true);//设置图表是否允许点击  
  157.       mRenderer.setSelectableBuffer(100);//设置点的缓冲半径值(在某点附件点击时,多大范围内都算点击这个点)  
  158.       mChartView.setOnClickListener(new View.OnClickListener() {  
  159.         @Override  
  160.         public void onClick(View v) {  
  161.             //这段代码处理点击一个点后,获得所点击的点在哪个序列中以及点的坐标.  
  162.             //-->start  
  163.           SeriesSelection seriesSelection = mChartView.getCurrentSeriesAndPoint();  
  164.           double[] xy = mChartView.toRealPoint(0);  
  165.           if (seriesSelection == null) {  
  166.             Toast.makeText(XYChartBuilder.this, "No chart element was clicked", Toast.LENGTH_SHORT)  
  167.                 .show();  
  168.           } else {  
  169.             Toast.makeText(  
  170.                 XYChartBuilder.this,  
  171.                 "Chart element in series index " + seriesSelection.getSeriesIndex()  
  172.                     + " data point index " + seriesSelection.getPointIndex() + " was clicked"  
  173.                     + " closest point value X=" + seriesSelection.getXValue() + ", Y=" + seriesSelection.getValue()  
  174.                     + " clicked point value X=" + (float) xy[0] + ", Y=" + (float) xy[1], Toast.LENGTH_SHORT).show();  
  175.           }  
  176.           //-->end  
  177.         }  
  178.       });  
  179.       mChartView.setOnLongClickListener(new View.OnLongClickListener() {  
  180.         @Override  
  181.         public boolean onLongClick(View v) {  
  182.           SeriesSelection seriesSelection = mChartView.getCurrentSeriesAndPoint();  
  183.           if (seriesSelection == null) {  
  184.             Toast.makeText(XYChartBuilder.this, "No chart element was long pressed",  
  185.                 Toast.LENGTH_SHORT);  
  186.             return false; // no chart element was long pressed, so let something  
  187.             // else handle the event  
  188.           } else {  
  189.             Toast.makeText(XYChartBuilder.this, "Chart element in series index "  
  190.                 + seriesSelection.getSeriesIndex() + " data point index "  
  191.                 + seriesSelection.getPointIndex() + " was long pressed", Toast.LENGTH_SHORT);  
  192.             return true; // the element was long pressed - the event has been  
  193.             // handled  
  194.           }  
  195.         }  
  196.       });  
  197.       //这段代码处理放大缩小  
  198.       //-->start  
  199.       mChartView.addZoomListener(new ZoomListener() {  
  200.         public void zoomApplied(ZoomEvent e) {  
  201.           String type = "out";  
  202.           if (e.isZoomIn()) {  
  203.             type = "in";  
  204.           }  
  205.           System.out.println("Zoom " + type + " rate " + e.getZoomRate());  
  206.         }  
  207.           
  208.         public void zoomReset() {  
  209.           System.out.println("Reset");  
  210.         }  
  211.       }, true, true);  
  212.       //-->end  
  213.       //设置拖动图表时后台打印出图表坐标的最大最小值.  
  214.       mChartView.addPanListener(new PanListener() {  
  215.         public void panApplied() {  
  216.           System.out.println("New X range=[" + mRenderer.getXAxisMin() + ", " + mRenderer.getXAxisMax()  
  217.               + "], Y range=[" + mRenderer.getYAxisMax() + ", " + mRenderer.getYAxisMax() + "]");  
  218.         }  
  219.       });  
  220.       layout.addView(mChartView, new LayoutParams(LayoutParams.FILL_PARENT,  
  221.           LayoutParams.FILL_PARENT));  
  222.       boolean enabled = mDataset.getSeriesCount() > 0;  
  223.       setSeriesEnabled(enabled);  
  224.     } else {  
  225.       mChartView.repaint();  
  226.     }  
  227.   }  
  228.   
  229.   private void setSeriesEnabled(boolean enabled) {  
  230.     mX.setEnabled(enabled);  
  231.     mY.setEnabled(enabled);  
  232.     mAdd.setEnabled(enabled);  
  233.   }  
  234. }  

 

 

安卓图表引擎AChartEngine(一) - 简介

http://blog.csdn.net/lk_blog/article/details/7645509

 

 安卓图表引擎AChartEngine(二) - 示例源码概述和分析

http://blog.csdn.net/lk_blog/article/details/7642751

 

安卓图表引擎AChartEngine(三) - 示例源码折线图、饼图和柱状图

http://blog.csdn.net/lk_blog/article/details/7645668

 

安卓图表引擎AChartEngine(四) - 源码示例嵌入Acitivity中的折线图

http://blog.csdn.net/lk_blog/article/details/7645665

 

安卓图表引擎AChartEngine(五) - Render和Dataset参数介绍

http://blog.csdn.net/lk_blog/article/details/7645661

 

安卓图表引擎AChartEngine(六) - 框架源码结构图

http://blog.csdn.net/lk_blog/article/details/7645671

 

安卓图表引擎AChartEngine(四) - 源码示例 嵌入Acitivity中的折线图

标签:

原文地址:http://www.cnblogs.com/senior-engineer/p/4984565.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!