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

Android 统计图表引擎AChartEngine(四) - 源码示例 嵌入Acitivity中的折线图_第1张图片

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

[java] view plain copy
  1. packageorg.achartengine.chartdemo.demo.chart;
  2. importjava.io.File;
  3. importjava.io.FileOutputStream;
  4. importorg.achartengine.ChartFactory;
  5. importorg.achartengine.GraphicalView;
  6. importorg.achartengine.chart.PointStyle;
  7. importorg.achartengine.chartdemo.demo.R;
  8. importorg.achartengine.model.SeriesSelection;
  9. importorg.achartengine.model.XYMultipleSeriesDataset;
  10. importorg.achartengine.model.XYSeries;
  11. importorg.achartengine.renderer.XYMultipleSeriesRenderer;
  12. importorg.achartengine.renderer.XYSeriesRenderer;
  13. importorg.achartengine.tools.PanListener;
  14. importorg.achartengine.tools.ZoomEvent;
  15. importorg.achartengine.tools.ZoomListener;
  16. importandroid.app.Activity;
  17. importandroid.graphics.Bitmap;
  18. importandroid.graphics.Bitmap.CompressFormat;
  19. importandroid.graphics.Color;
  20. importandroid.os.Bundle;
  21. importandroid.os.Environment;
  22. importandroid.view.View;
  23. importandroid.view.ViewGroup.LayoutParams;
  24. importandroid.widget.Button;
  25. importandroid.widget.EditText;
  26. importandroid.widget.LinearLayout;
  27. importandroid.widget.Toast;
  28. publicclassXYChartBuilderextendsActivity{
  29. publicstaticfinalStringTYPE="type";
  30. privateXYMultipleSeriesDatasetmDataset=newXYMultipleSeriesDataset();
  31. privateXYMultipleSeriesRenderermRenderer=newXYMultipleSeriesRenderer();
  32. privateXYSeriesmCurrentSeries;
  33. privateXYSeriesRenderermCurrentRenderer;
  34. privateStringmDateFormat;
  35. privateButtonmNewSeries;
  36. privateButtonmAdd;
  37. privateEditTextmX;
  38. privateEditTextmY;
  39. privateGraphicalViewmChartView;
  40. privateintindex=0;
  41. @Override
  42. protectedvoidonRestoreInstanceState(BundlesavedState){
  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. protectedvoidonSaveInstanceState(BundleoutState){
  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. protectedvoidonCreate(BundlesavedInstanceState){
  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(newint[]{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(newView.OnClickListener(){
  77. publicvoidonClick(Viewv){
  78. StringseriesTitle="Series"+(mDataset.getSeriesCount()+1);//图例
  79. XYSeriesseries=newXYSeries(seriesTitle);//定义XYSeries
  80. mDataset.addSeries(series);//在XYMultipleSeriesDataset中添加XYSeries
  81. mCurrentSeries=series;//设置当前需要操作的XYSeries
  82. XYSeriesRendererrenderer=newXYSeriesRenderer();//定义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(newView.OnClickListener(){
  92. publicvoidonClick(Viewv){
  93. doublex=0;
  94. doubley=0;
  95. try{
  96. x=Double.parseDouble(mX.getText().toString());
  97. }catch(NumberFormatExceptione){
  98. //TODO
  99. mX.requestFocus();
  100. return;
  101. }
  102. try{
  103. y=Double.parseDouble(mY.getText().toString());
  104. }catch(NumberFormatExceptione){
  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. Bitmapbitmap=mChartView.toBitmap();
  119. try{
  120. Filefile=newFile(Environment.getExternalStorageDirectory(),"test"+index+++".png");
  121. FileOutputStreamoutput=newFileOutputStream(file);
  122. bitmap.compress(CompressFormat.PNG,100,output);
  123. }catch(Exceptione){
  124. e.printStackTrace();
  125. }
  126. //-->end
  127. }
  128. });
  129. }
  130. @Override
  131. protectedvoidonResume(){
  132. super.onResume();
  133. if(mChartView==null){
  134. LinearLayoutlayout=(LinearLayout)findViewById(R.id.chart);
  135. mChartView=ChartFactory.getLineChartView(this,mDataset,mRenderer);
  136. mRenderer.setClickEnabled(true);//设置图表是否允许点击
  137. mRenderer.setSelectableBuffer(100);//设置点的缓冲半径值(在某点附件点击时,多大范围内都算点击这个点)
  138. mChartView.setOnClickListener(newView.OnClickListener(){
  139. @Override
  140. publicvoidonClick(Viewv){
  141. //这段代码处理点击一个点后,获得所点击的点在哪个序列中以及点的坐标.
  142. //-->start
  143. SeriesSelectionseriesSelection=mChartView.getCurrentSeriesAndPoint();
  144. double[]xy=mChartView.toRealPoint(0);
  145. if(seriesSelection==null){
  146. Toast.makeText(XYChartBuilder.this,"Nochartelementwasclicked",Toast.LENGTH_SHORT)
  147. .show();
  148. }else{
  149. Toast.makeText(
  150. XYChartBuilder.this,
  151. "Chartelementinseriesindex"+seriesSelection.getSeriesIndex()
  152. +"datapointindex"+seriesSelection.getPointIndex()+"wasclicked"
  153. +"closestpointvalueX="+seriesSelection.getXValue()+",Y="+seriesSelection.getValue()
  154. +"clickedpointvalueX="+(float)xy[0]+",Y="+(float)xy[1],Toast.LENGTH_SHORT).show();
  155. }
  156. //-->end
  157. }
  158. });
  159. mChartView.setOnLongClickListener(newView.OnLongClickListener(){
  160. @Override
  161. publicbooleanonLongClick(Viewv){
  162. SeriesSelectionseriesSelection=mChartView.getCurrentSeriesAndPoint();
  163. if(seriesSelection==null){
  164. Toast.makeText(XYChartBuilder.this,"Nochartelementwaslongpressed",
  165. Toast.LENGTH_SHORT);
  166. returnfalse;//nochartelementwaslongpressed,soletsomething
  167. //elsehandletheevent
  168. }else{
  169. Toast.makeText(XYChartBuilder.this,"Chartelementinseriesindex"
  170. +seriesSelection.getSeriesIndex()+"datapointindex"
  171. +seriesSelection.getPointIndex()+"waslongpressed",Toast.LENGTH_SHORT);
  172. returntrue;//theelementwaslongpressed-theeventhasbeen
  173. //handled
  174. }
  175. }
  176. });
  177. //这段代码处理放大缩小
  178. //-->start
  179. mChartView.addZoomListener(newZoomListener(){
  180. publicvoidzoomApplied(ZoomEvente){
  181. Stringtype="out";
  182. if(e.isZoomIn()){
  183. type="in";
  184. }
  185. System.out.println("Zoom"+type+"rate"+e.getZoomRate());
  186. }
  187. publicvoidzoomReset(){
  188. System.out.println("Reset");
  189. }
  190. },true,true);
  191. //-->end
  192. //设置拖动图表时后台打印出图表坐标的最大最小值.
  193. mChartView.addPanListener(newPanListener(){
  194. publicvoidpanApplied(){
  195. System.out.println("NewXrange=["+mRenderer.getXAxisMin()+","+mRenderer.getXAxisMax()
  196. +"],Yrange=["+mRenderer.getYAxisMax()+","+mRenderer.getYAxisMax()+"]");
  197. }
  198. });
  199. layout.addView(mChartView,newLayoutParams(LayoutParams.FILL_PARENT,
  200. LayoutParams.FILL_PARENT));
  201. booleanenabled=mDataset.getSeriesCount()>0;
  202. setSeriesEnabled(enabled);
  203. }else{
  204. mChartView.repaint();
  205. }
  206. }
  207. privatevoidsetSeriesEnabled(booleanenabled){
  208. mX.setEnabled(enabled);
  209. mY.setEnabled(enabled);
  210. mAdd.setEnabled(enabled);
  211. }
  212. }

更多相关文章

  1. Android 统计图表引擎 AChartEngine (一) -简介
  2. android sqilte3数据库大小的测试
  3. android默认字体大小、高度、宽度
  4. 修改dialog的大小
  5. android获取屏幕分辨率大小(DisplayMetrics)
  6. Android图片的固定大小显示
  7. android ICS4.0.3 改变默认字体大小
  8. Android获取 应用程序大小,数据大小,缓存大小

随机推荐

  1. Android传感器的使用总结
  2. Android内存管理机制之一:low memory kill
  3. Android触摸屏事件派发机制详解与源码分
  4. [android]命令行向虚拟机发短信打电话
  5. Android像素单位
  6. android:taskAffinity与android:finishOn
  7. Android使用Itext生成pdf文件
  8. Android实现多行文字的跑马灯效果(Realizi
  9. 奔五的人,准备学习iOS开发
  10. 剑桥大学研究人员称,Android的安全性堪忧