问题在文章的最后,大致说来就是折线图,如果点的个数大于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. import android.app.Activity;
  3. import android.content.Intent;
  4. import android.os.Bundle;
  5. import android.os.Handler;
  6. import android.view.Menu;
  7. import android.view.View;
  8. import android.view.View.OnClickListener;
  9. import android.widget.Button;
  10. public class HandlerActivity extends Activity {
  11. private Button start;
  12. private Button endButton;
  13. private Button lineButton;
  14. Handler handler = new Handler();
  15. Runnable updateHandler = new Runnable() {
  16. @Override
  17. public void run() {
  18. System.out.println("updateHandler");
  19. handler.postDelayed(updateHandler, 3000);
  20. }
  21. };
  22. @Override
  23. protected void onCreate(Bundle savedInstanceState) {
  24. // TODO Auto-generated method stub
  25. super.onCreate(savedInstanceState);
  26. setContentView(R.layout.activity_handler);
  27. start = (Button) findViewById(R.id.start);
  28. endButton = (Button) findViewById(R.id.end);
  29. start.setOnClickListener(new StartClickLintener());
  30. endButton.setOnClickListener(new EndClickLintener());
  31. lineButton = (Button) findViewById(R.id.line);
  32. lineButton.setOnClickListener(new LineClickLintener());
  33. }
  34. @Override
  35. public boolean onCreateOptionsMenu(Menu menu) {
  36. // TODO Auto-generated method stub
  37. return super.onCreateOptionsMenu(menu);
  38. }
  39. class LineClickLintener implements OnClickListener{
  40. @Override
  41. public void onClick(View v) {
  42. Intent intent = new Intent();
  43. intent.setClass(HandlerActivity.this, Activity_01.class);
  44. startActivity(intent);
  45. }
  46. }
  47. }

以上和“折线图”相关的实际上只需要关注一个按钮“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. <Button
  11. android:layout_width="wrap_content"
  12. android:layout_height="wrap_content"
  13. android:id="@+id/start"
  14. android:text="@string/start"
  15. />
  16. <Button
  17. android:layout_width="wrap_content"
  18. android:layout_height="wrap_content"
  19. android:id="@+id/end"
  20. android:text="@string/end"
  21. android:layout_alignRight="@id/start"
  22. android:layout_alignParentRight="true"
  23. />
  24. <Button
  25. android:layout_width="wrap_content"
  26. android:layout_height="wrap_content"
  27. android:layout_below="@id/end"
  28. android:id="@+id/line"
  29. android:text="@string/line"
  30. />
  31. </RelativeLayout>

B页面代码如下:

[java] view
plain
copy

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

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. <!--  android:layout_above="将该控件的底部置于给定ID的控件之上" -->
  11. <!--  android:layout_below="将该控件的底部置于给定ID的控件之下" -->
  12. <!--  android:layout_toLeftOf="将该控件的右边缘和给定ID的控件的左边缘对齐" -->
  13. <!--  android:layout_toRightOf="将该控件的左边缘和给定ID的控件的右边缘对齐" -->
  14. <TextView
  15. android:layout_width="wrap_content"
  16. android:layout_height="wrap_content"
  17. android:text="@string/hello_world"
  18. android:id="@+id/textOne"
  19. />
  20. <EditText
  21. android:layout_width="fill_parent"
  22. android:layout_height="wrap_content"
  23. android:id="@+id/editOne"
  24. android:layout_below="@id/textOne"
  25. />
  26. <Button
  27. android:layout_width="wrap_content"
  28. android:layout_height="wrap_content"
  29. android:id="@+id/submit"
  30. android:layout_alignParentRight="true"
  31. android:layout_below="@id/editOne"
  32. android:text="@string/submit"
  33. />
  34. <Button
  35. android:layout_width="wrap_content"
  36. android:layout_height="wrap_content"
  37. android:id="@+id/reset"
  38. android:layout_toLeftOf="@id/submit"
  39. android:layout_below="@id/editOne"
  40. android:text="@string/reset"
  41. />
  42. <LinearLayout android:id="@+id/lineChar"
  43. android:orientation="horizontal"
  44. android:layout_width="wrap_content"
  45. android:layout_height="wrap_content"
  46. android:layout_below="@id/submit"
  47. />
  48. </RelativeLayout>

效果图如下:

1.

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

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

以上,图形根据输入的数据动态的更新了,但是还有一个小问题,当输入的数字个数为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间距放大就解决了!

achartengine之折线图的更多相关文章

  1. AChartEngine 安卓折线图 柱形图等利器

    http://www.eoeandroid.com/thread-548233-1-6.html 最近公司项目中要用到折线图,状态类型的图标要用到折线图,柱形图等,并且能够动态显示,在网上找了许多de ...

  2. Android AChartEngine 去除折线图黑边

    通常使用AChartEngine画出的折线图,如果背景不是黑色,则会在折线图的坐标轴旁边出现黑边,如图所示: 试了好多设置,最后终于发现,去除黑边的设置是: mRenderer.setMarginsC ...

  3. Android图表引擎AChartEngine之折线图使用

    最近在帮老师做一个课题,其中app端需要显示折线图以便直观地看数据波动,上网查了些资料后发现了这款图标引擎,另外感谢李坤老师的博客,帮助很大. 废话不多说,下面写代码. 一.AChartEngine是 ...

  4. android使用achartengine 实现折线图

    折线图的实现分为下边几个步骤: 1.第一步:数据的准备 XYMultipleSeriesDataset mDataset = new XYMultipleSeriesDataset(); XYSeri ...

  5. AChartEngine折线图实例

    最近做项目要用到图表,在网上找相关的解决方案找了很久,搜到最多的就是这个框架,所以就开始研究下怎么使用,首先研究的就是折线图,如是做了一个实例. AChartEngine下载地址:http://cod ...

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

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

  7. 使用achartengine实现自定义折线图 ----附代码 调试OK

    achartengine作为android开发中最常用的实现图标的开源框架,使用比较方便,参考官方文档谢了如下Demo,实现了自定义折线图. package edu.ustb.chart; impor ...

  8. achartengine画出动态折线图

    achartengine画出动态折线图的效果最近有个项目需要用到实时曲线图,我也上网搜索了一下,最后还是选择使用achartengine这个现成的东西,毕竟自己再canvas一下实在是太麻烦,而且项目 ...

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

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

随机推荐

  1. hdu 5521 最短路

    Meeting Time Limit: 12000/6000 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/Others)Total ...

  2. 【HNOI2017】大佬

    题目描述 人们总是难免会碰到大佬.他们趾高气昂地谈论凡人不能理解的算法和数据结构,走到任何一个地方,大佬的气场就能让周围的人吓得瑟瑟发抖,不敢言语. 你作为一个 OIER,面对这样的事情非常不开心,于 ...

  3. Orz

    OR: 说实话,感觉Virtual Judge挺好使的,至少到现在,Uva都没注册成功过QAQ,估计是校园网的问题 不得不说现在课越来越多,而且对于我们这种学校ACM才开展两年的来说,时间真的好有限, ...

  4. [bzoj4883][Lydsy2017年5月月赛]棋盘上的守卫

    来自FallDream的博客,未经允许,请勿转载, 谢谢. 在一个n*m的棋盘上要放置若干个守卫.对于n行来说,每行必须恰好放置一个横向守卫:同理对于m列来说,每列 必须恰好放置一个纵向守卫.每个位置 ...

  5. Tinychain 是比特币的一个简易口袋实现

    Putting the rough in "rough consensus" Tinychain is a pocket-sized implementation of Bitco ...

  6. 3行代码快速实现Spring Boot Oauth2服务

    这里的3行代码并不是指真的只需要写3行代码,而是基于我已经写好的一个Spring Boot Oauth2服务.仅仅需要修改3行数据库配置信息,即可得到一个Spring Boot Oauth2服务. 项 ...

  7. Server-U FTP与AD完美集成方案详解

    最近咱有个任务,那就是把公司的文件服务器.FTP服务器.邮件服务器进行迁移并作相应的整合.登陆后台查看了,公司目前正在使用的方案.FTP服务器使用的是Server-u FTP,验证方式选择的windo ...

  8. Python学习--课本程序练习(周更)

    1.绘制正方形螺旋线 import turtle turtle.setup(600,300,200,200) turtle.pensize(1) turtle.color('green') i=0 w ...

  9. spring的事务配置方法

    spring事务的配置有两种方式 1.xml配置的声明式事务配置 (1)配置数据源信息dataSource(使用阿里的数据源) <bean id="dataSource" c ...

  10. 学习ASP.NET Core Razor 编程系列七——修改列表页面

    学习ASP.NET Core Razor 编程系列目录 学习ASP.NET Core Razor 编程系列一 学习ASP.NET Core Razor 编程系列二——添加一个实体 学习ASP.NET ...