近来要开发一款支持Android系统的与股票有关的软件,该软件需要显示股票走势图。开始想用最基础的画板和画笔去实现,然而实际设计时发现比较复杂,需要抽象出很多对象,代码量也很大,而且还存在很多难以预料的风险,所以就上网查了很多资料,希望能找到更好的实现方法。最后发现了Android图标开发库AChartEngine。先看下英文说明:

       AChartEngine is a charting library for Android applications. It currently supports the following chart types: 
       line chart
       area chart
       scatter chart 
       time chart
       bar chart
       pie chart
       bubble chart
       doughnut chart
       range (high-low) bar chart
       dial chart / gauge

       怎么样?是不是一个很强大呢?当然是针对Android来说的,如果对PC和Web来说这都是皮毛…^_^

       先上图吧,这是我参考官方文档写的一个Demo,后面我会把代码和相关函数贴上来……

Android图表开发库AChartEngine

        虽然很丑,但这是我的辛辛苦苦的劳动成果呢…呵呵

        开始贴代码:

        首先引入jar包,就不j细说了……

        StockChartBuilder.java:

Java代码
  1. /**   
  2. * ClassName : </br>   
  3. * <p>   
  4. * 功能描述:股票走势图   
  5. * </p>   
  6. * History</br>   
  7. * Create User: LuPing</br>   
  8. * Create Date: 2011-5-15 下午07:10:54</br>   
  9. * Update User:</br>   
  10. * Update Date:</br>   
  11. */    
  12. public class StockChartBuilder extends Activity {    
  13. public static final String TYPE = "type";    
  14.   
  15. private XYMultipleSeriesDataset mDataset = new XYMultipleSeriesDataset();    
  16.   
  17. private XYMultipleSeriesRenderer mRenderer = new XYMultipleSeriesRenderer();    
  18.   
  19. private XYSeries mCurrentSeries;    
  20.   
  21. private XYSeriesRenderer mCurrentRenderer;    
  22.   
  23. private String mDateFormat;    
  24.   
  25. private GraphicalView mChartView;    
  26.   
  27. /**   
  28. * 提取保存数据 恢复Activity状态   
  29. */    
  30. @Override    
  31. protected void onRestoreInstanceState(Bundle savedState) {    
  32. super.onRestoreInstanceState(savedState);    
  33. mDataset = (XYMultipleSeriesDataset) savedState    
  34. .getSerializable("dataset");    
  35. mRenderer = (XYMultipleSeriesRenderer) savedState    
  36. .getSerializable("renderer");    
  37. mCurrentSeries = (XYSeries) savedState    
  38. .getSerializable("current_series");    
  39. mCurrentRenderer = (XYSeriesRenderer) savedState    
  40. .getSerializable("current_renderer");    
  41. mDateFormat = savedState.getString("date_format");    
  42. }    
  43.   
  44. /**   
  45. * 在Activity销毁前 保存数据状态   
  46. */    
  47. @Override    
  48. protected void onSaveInstanceState(Bundle outState) {    
  49. super.onSaveInstanceState(outState);    
  50. outState.putSerializable("dataset", mDataset);    
  51. outState.putSerializable("renderer", mRenderer);    
  52. outState.putSerializable("current_series", mCurrentSeries);    
  53. outState.putSerializable("current_renderer", mCurrentRenderer);    
  54. outState.putString("date_format", mDateFormat);    
  55. }    
  56.   
  57. @Override    
  58. protected void onCreate(Bundle savedInstanceState) {    
  59. super.onCreate(savedInstanceState);    
  60. setContentView(R.layout.xy_chart);    
  61.   
  62. // 创建 系列(画笔、渲染)    
  63. String seriesTitle = "上证指数";    
  64. XYSeries series = new XYSeries(seriesTitle);    
  65. mDataset.addSeries(series);    
  66. mCurrentSeries = series;    
  67. XYSeriesRenderer seriesRenderer = new XYSeriesRenderer();    
  68.   
  69. // 设置seriesRenderer风格    
  70. seriesRenderer.setColor(Color.BLUE); // 画笔颜色    
  71. seriesRenderer.setFillBelowLine(true); // 确定填充    
  72. seriesRenderer.setFillBelowLineColor(Color.RED); //填充颜色    
  73. // seriesRenderer.setFillPoints(true); // 不知道干什么用的    
  74. seriesRenderer.setPointStyle(PointStyle.POINT); //设置画笔风格    
  75. seriesRenderer.setLineWidth(3.0f); // 设置画笔宽度    
  76.   
  77. mRenderer.addSeriesRenderer(seriesRenderer);    
  78. mRenderer.setYAxisMin(0d); // 设置Y维度最小值    
  79. mRenderer.setYAxisMax(120d); // 设置Y维度最大值    
  80. mRenderer.setXAxisMax(24d);// 设置X维度最大值    
  81. mRenderer.setShowGrid(true); // 设置背景格子    
  82. mRenderer.setXLabels(24); // 设置X坐标分成24份    
  83. mRenderer.setChartTitle("上证指数-24小时走势图");    
  84. mCurrentRenderer = seriesRenderer;    
  85.   
  86. // 数据绘制 To Do    
  87. double x = 0;    
  88. double y = 0;    
  89. // 获取 (x,y) 数据集    
  90. int[][] xyValues = getValues();    
  91.   
  92. for (int i = 0; i < xyValues.length; i++) {    
  93. x = xyValues[i][0];    
  94. y = xyValues[i][1];    
  95. mCurrentSeries.add(x, y);    
  96. }    
  97.   
  98. }    
  99.   
  100. /**   
  101. * 在 onResume 里进行绘制 在横屏切换时自动调用   
  102. */    
  103. @Override    
  104. protected void onResume() {    
  105. super.onResume();    
  106. if (mChartView == null) {    
  107. LinearLayout layout = (LinearLayout) findViewById(R.id.chart);    
  108. mChartView = ChartFactory.getLineChartView(this, mDataset,    
  109. mRenderer);    
  110. layout.addView(mChartView, new LayoutParams(    
  111. LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT));    
  112.   
  113. else {    
  114. mChartView.setBackgroundResource(R.id.chart);    
  115. mChartView.repaint();    
  116. }    
  117. }    
  118.   
  119. /**   
  120. * 数据入口   
  121.  
  122. * @return x、y 坐标集   
  123. */    
  124. private int[][] getValues() {    
  125. int[][] xyValues = { { 088 }, { 179 }, { 275 }, { 371 },    
  126. 490 }, { 588 }, { 666 }, { 765 }, { 850 },    
  127. 978 }, { 1067 }, { 1177 }, { 1279 }, { 1385 },    
  128. 1489 }, { 1593 }, { 1695 }, { 1799 }, { 1866 },    
  129. 1955 }, { 2044 } };    
  130. return xyValues;    
  131. }    
  132.   
  133. /*   
  134. * (non-Javadoc)   
  135.  
  136. * @see android.app.Activity#onTouchEvent(android.view.MotionEvent)   
  137. */    
  138. @Override    
  139. public boolean onTouchEvent(MotionEvent event) {    
  140.   
  141. return super.onTouchEvent(event);    
  142. }    
  143. }   

       xy_chart.xml (Layout):

XML/HTML代码
  1. <?xml version="1.0" encoding="utf-8"?>    
  2.   
  3. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    
  4. android:orientation="vertical" android:layout_width="fill_parent"    
  5. android:layout_height="fill_parent">    
  6.   
  7. <TextView android:layout_width="wrap_content" android:layout_height="wrap_content"    
  8. android:text="@string/add_values" />    
  9.   
  10. <TableLayout android:orientation="vertical"    
  11. android:layout_width="fill_parent"    
  12. android:layout_height="wrap_content">    
  13.   
  14. </TableLayout>    
  15.   
  16. <LinearLayout android:id="@+id/chart" android:orientation="horizontal"    
  17. android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_weight="1" />    
  18.   
  19. <LinearLayout android:orientation="horizontal"    
  20. android:layout_width="fill_parent" android:layout_height="wrap_content" >    
  21. </LinearLayout>    
  22.   
  23. </LinearLayout>   

       AndroidManifest.xml

XML/HTML代码
  1. <?xml version="1.0" encoding="utf-8"?>    
  2. <manifest xmlns:android="http://schemas.android.com/apk/res/android"    
  3. package="com.cn.eagle"    
  4. android:versionCode="1"    
  5. android:versionName="1.0">    
  6.   
  7. <application android:icon="@drawable/icon" android:label="@string/app_name">    
  8.   <activity android:name=". StockChartBuilder "    
  9. android:label="@string/app_name">    
  10. <intent-filter>    
  11. <action android:name="android.intent.action.MAIN" />    
  12. <category android:name="android.intent.category.LAUNCHER" />    
  13. </intent-filter>    
  14. </activity>    
  15.   
  16. <activity android:name="org.achartengine.GraphicalActivity" />    
  17.   
  18. </application>    
  19. </manifest>   

       strings.xml (values):

XML/HTML代码
  1. <?xml version="1.0" encoding="utf-8"?>    
  2. <resources>    
  3. <string name="hello">Hello World, ChartTest!</string>    
  4. <string name="app_name">走势图(示例)</string>    
  5. <string name="add_values">输入值生成走势图</string>    
  6. <string name="x">X</string>    
  7. <string name="y">Y</string>    
  8. <string name="add">Add</string>    
  9. <string name="new_series">New series</string>    
  10. </resources>   

       打完收工^_^ ……

本文发布:Android开发网
本文地址:http://www.jizhuomi.com/android/environment/130.html
2012年7月27日
发布:鸡啄米 分类:Android开发环境 浏览: 评论:1