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.     Handler handler = new Handler();  
  17.     Runnable updateHandler = new Runnable() {  
  18.           
  19.         @Override  
  20.         public void run() {  
  21.             System.out.println("updateHandler");  
  22.             handler.postDelayed(updateHandler, 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.         start.setOnClickListener(new StartClickLintener());  
  35.         endButton.setOnClickListener(new EndClickLintener());  
  36.         lineButton = (Button) findViewById(R.id.line);  
  37.         lineButton.setOnClickListener(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.             Intent intent = new Intent();  
  50.             intent.setClass(HandlerActivity.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.         submit.setOnClickListener(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.             String [] strings = testString.split(",");  
  47.             Ypoints = 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.             String [] tempStrings =null;  
  70.             if(tempString.contains(",")){  
  71.                 tempStrings = tempString.split(",");  
  72.             }else if(tempString.contains(",")){  
  73.                 tempStrings = tempString.split(",");  
  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.         XYMultipleSeriesDataset mDataset = new XYMultipleSeriesDataset();  
  88.         XYSeries  series = new XYSeries("第一条线");  
  89.         String [] strs = new String [Ypoints.length];  
  90.         for(int i=0;i<Ypoints.length;i++){  
  91.             series.add(i+1, Ypoints[i]);  
  92.             strs[i] =(i+1)+"月";  
  93.         }  
  94.         mDataset.addSeries(series);  
  95.         XYMultipleSeriesRenderer mRenderer = new XYMultipleSeriesRenderer();  
  96.         //设置图表的X轴的当前方向  
  97.         mRenderer.setOrientation(XYMultipleSeriesRenderer.Orientation.HORIZONTAL);  
  98.         mRenderer.setXTitle("日期");//设置为X轴的标题  
  99.         mRenderer.setYTitle("价格");//设置y轴的标题  
  100.         mRenderer.setAxisTitleTextSize(20);//设置轴标题文本大小  
  101.         mRenderer.setChartTitle("价格走势图");//设置图表标题  
  102.         mRenderer.setChartTitleTextSize(30);//设置图表标题文字的大小  
  103.         mRenderer.setLabelsTextSize(18);//设置标签的文字大小  
  104.         mRenderer.setLegendTextSize(20);//设置图例文本大小  
  105.         mRenderer.setPointSize(10f);//设置点的大小  
  106.         mRenderer.setYAxisMin(0);//设置y轴最小值是0  
  107.         mRenderer.setYAxisMax(15);  
  108.         mRenderer.setYLabels(10);//设置Y轴刻度个数(貌似不太准确)  
  109.         mRenderer.setXAxisMax(strs.length+1);  
  110.         mRenderer.setShowGrid(true);//显示网格  
  111.         //将x标签栏目显示如:1,2,3,4替换为显示1月,2月,3月,4月  
  112.         for(int i=0;i<strs.length;i++){  
  113.             mRenderer.addXTextLabel(i+1, strs[i]);  
  114.         }  
  115.         mRenderer.setXLabels(0);//设置只显示如1月,2月等替换后的东西,不显示1,2,3等  
  116.         mRenderer.setMargins(new int[] { 20, 30, 15, 20 });//设置视图位置  
  117.         
  118.         XYSeriesRenderer r = new XYSeriesRenderer();//(类似于一条线对象)  
  119.         r.setColor(Color.BLUE);//设置颜色  
  120.         r.setPointStyle(PointStyle.CIRCLE);//设置点的样式  
  121.         r.setFillPoints(true);//填充点(显示的点是空心还是实心)  
  122.         r.setDisplayChartValues(true);//将点的值显示出来  
  123.         r.setChartValuesSpacing(10);//显示的点的值与图的距离  
  124.         r.setChartValuesTextSize(25);//点的值的文字大小  
  125.         r.setLineWidth(3);//设置线宽  
  126.         mRenderer.addSeriesRenderer(r);  
  127.        
  128.         LinearLayout layout = (LinearLayout) findViewById(R.id.lineChar);  
  129.         Gview = ChartFactory.getLineChartView(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.

 

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间距放大就解决了!

时间: 2024-10-28 23:30:18

achartengine之折线图的相关文章

android-achartengine画折线图怎样使某个点变为与其他点不同的颜色

问题描述 achartengine画折线图怎样使某个点变为与其他点不同的颜色 请问Android使用achartengine画折线图怎样使某个点变为与其他点不同的颜色 解决方案 http://blog.csdn.net/kmyhy/article/details/6584298 解决方案二: http://www.open-open.com/lib/view/open1396359314653.html 绘制出单独的点,完后改变颜色 解决方案三: http://blog.csdn.net/lk_

achartengine 折线图曲线超出Y轴,还会显示,我想让超出那部分隐藏

问题描述 achartengine 折线图曲线超出Y轴,还会显示,我想让超出那部分隐藏 如题所述:如果不设置achartengin的MarginsColor就可以达到效果,但是我需要设置MarginsColor的颜色,请问该怎么办?

achartengine 折线图 怎么改变坐标刻度值的颜色

问题描述 achartengine 折线图 怎么改变坐标刻度值的颜色 achartengine 折线图 怎么改变坐标刻度值的颜色注意是刻度值 解决方案 XYMultipleSeriesRenderer.setXLabelsColor(Color.BLACK);设置X轴的刻度值的颜色XYMultipleSeriesRenderer.setYLabelsColor(0 Color.BLACK);设置Y轴的刻度值的颜色

Android绘图机制(四)——使用HelloCharts开源框架搭建一系列炫酷图表,柱形图,折线图,饼状图和动画特效,抽丝剥茧带你认识图表之美

Android绘图机制(四)--使用HelloCharts开源框架搭建一系列炫酷图表,柱形图,折线图,饼状图和动画特效,抽丝剥茧带你认识图表之美 这里为什么不继续把自定义View写下去呢,因为最近项目很急,个人能力也有限,所以就在网上找到一些开源的框架使用,不是MPAndroidChart,也不是AChartEngine ,而是HelloCharts 开源地 址:https://github.com/lecho/hellocharts-android 这次主要是翻译了一些注释和简化了一下项目的结

chart-如何在导航页面中添加折线图

问题描述 如何在导航页面中添加折线图 使用actionbar和fragment的实现导航:折线图(chart图表)采用的是AchartEngine:最好给个demo

java原生态的统计图控件——折线图例子

前言 由于一个项目要展示某系统内一段时间内的温度.湿度.二氧化碳浓度.光照强度等变化情况,需要用到折线图控件,便上网搜索一番,发现了AChartEngine.HoloGraphLibrary等开源控件库. 体验了一番,AChartEngine功能虽多,但不易上手,界面也不美观:HoloGraphLibrary虽然很漂亮,但功能又太少. 便决定自己开发折线图控件,锻炼锻炼. 根据需求,需要实现的功能点有: 刻度自适应(根据数据来调整刻度值及其间隔):数据多的需要滑动展示更多.需要注意的地方有: 节

ASP.NET画柱状图和折线图

asp.net|折线图|柱状图 using System;using System.Collections;using System.ComponentModel;using System.Data;using System.Drawing;using System.Web;using System.Web.SessionState;using System.Web.UI;using System.Web.UI.WebControls;using System.Web.UI.HtmlContro

raphael-Raphael做折线图时怎么设置图例?

问题描述 Raphael做折线图时怎么设置图例? Raphael做折线图时怎么设置图例?,网上的资料不是很多,麻烦请举例,研究了一下没研究出来

ASP生成柱型体、折线图、饼图源代码

饼图|源代码|折线图 终于将这三个写成函数,可以方便大家调用,示例如下,如果有不妥之处,希望和大家多交流.如果你喜欢这个程序的话,请回复一下,是对我的支持,也希望和大家交朋友,多切磋.也请斑竹多支持! 因本站为PHP空间所以不提供演示地址 代码:<%function table2(total,table_x,table_y,all_width,all_height,line_no)'参数含义(传递的数组,横坐标,纵坐标,图表的宽度,图表的高度,折线条数)'纯ASP代码生成图表函数2--折线图li