Android 統計圖表引擎AChartEngine(四) - 源碼示例 嵌入Acitivity中的折線圖

前面幾篇博客中都是調用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(100505050));//設置背景色  
  85.     mRenderer.setAxisTitleTextSize(16); //設置軸標題文字的大小  
  86.     mRenderer.setChartTitleTextSize(20);//?設置整個圖表標題文字大小  
  87.     mRenderer.setLabelsTextSize(15);//設置刻度顯示文字的大小(XY軸都會被設置)  
  88.     mRenderer.setLegendTextSize(15);//圖例文字大小  
  89.     mRenderer.setMargins(new int[] { 3070010 });//設置圖表的外邊框(上/左/下/右)  
  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.       }, truetrue);  
  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. }  

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章