• 安卓图表引擎AChartEngine(四)


    前面几篇博客中都是调用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

  • 相关阅读:
    一口气说出9种分布式ID生成方式,面试官有点懵
    13个Mongodb GUI可视化管理工具,总有一款适合你
    基于mysql-8.0.16-winx64的主从搭建(Windows10系统)
    Windows10安装多个版本的PostgreSQL数据库,但是均没有自动注册Windows服务的解决方法
    Win10安装多个MySQL实例
    内核编译步骤及模块管理
    进程管理类命令
    进程监控类命令
    进程概念介绍
    文件打包压缩
  • 原文地址:https://www.cnblogs.com/senior-engineer/p/4984565.html
Copyright © 2020-2023  润新知