achartengine 实现平行线 动态数据 x轴动态移动
achartengine做平行线的时候经常会遇到:
java.lang.IndexOutOfBoundsException: Invalid index 1, size is 1
at java.util.ArrayList.throwIndexOutOfBoundsException(ArrayList.java:251)
at org.achartengine.renderer.DefaultRenderer.getSeriesRendererAt(DefaultRenderer.java:189)
at org.achartengine.chart.XYChart.draw(XYChart.java:240)
at org.achartengine.GraphicalView.onDraw(GraphicalView.java:168)
最后在stackoverflow找到了答案:1个数据就要用一个XYSeriesRenderer 所以两条平行线就要用2个XYSeriesRenderer
最后效果图:
package com.example.achartparallel; import com.example.achartparallel.XYRenderer; import java.math.BigDecimal;
import java.text.DecimalFormat; import org.achartengine.ChartFactory;
import org.achartengine.GraphicalView;
import org.achartengine.chart.PointStyle;
import org.achartengine.model.XYMultipleSeriesDataset;
import org.achartengine.model.XYSeries;
import org.achartengine.renderer.XYMultipleSeriesRenderer;
import org.achartengine.renderer.XYSeriesRenderer; import android.app.Activity;
import android.app.AlertDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.graphics.Color;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup.LayoutParams;
import android.view.Window;
import android.view.WindowManager;
import android.widget.Button;
import android.widget.EditText;
import android.widget.LinearLayout;
import android.widget.TextView;
import android.widget.Toast; public class MainActivity extends Activity { private XYSeries xyseries;//数据
private XYSeries xyseries_up;//上平行线
private XYSeries xyseries_down;//下平行线
private XYMultipleSeriesDataset dataset;
private GraphicalView chartview;
private XYMultipleSeriesRenderer renderer;
private XYSeriesRenderer datarenderer;
private XYSeriesRenderer datarenderer_up;
private XYSeriesRenderer datarenderer_down;
private Context context; int i=0;
Thread t;
private int addX ;
private double addY ;
int X_MAX=10;//x轴最大值 //标准和阈值
double value=10 ;//平行线中间值
double bound=0.5;//上下限 可以自己随意设定
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE); //无title
setContentView(R.layout.activity_main);
LinearLayout chart_layout1 = (LinearLayout)findViewById(R.id.chart_layout1);
chart_layout1.setBackgroundColor(Color.BLACK); //No.1 设定大渲染器的属性 太多了 所以写了个类
renderer=new XYRenderer("零件", "X轴(单位:id)", "Y轴(mm)",
0,X_MAX, -1, 1, Color.GRAY, Color.LTGRAY,
16,16,10,15,20,10,true);
dataset=new XYMultipleSeriesDataset();
datarenderer=new XYSeriesRenderer();
datarenderer.setDisplayChartValues(true);
xyseries=new XYSeries("零件");
//
xyseries.add(0, 0);//先输入一个数据让它绘出renderer
//
dataset.addSeries(0,xyseries);
datarenderer.setColor(Color.GREEN);
datarenderer.setPointStyle(PointStyle.POINT);
//
renderer.addSeriesRenderer(datarenderer); //
context = getApplicationContext();
chartview = ChartFactory.getLineChartView(context, dataset, renderer);
chart_layout1.addView(chartview, new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT)); //设置按钮 用来记录尺寸的标准(value)和阈值(bound),然后再主界面显示出红线 //绘出两条红线 分别用新的XYSeriesRenderer要不然会报错
xyseries_up=new XYSeries("阈值1");
xyseries_down=new XYSeries("阈值2");
xyseries_up.add(0 , value+bound);
xyseries_up.add(X_MAX*2, value+bound);
xyseries_down.add(0, value-bound);
xyseries_down.add(X_MAX*2,value-bound);
dataset.addSeries(1,xyseries_up);
dataset.addSeries(2,xyseries_down);
datarenderer_up = new XYSeriesRenderer();
datarenderer_down = new XYSeriesRenderer();
datarenderer_up.setColor(Color.RED);
datarenderer_down=datarenderer_up;
renderer.addSeriesRenderer(datarenderer_up);
renderer.addSeriesRenderer(datarenderer_down);
renderer.setYAxisMin(value-(4*bound));// Y最小值
renderer.setYAxisMax(value+(4*bound));// Y最小值
//设置chart的视图范围 参数//1x->start 2max 3y->start 4max
renderer.setRange(new double[]{0d, (double)X_MAX, value-(4*bound), value+(4*bound)});
// chartview.repaint(); t=new Thread (r1);
t.start(); }//oncreate end //handler处理UI更新
Handler myhandler=new Handler()
{ @Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
135 //可以处理些数据
chartview.repaint();
} }; Runnable r1=new Runnable() {
BigDecimal b; public void run(){
try {
while(true)
{
i++;
Thread.sleep(500);
addX = i;
//设置好下一个需要增加的节点 随机产生 在value+-bound左右
b =new BigDecimal(((Math.random())*bound*4)-(2*bound)); //转换
addY=b.setScale(3, BigDecimal.ROUND_HALF_UP).doubleValue();
//double+double再转一次
b =new BigDecimal(addY+value); //保留三位小数 四舍五入
addY=b.setScale(3, BigDecimal.ROUND_HALF_UP).doubleValue(); //传给hanlder
Message message=new Message();
Bundle bundle=new Bundle();
bundle.putString("part_id1", "编号:"+addX);
bundle.putString("part_size1", "尺寸:"+addY);
message.setData(bundle);//bundle传值,耗时,效率低
myhandler.sendMessage(message);//发送message信息
message.what=1;//标志是哪个线程传数据 //步骤不能变 1先清除数据 2添加源数据 3添加数据
dataset.removeSeries(xyseries);
xyseries.add(addX, addY);
dataset.addSeries(0,xyseries);
//chartview.repaint();
chartview.postInvalidate(); if(i*2>X_MAX)//延长X_MAX造成右移效果
{
X_MAX*=2;//按2倍速度延长 可以设置成speed
renderer.setXAxisMax(X_MAX);// 设置X最大值
dataset.removeSeries(xyseries_up);
dataset.removeSeries(xyseries_down);
xyseries_up.add(X_MAX/2 , value+bound);
xyseries_up.add(X_MAX, value+bound);
xyseries_down.add(X_MAX/2, value-bound);
xyseries_down.add(X_MAX,value-bound);
dataset.addSeries(1,xyseries_up);
dataset.addSeries(2,xyseries_down);
// datarenderer_up = new XYSeriesRenderer();
// datarenderer_down = new XYSeriesRenderer();
// datarenderer_up.setColor(Color.RED);
// datarenderer_down=datarenderer_up;
renderer.addSeriesRenderer(datarenderer_up);
renderer.addSeriesRenderer(datarenderer_down);
} }
} catch (InterruptedException e) {
e.printStackTrace();
} }
};
@Override
protected void onDestroy() {
t.interrupt();
System.out.println("destory");
super.onDestroy();
} }
package com.example.achartparallel; import org.achartengine.renderer.XYMultipleSeriesRenderer; public class XYRenderer extends XYMultipleSeriesRenderer
{
//图表样式构造器
public XYRenderer()
{ }
public XYRenderer(
String title, String xTitle, String yTitle, double xMin,
double xMax, double yMin, double yMax, int axesColor,
int labelsColor,int XTitleTextSize,int ChartTitleTextSize,
int LabelsTextSize,int LegendTextSize,int Xshow,int Yshow,
boolean ShowGrid)
{
this.setChartTitle(title);
this.setXTitle(xTitle);// X轴标题
this.setYTitle(yTitle);// Y轴标题
this.setXAxisMin(xMin);// X最小值
this.setXAxisMax(xMax);// X最大值
this.setYAxisMin(yMin);// Y最小值
this.setYAxisMax(yMax);// Y最小值
this.setAxesColor(axesColor);// X轴颜色
this.setLabelsColor(labelsColor);// Y轴颜色
this.setAxisTitleTextSize(XTitleTextSize); // 坐标轴标题字体大小:16
this.setChartTitleTextSize(ChartTitleTextSize); // 图表标题字体大小:20
this.setLabelsTextSize(LabelsTextSize); // 轴标签字体大小:10
this.setLegendTextSize(LegendTextSize); // 图例字体大小:15
this.setXLabels(Xshow);//设置X轴显示的刻度标签的个数
this.setYLabels(Yshow);//设置Y轴显示的刻度标签的个数
this.setShowGrid(ShowGrid); // 设置网格显示 } }
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="com.example.achartparallel.MainActivity"
android:id="@+id/chart_layout1" > </LinearLayout>
工程下载:http://download.csdn.net/detail/u011991258/7723011
achartengine 实现平行线 动态数据 x轴动态移动的更多相关文章
- PBOC2.0安全系列之—脱机认证之动态数据认证(DDA)
动态数据认证: 一,什么是动态数据认证(DDA) 由于上篇<< PBOC2.0安全系列之—脱机认证之静态数据认证(SDA)>>已经对静态数据认证部分做了详细的分析,一些基本知识 ...
- Echarts基于动态数据初步使用 及问题 代码记录.
ECHARTS 插件 基本的动态数据展示(横向图) 下载 echarts.commn.min.js文件 在页面中进行引用, 并为Echarts图形准备一个div盒子 <!-- 引入插件 --&g ...
- highcharts 动态生成x轴和折线图
highchart 动态生成x轴和折线图 <!DOCTYPE HTML> <html> <head> <meta charset="utf-8&qu ...
- 聊聊、Highcharts 动态数据优化版
好久没来博客园了,最近项目太紧.上一篇写了 <Highcharts 之[动态数据]>,不够完善,虽然横纵轴可以动态取数据,但是行业信息是固定的,不能随着大数据热点改变.废话不说,直接上代码 ...
- 聊聊、Highcharts 动态数据
最近项目中需要用到图表,找了几个开源框架,最后选择 Highcharts,原因是 Highcharts 功能强大,稳定,方便,而且开源,社区比较成熟. 首先下载 Highcharts,导入项目. 在 ...
- Arcgis栅格时序地图制作---时间轴动态展示多期影像
转自原文 Arcgis栅格时序地图制作---时间轴动态展示多期影像 效果如何???满意您go on,不满意咱 say goodbye··· 题外话: 为了在这里动态展示下制作结果,也是费了老劲了,转换 ...
- 【Paddy】如何将物理表分割成动态数据表与静态数据表
前言 一般来说,物理表的增.删.改.查都受到数据量的制约,进而影响了性能. 很多情况下,你所负责的业务关键表中,每日变动的数据库与不变动的数据量比较,相差非常大. 这里我们将变动的数据称为动态数据,不 ...
- C#+JQuery+.Ashx+百度Echarts实现全国省市地图和饼状图动态数据图形报表的统计
在目前的一个项目中,需要用到报表表现数据,这些数据有多个维度,需要同时表现出来,同时可能会有大量数据呈现的需求,经过几轮挑选,最终选择了百度的echarts作为报表基础类库.echarts功能强大,界 ...
- 浅谈如何使用python抓取网页中的动态数据
我们经常会发现网页中的许多数据并不是写死在HTML中的,而是通过js动态载入的.所以也就引出了什么是动态数据的概念, 动态数据在这里指的是网页中由Javascript动态生成的页面内容,是在页面加载到 ...
随机推荐
- ajax局部刷新分页
//请求数据加载绑定页面 function DindAjax(pageIndex) {//获取参数 var colors = $("#colorsVal").val(); $.aj ...
- 【转载】ADO.NET与ORM的比较(4):EntityFramework实现CRUD
[转载]ADO.NET与ORM的比较(4):EntityFramework实现CRUD 说明:个人感觉在Java领域大型开发都离不了ORM的身影,所谓的SSH就是Spring+Struts+Hiber ...
- iOS archive(归档)的总结
http://www.cnblogs.com/ios8/p/ios-archive.html
- 类似QQ侧滑菜单功能实现
之前的那文章简单实现了菜单侧拉功能,但是做不到像QQ那样导航条和tabBar一起移动...之后在网上找资料,有了思路,就自个写了个demo试试水. 先创建QHLMainController控制器,并把 ...
- ORA-00937:不是单组分组函数_Oracle
Demo: SELECT USER_ID, USER_NAME, USER_SEX, MAX(USER_AGE), SUM(USER_MONEY) AS USER_MONEY USER_TEL, US ...
- CMarkUp读写XML(转)
Fast start to XML in C++ Enough bull. You want to create XML or read and find things in XML. All you ...
- (原)Understand中查看函数调用关系
转载请注明出处: http://www.cnblogs.com/darkknightzh/p/4994551.html 1. 选中某函数,如_tmain,右键“Graphical Views——Cal ...
- git commit的--amend选项
git commit --amend常常用来修改某个branch上最顶端的commit,大多数情况下,这个命令给人的感觉是用新的commit替换了原来的commit.git commit --amen ...
- CSS3动画之透视
若在x,y轴rotate90度,其实是线,不显示,按近大远小的透视关系可用 perspective:数值 开启透视: 默认以中间线为旋转基线,可以用transform-origin来设置旋转基线 在z ...
- java普通类如何得到spring中的bean类
在SSH集成的前提下.某些情况我们需要在Action以外的类中来获得Spring所管理的Service对象. 之前我在网上找了好几好久都没有找到合适的方法.例如: ApplicationContext ...