0
点赞
收藏
分享

微信扫一扫

achartengine之折线图


问题在文章的最后,大致说来就是折线图,如果点的个数大于3个的时候,不是所有的点都显示对应的值的,这是为什么呢,本来以为是小问题,但两天了还没找到原因)

将前两天的折线图代码做了小量修改,形成一个类似于这样的功能(类似web页面的含有查询条件以及数据列表的功能):

页面布局:

页面A,页面B:页面A中只有一个按钮,B中有输入框和提交按钮,输入框用来输入数据。

业务流程:

1.点击A中的按钮,进入B中,此时B中没有输入数据,所以B中默认显示设置好的一个折线图,

2.在B的输入框中输入一系列以“逗号”分隔的数字,点击“确定”按钮,折线图刷新。

 

两个activity以及两个layout,代码如下:

 


[java] 
​​view plain​​​
​​​copy​​
1. package com.test.testlinechar;
2.
3. import android.app.Activity;
4. import android.content.Intent;
5. import android.os.Bundle;
6. import android.os.Handler;
7. import android.view.Menu;
8. import android.view.View;
9. import android.view.View.OnClickListener;
10. import android.widget.Button;
11.
12. public class HandlerActivity extends Activity {
13. private Button start;
14. private Button endButton;
15. private Button lineButton;
16. new Handler();
17. new Runnable() {
18.
19. @Override
20. public void run() {
21. "updateHandler");
22. 3000);
23.
24. }
25. };
26.
27. @Override
28. protected void onCreate(Bundle savedInstanceState) {
29. // TODO Auto-generated method stub
30. super.onCreate(savedInstanceState);
31. setContentView(R.layout.activity_handler);
32. start = (Button) findViewById(R.id.start);
33. endButton = (Button) findViewById(R.id.end);
34. new StartClickLintener());
35. new EndClickLintener());
36. lineButton = (Button) findViewById(R.id.line);
37. new LineClickLintener());
38. }
39.
40. @Override
41. public boolean onCreateOptionsMenu(Menu menu) {
42. // TODO Auto-generated method stub
43. return super.onCreateOptionsMenu(menu);
44. }
45. class LineClickLintener implements OnClickListener{
46.
47. @Override
48. public void onClick(View v) {
49. new Intent();
50. this, Activity_01.class);
51. startActivity(intent);
52.
53. }
54.
55. }
56.
57. }


以上和“折线图”相关的实际上只需要关注一个按钮“lineButton”

以下为布局文件:


[html] 
​​view plain​​​
​​​copy​​
1. <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
2. xmlns:tools="http://schemas.android.com/tools"
3. android:layout_width="match_parent"
4. android:layout_height="match_parent"
5. android:paddingBottom="@dimen/activity_vertical_margin"
6. android:paddingLeft="@dimen/activity_horizontal_margin"
7. android:paddingRight="@dimen/activity_horizontal_margin"
8. android:paddingTop="@dimen/activity_vertical_margin"
9. tools:context="com.test.testlinechar.HandlerActivity" >
10.
11.
12. <Button
13. android:layout_width="wrap_content"
14. android:layout_height="wrap_content"
15. android:id="@+id/start"
16. android:text="@string/start"
17. />
18. <Button
19. android:layout_width="wrap_content"
20. android:layout_height="wrap_content"
21. android:id="@+id/end"
22. android:text="@string/end"
23. android:layout_alignRight="@id/start"
24. android:layout_alignParentRight="true"
25. />
26. <Button
27. android:layout_width="wrap_content"
28. android:layout_height="wrap_content"
29. android:layout_below="@id/end"
30. android:id="@+id/line"
31. android:text="@string/line"
32. />
33. </RelativeLayout>


 

B页面代码如下:


[java] 
​​view plain​​​
​​​copy​​
1. package com.test.testlinechar;
2.
3. import java.lang.reflect.Type;
4.
5. import org.achartengine.ChartFactory;
6. import org.achartengine.GraphicalView;
7. import org.achartengine.chart.PieChart;
8. import org.achartengine.chart.PointStyle;
9. import org.achartengine.model.CategorySeries;
10. import org.achartengine.model.XYMultipleSeriesDataset;
11. import org.achartengine.model.XYSeries;
12. import org.achartengine.renderer.DefaultRenderer;
13. import org.achartengine.renderer.SimpleSeriesRenderer;
14. import org.achartengine.renderer.XYMultipleSeriesRenderer;
15. import org.achartengine.renderer.XYSeriesRenderer;
16.
17. import android.os.Bundle;
18. import android.R.integer;
19. import android.app.Activity;
20. import android.content.Intent;
21. import android.graphics.Color;
22. import android.graphics.Paint.Align;
23. import android.view.Menu;
24. import android.view.View;
25. import android.view.View.OnClickListener;
26. import android.widget.Button;
27. import android.widget.EditText;
28. import android.widget.LinearLayout;
29.
30. public class Activity_01 extends Activity {
31. private Button submit;
32. private Button reset;
33. private EditText editText;
34. private GraphicalView Gview;
35. @Override
36. protected void onCreate(Bundle savedInstanceState) {
37. super.onCreate(savedInstanceState);
38. setContentView(R.layout.activity_activity_01);
39. submit = (Button) findViewById(R.id.submit);
40. new SumbitClickListener());
41. reset = (Button) findViewById(R.id.reset);
42. editText = (EditText) findViewById(R.id.editOne);
43. String testString = editText.getText().toString();
44. double [] Ypoints = new double[]{5,4,6,3,5};;
45. if(!"".equals(testString)&&testString!=null){
46. ",");
47. new double[strings.length];
48. for(int i=0;i<strings.length;i++){
49. Ypoints[i] = Integer.valueOf(strings[i]);
50. }
51. }
52. lineView(Ypoints);
53.
54.
55. }
56.
57. @Override
58. public boolean onCreateOptionsMenu(Menu menu) {
59. // Inflate the menu; this adds items to the action bar if it is present.
60. getMenuInflater().inflate(R.menu.main, menu);
61. return true;
62. }
63.
64. class SumbitClickListener implements OnClickListener{
65.
66. @Override
67. public void onClick(View v) {
68. String tempString = editText.getText().toString();
69. null;
70. if(tempString.contains(",")){
71. ",");
72. else if(tempString.contains(",")){
73. ",");
74. }
75. double []temppoints = new double[tempStrings.length];
76. for(int i=0;i<tempStrings.length;i++){
77. temppoints[i] = Integer.valueOf(tempStrings[i]);
78. }
79. lineView(temppoints);
80. }
81.
82. }
83.
84. //折线图
85. public void lineView(double [] Ypoints){
86. //同样是需要数据dataset和视图渲染器renderer
87. new XYMultipleSeriesDataset();
88. new XYSeries("第一条线");
89. new String [Ypoints.length];
90. for(int i=0;i<Ypoints.length;i++){
91. 1, Ypoints[i]);
92. 1)+"月";
93. }
94. mDataset.addSeries(series);
95. new XYMultipleSeriesRenderer();
96. //设置图表的X轴的当前方向
97. mRenderer.setOrientation(XYMultipleSeriesRenderer.Orientation.HORIZONTAL);
98. "日期");//设置为X轴的标题
99. "价格");//设置y轴的标题
100. 20);//设置轴标题文本大小
101. "价格走势图");//设置图表标题
102. 30);//设置图表标题文字的大小
103. 18);//设置标签的文字大小
104. 20);//设置图例文本大小
105. //设置点的大小
106. 0);//设置y轴最小值是0
107. 15);
108. 10);//设置Y轴刻度个数(貌似不太准确)
109. 1);
110. true);//显示网格
111. //将x标签栏目显示如:1,2,3,4替换为显示1月,2月,3月,4月
112. for(int i=0;i<strs.length;i++){
113. 1, strs[i]);
114. }
115. 0);//设置只显示如1月,2月等替换后的东西,不显示1,2,3等
116. new int[] { 20, 30, 15, 20 });//设置视图位置
117.
118. new XYSeriesRenderer();//(类似于一条线对象)
119. //设置颜色
120. //设置点的样式
121. true);//填充点(显示的点是空心还是实心)
122. true);//将点的值显示出来
123. 10);//显示的点的值与图的距离
124. 25);//点的值的文字大小
125. 3);//设置线宽
126. mRenderer.addSeriesRenderer(r);
127.
128. LinearLayout layout = (LinearLayout) findViewById(R.id.lineChar);
129. this, mDataset, mRenderer);
130. Gview.setBackgroundColor(Color.BLACK);
131. //移除原有的LinearLayout中的视图控件
132. layout.removeAllViewsInLayout();
133. layout.addView(Gview);
134. }
135. }


B对应布局文件如下:


[html] 
​​view plain​​​
​​​copy​​
1. <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
2. xmlns:tools="http://schemas.android.com/tools"
3. android:layout_width="match_parent"
4. android:layout_height="match_parent"
5. android:paddingBottom="@dimen/activity_vertical_margin"
6. android:paddingLeft="@dimen/activity_horizontal_margin"
7. android:paddingRight="@dimen/activity_horizontal_margin"
8. android:paddingTop="@dimen/activity_vertical_margin"
9. tools:context="com.test.testlinechar.Activity_01" >
10.
11. <!-- android:layout_above="将该控件的底部置于给定ID的控件之上" -->
12. <!-- android:layout_below="将该控件的底部置于给定ID的控件之下" -->
13. <!-- android:layout_toLeftOf="将该控件的右边缘和给定ID的控件的左边缘对齐" -->
14. <!-- android:layout_toRightOf="将该控件的左边缘和给定ID的控件的右边缘对齐" -->
15. <TextView
16. android:layout_width="wrap_content"
17. android:layout_height="wrap_content"
18. android:text="@string/hello_world"
19. android:id="@+id/textOne"
20. />
21. <EditText
22. android:layout_width="fill_parent"
23. android:layout_height="wrap_content"
24. android:id="@+id/editOne"
25. android:layout_below="@id/textOne"
26. />
27.
28. <Button
29. android:layout_width="wrap_content"
30. android:layout_height="wrap_content"
31. android:id="@+id/submit"
32. android:layout_alignParentRight="true"
33. android:layout_below="@id/editOne"
34. android:text="@string/submit"
35. />
36. <Button
37. android:layout_width="wrap_content"
38. android:layout_height="wrap_content"
39. android:id="@+id/reset"
40. android:layout_toLeftOf="@id/submit"
41. android:layout_below="@id/editOne"
42. android:text="@string/reset"
43. />
44. <LinearLayout android:id="@+id/lineChar"
45. android:orientation="horizontal"
46.
47. android:layout_width="wrap_content"
48. android:layout_height="wrap_content"
49. android:layout_below="@id/submit"
50. />
51.
52.
53. </RelativeLayout>


效果图如下:

1.

 


achartengine之折线图_折线图

2.点击“折线图”,进入默认页面如图:


achartengine之折线图_android_02

 

3.在输入框中输入数据,点击“确定”按钮,如图:


achartengine之折线图_ide_03

 

以上,图形根据输入的数据动态的更新了,但是还有一个小问题,当输入的数字个数为4个的时候,点的附近没有都显示“值”,

当输入的数据个数为3个的时候,点的值都显示了,可能是那个地方的设置要调整吧,我想这个都是小问题了,先就到这里。

 

解决方案:

​​ https://code.google.com/p/achartengine/issues/detail?id=228​​​ 这个人去年提出了这个bug,最新版的jar已经修复了。但是!但是我们下载从官网下载的1.0不包括这个修复,要去achart的官网下载1.10RC版,然后使用renderer.setDisplayChartValuesDistance(30),就可以了。

原理就是原先每个值默认的间距是100,太宽了,放在linechart上回导致互相影响,设小一点或者把line间距放大就解决了!

举报

相关推荐

0 条评论