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)
最后在*找到了答案: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.****.net/detail/u011991258/7723011