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

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

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

  1. [size=3]    package org.achartengine.chartdemo.demo.chart;  

  2.     import java.io.File;  [/size]      [size=3]
  3.     import java.io.FileOutputStream;  

  4.     import org.achartengine.ChartFactory;  [/size]      [size=3]
  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;  [/size]      [size=3]
  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 {  [/size]      [size=3]
  29.       public static final String TYPE = "type";  

  30.       private XYMultipleSeriesDataset mDataset = new XYMultipleSeriesDataset();  [/size]      [size=3]

  31.       private XYMultipleSeriesRenderer mRenderer = new XYMultipleSeriesRenderer();  [/size]      [size=3]

  32.       private XYSeries mCurrentSeries;  [/size]      [size=3]

  33.       private XYSeriesRenderer mCurrentRenderer;  [/size]      [size=3]

  34.       private String mDateFormat;  [/size]      [size=3]

  35.       private Button mNewSeries;  [/size]      [size=3]

  36.       private Button mAdd;  [/size]      [size=3]

  37.       private EditText mX;  [/size]      [size=3]

  38.       private EditText mY;  [/size]      [size=3]

  39.       private GraphicalView mChartView;  [/size]      [size=3]

  40.       private int index = 0;  [/size]        [size=3]

  41.       @Override  [/size]      [size=3]
  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  [/size]      [size=3]
  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  [/size]      [size=3]
  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.         //增加一个点后重画图  [/size]          [size=3]
  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  [/size]      [size=3]
  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() {  [/size]              [size=3]
  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) {  [/size]      [size=3]
  208.         mX.setEnabled(enabled);  
  209.         mY.setEnabled(enabled);  
  210.         mAdd.setEnabled(enabled);  
  211.       }  
  212.     }  [/size]
复制代码


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
东南亚位于我国倡导推进的“一带一路”海陆交汇地带,作为当今全球发展最为迅速的地区之一,近年来区域内生产总值实现了显著且稳定的增长。根据东盟主要经济体公布的最新数据,印度尼西亚2023年国内生产总值(GDP)增长5.05%;越南2023年经济增长5.05%;马来西亚2023年经济增速为3.7%;泰国2023年经济增长1.9%;新加坡2023年经济增长1.1%;柬埔寨2023年经济增速预计为5.6%。 东盟国家在“一带一路”沿线国家的总体GDP经济规模、贸易总额与国外直接投资均为最大,因此有着举足轻重的地位和作用。当前,东盟与国已互相成为双方最大的交易伙伴。国-东盟贸易总额已从2013年的443亿元增长至 2023年合计超逾6.4万亿元,占国外贸总值的15.4%。在过去20余年,东盟国家不断在全球多变的格局里面临挑战并寻求机遇。2023东盟国家主要经济体受到国内消费、国外投资、货币政策、旅游业复苏、和大宗商品出口价企稳等方面的提振,经济显现出稳步增长态势和强韧性的潜能。 本调研报告旨在深度挖掘东南亚市场的增长潜力与发展机会,分析东南亚市场竞争态势、销售模式、客户偏好、整体市场营商环境,为国内企业出海开展业务提供客观参考意见。 本文核心内容: 市场空间:全球行业市场空间、东南亚市场发展空间。 竞争态势:全球份额,东南亚市场企业份额。 销售模式:东南亚市场销售模式、本地代理商 客户情况:东南亚本地客户及偏好分析 营商环境:东南亚营商环境分析 本文纳入的企业包括国外及印尼本土企业,以及相关上下游企业等,部分名单 QYResearch是全球知名的大型咨询公司,行业涵盖各高科技行业产业链细分市场,横跨如半导体产业链(半导体设备及零部件、半导体材料、集成电路、制造、封测、分立器件、传感器、光电器件)、光伏产业链(设备、硅料/硅片、电池片、组件、辅料支架、逆变器、电站终端)、新能源汽车产业链(动力电池及材料、电驱电控、汽车半导体/电子、整车、充电桩)、通信产业链(通信系统设备、终端设备、电子元器件、射频前端、光模块、4G/5G/6G、宽带、IoT、数字经济、AI)、先进材料产业链(金属材料、高分子材料、陶瓷材料、纳米材料等)、机械制造产业链(数控机床、工程机械、电气机械、3C自动化、工业机器人、激光、工控、无人机)、食品药品、医疗器械、农业等。邮箱:market@qyresearch.com

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值