天天看點

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

前面幾篇部落格中都是調用ChartFactory.get***Intent()方法,本節講的内容調用ChartFactory.get***View()方法,這個方法調用的結果可以嵌入到任何一個Activity中,作為Activity的一部分。

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

XYChartBuilder.java(源碼分析見注釋)

[java]  view plain copy

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