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

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

  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. }

安卓图表引擎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中的折线图的更多相关文章

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

    折线图: package org.achartengine.chartdemo.demo.chart; import java.util.ArrayList; import java.util.Lis ...

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

    首先看一下示例中类之间的关系: 1. ChartDemo这个类是整个应用程序的入口,运行之后的效果显示一个list. 2. IDemoChart接口,这个接口定义了三个方法, getName()返回值 ...

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

    包结构: org.achartengine: org.achartengine.model: org.achartengine.renderer: org.achartengine.tools: 安卓 ...

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

    AChartEngine 是一个安卓系统上制作图表的框架,目前它支持如下的图表类型: line chart (折线图) area chart (面积图:分区图,对比图) scatter chart ( ...

  5. 【开源项目10】安卓图表引擎AChartEngine

    安卓图表引擎AChartEngine(一) - 简介 http://blog.csdn.net/lk_blog/article/details/7645509 安卓图表引擎AChartEngine(二 ...

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

    下面只讲解一个Renderer和一个DataSet,更多内容参看官方文档 DefaultRenderer: void addSeriesRenderer(int index, SimpleSeries ...

  7. 手机端页面自适应解决方案—rem布局(进阶版,附源码示例)

    转自:https://segmentfault.com/a/1190000007350680 一年前笔者写了一篇 <手机端页面自适应解决方案—rem布局>,意外受到很多朋友的关注和喜欢.但 ...

  8. angular源码分析:angular中入境检察官$sce

    一.ng-bing-html指令问题 需求:我需要将一个变量$scope.x = '<a href="http://www.cnblogs.com/web2-developer/&qu ...

  9. angular源码分析:angular中的依赖注入式如何实现的

    一.准备 angular的源码一份,我这里使用的是v1.4.7.源码的获取,请参考我另一篇博文:angular源码分析:angular源代码的获取与编译环境安装 二.什么是依赖注入 据我所知,依赖注入 ...

随机推荐

  1. unknown filesystem type ‘iso9660’类型问题--Ubuntu

    unknown filesystem type ‘iso9660’是指系统不支持这种类型的文件, 用以下命令更新内核即可: sudo aptitude update sudo aptitude upg ...

  2. Fibonacci 数列第 N项 O(logN)算法

    时间复杂度为O( log n )的方法: 该算法使用矩阵乘法操作,使得算法时间复杂度为 O(logN) long long Fibonacci( unsigned n ) { ] = {, }; ) ...

  3. c#抓取网页内容乱码的解决方案

    写过爬虫的同学都知道,这是个很常见的问题了,一般处理思路是: 使用HttpWebRequest发送请求,HttpWebResponse来接收,判断HttpWebResponse中”Content-Ty ...

  4. FreeRTOS中断优先级配置(重要)

    FreeRTOS中断优先级配置(重要) 本章节为大家讲解FreeRTOS中断优先级配置,此章节非常重要,初学者经常在这里犯迷糊.对于初学者来说,本章节务必要整明白.12.1 NVIC基础知识12.2  ...

  5. web服务器小记

    服务器分web服务器,应用程序服务器以及HTTP服务器,此处只解释web服务器,详情: http://www.cnblogs.com/zhaoyl/archive/2012/10/10/2718575 ...

  6. OpenGL 图形管道(graphics pipeline)过程

    1.总结:Graphics pipeline 主要分为两部分工作 把3D坐标转换成2D坐标 把2D坐标转换成真实的有颜色的像素 2.下图就是一个顶点数据经过几个步骤后转化成显示在屏幕上像素的过程(一般 ...

  7. php redis 消息队列

    redis是什么东西就不多说了,网上文章一搜一大堆. 首先来说一下我要实现的功能: 类似一个消息中转站吧,如果有人要发送消息,先将消息发到我这里来,然后我这边进行转发,为的就是有一个统一的管理和修改时 ...

  8. 简单的git入门介绍及常用操作

    集中式版本控制系统采用中央服务器上存储的所有文件和实现团队协作.但是CVCS主要缺点是中央服务器的单点故障,即故障.不幸的是,如果中央服务器宕机一小时,然后在该时段没有人可以合作.即使在最坏的情况下, ...

  9. Jquery树控件ZTree异步加载

    异步加载的意思就是: 当点击展开树节点时,才去请求后台action返回点击节点的子节点数据并加载. 这里面主要设计ztree的setting变量的async属性设置: var setting = { ...

  10. 源代码管理工具-GIT

    源代码管理工具-GIT ---- 一. 掌握 - git 概述 1. git 简介? 什么是git? git是一款开源的分布式版本控制工具在世界上所有的分布式版本控制工具中,git是最快.最简单.最流 ...