展会信息港展会大全

AchartEngine使用详解 android开发教程
来源:互联网   发布日期:2016-01-19 12:25:55   浏览:5031次  

导读:前段时间做了一个关于ACE的项目,发现了很多的的问题,首先是意图, 和视图,一般情况下要将数据做成视图,下面就就来总结一下要是用AchartEngine画图就要理解下面内容,第一是:怎样使用数据集( XYMultipleS ...

前段时间做了一个关于ACE的项目,发现了很多的的问题,首先是意图, 和视图,一般情况下要将数据做成视图,下面就就来总结一下

要是用AchartEngine画图就要理解下面内容,第一是:怎样使用数据集( XYMultipleSeriesDataset),第二是如何使用渲染器( XYMultipleSeriesRenderer )如果要做状图的话,还要注意类型( BarChart.Type 型)

关键就是这个,我这里x轴显示的是时间,你也可以设置其他的,字符串等都可以

下面是我做的一个例子,与大家分享一下

第一步:

我使用的事AchartEngine 1.1.0 的包。大家要先下在这个包,放到项目中,创建一个lib文件夹。然后倒金项目中去。

然后再AndroidManifest.xml 中需要注册一下

代码是:

第二步:创建一个xml文件 我这里使用的事 rain_2_2.xml

<?xml version="1.0" encoding="utf-8"?>

1

2

3

4

5

6

7

8

9

10

11

12

<Button

android:id="@+id/linepoint"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:text="@string/linepoint" />

<LinearLayout

android:id="@+id/layouto2"

android:layout_width="fill_parent"

android:layout_height="fill_parent"

android:orientation="vertical" >

</LinearLayout>

第三步:主程序代码

import java.util.Date;

import java.util.List;

import org.achartengine.ChartFactory;

import org.achartengine.GraphicalView;

import org.achartengine.chart.PointStyle;

import org.achartengine.model.TimeSeries;

import org.achartengine.model.XYMultipleSeriesDataset;

import org.achartengine.renderer.XYMultipleSeriesRenderer;

import org.achartengine.renderer.XYSeriesRenderer;

import android.content.Context;

import android.graphics.Color;

import android.graphics.Paint.Align;

/**

* 折线图

*

/

public class RainViewImp2 {

//将视图封装起来,返回视图

public GraphicalView getChartGraphicalView(Context context,List xvalue, List yvalue){

return ChartFactory.getTimeChartView(context, getDataSet(xvalue,yvalue), getRenderer(), "M/d HH:mm");

}

/*

* 构造数据

* @return

*/

//注: 也可以在这个方法里面直接传入数据,这里我是从外界传入的数据,如果要在各个方法里直接插入数据的话,我的这个被注解掉的就是,

一定要注意把这个点放进barDataset中,也就是 barDataset.addSeries(timeseries);这句代码

public XYMultipleSeriesDataset getDataSet( List xvalue,List yvalue) {

// 构造数据

XYMultipleSeriesDataset barDataset = new XYMultipleSeriesDataset();

TimeSeries timeseries=new TimeSeries("雨量");

// List xvalue=new ArrayList();

// List yvalue=new ArrayList();

// xvalue.add(new Date(355555));

// xvalue.add(new Date(359899));

// xvalue.add(new Date(855555));

//

// yvalue.add(1.0);

// yvalue.add(9.0);

// yvalue.add(22.0);

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

for(int i=0;i<xvalue.size();i++){

timeseries.add(xvalue.get(i),yvalue.get(i));

}

//将需要绘制的点放进barDataset中

barDataset.addSeries(timeseries);

return barDataset;

}

/**

* 构造渲染器

* @return

*/

public XYMultipleSeriesRenderer getRenderer() {

XYMultipleSeriesRenderer renderer = new XYMultipleSeriesRenderer();

// SimpleSeriesRenderer simp=new SimpleSeriesRenderer();

// 3, 对点的绘制进行设置

XYSeriesRenderer xyRenderer = new XYSeriesRenderer();

// 3.1设置颜色

xyRenderer.setColor(Color.GREEN);

// 3.2设置点的样式

xyRenderer.setPointStyle(PointStyle.TRIANGLE);

// 3.3, 将要绘制的点添加到坐标绘制中

renderer.addSeriesRenderer(xyRenderer);

xyRenderer.setDisplayChartValues(true);

renderer.setChartTitle("雨量实时分布");//设置图的标题

renderer.setXTitle("时间");//设置X轴标题

renderer.setYTitle("单位(毫米)");//设置y轴标题

renderer.setAxesColor(Color.WHITE);//x轴线的颜色

renderer.setLabelsColor(Color.WHITE);//y轴线的颜色

renderer.setXLabels(10);//x轴显示的个数

renderer.setYLabels(10);//y轴显示的个数

// 是否显示网格

//renderer.setShowGrid(false);

// x或y轴上数字的方向,相反的。

renderer.setXLabelsAlign(Align.RIGHT);

renderer.setYLabelsAlign(Align.RIGHT);

renderer.setPointSize((float) 3);//设置每个轴上点的大小

// 图表部分的背景颜色

renderer.setBackgroundColor(Color.TRANSPARENT);

renderer.setApplyBackgroundColor(true);

renderer.setPanEnabled(true,false);//设置xy轴能否拖动

// 设置每个柱子上是否显示数值

// renderer.getSeriesRendererAt(0).setDisplayChartValues(true);

//renderer.getSeriesRendererAt(0).setChartValuesTextSize(30);

//simp.setChartValuesTextSize(40);

// simp.setDisplayChartValues(true);

// 设置渲染器显示缩放按钮

renderer.setZoomButtonsVisible(true);

// 设置渲染器允许放大缩小

renderer.setZoomEnabled(true);

/*renderer.setXLabels(0);//设置X轴不显示数字

String X[]={"10:00","10:01","10:02","10:03","10:04","10:05","10:06","10:07","10:08","10:09","10:10"};

for(int i=0; i<X.length;i++){

renderer.addXTextLabel(i, X);

}

*/

renderer.setClickEnabled(true);//设置是否可以点击

renderer.setSelectableBuffer(20);//设置点击但范围

return renderer;

}

}

然后接下里就要在MainActivity中去调用了

import java.text.SimpleDateFormat;

import java.util.ArrayList;

import java.util.Date;

import java.util.List;

import org.achartengine.GraphicalView;

import org.achartengine.model.SeriesSelection;

import com.ezonejs.viewImp.RainViewImp2;

import android.annotation.SuppressLint;

import android.annotation.TargetApi;

import android.app.Activity;

import android.graphics.Color;

import android.os.Build;

import android.os.Bundle;

import android.view.Gravity;

import android.view.View;

import android.view.View.OnClickListener;

import android.widget.Button;

import android.widget.ImageView;

import android.widget.LinearLayout;

import android.widget.RelativeLayout;

import android.widget.Toast;

@TargetApi(Build.VERSION_CODES.ICE_CREAM_SANDWICH)

public class ChartLineMainActivity extends Activity implements OnClickListener{

LinearLayout layout2;

RelativeLayout relalayout00;

Button zhandian2;

GraphicalView graphview2;

RainViewImp2 rain2;

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.rain_2_2);

layout2=(LinearLayout)findViewById(R.id.layouto2);

zhandian2=(Button)findViewById(R.id.linepoint);

//这里注意如果是从外界传入数据,那么就在这里可以传入,也可以将其封装起来,在这里调用,如果是在上面的构造数据是传入数据,这里就不需要了,

我这里是为了动态改变数据而坐的一个简单的例子,下面的这来那个xvalue,yvalue,可以从数据库中得到值,如果你有需要自己传入,这里是初始化 的的数据

一打开图形界面就就能看到这个数据

List xvalue=new ArrayList();

List yvalue=new ArrayList();

xvalue.add(new Date(455555));

xvalue.add(new Date(559899));

xvalue.add(new Date(855555));

yvalue.add(10.0);

yvalue.add(20.0);

yvalue.add(52.0);

rain2=new RainViewImp2();

graphview2=rain2.getChartGraphicalView(getApplicationContext(),xvalue,yvalue);

layout2.addView(graphview2);

graphview2.setOnClickListener(this);

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

zhandian2.setOnClickListener(new OnClickListener() {

@Override

public void onClick(View v) {

switch (v.getId()) {

case R.id.linepoint:

//Toast.makeText(getApplicationContext(), "hdsfgdf", Toast.LENGTH_LONG).show();

List<Date> xvalue=new ArrayList<Date>();

List<Double> yvalue=new ArrayList<Double>();

xvalue.add(new Date(355555));

xvalue.add(new Date(359899));

yvalue.add(9.0);

yvalue.add(22.0);

GraphicalView graphview1=rain2.getChartGraphicalView(getApplicationContext(),xvalue,yvalue);

layout2.removeView(graphview2);//这里需要注意,很多人只做是没有用这个方法,导致图不能重新绘制,

layout2.addView(graphview1);

break;

}

}

});

}

/**

* 监听Toast,提示数据的显示格式的等

*/

@SuppressLint("SimpleDateFormat")

@Override

public void onClick(View v) {

GraphicalView graphicalView=(GraphicalView)v;

SeriesSelection seriesselection=graphicalView.getCurrentSeriesAndPoint();

if(seriesselection==null){

return ;

}

SimpleDateFormat sp=new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");

String time=sp.format(new Date(559899));

//获取x轴的值

int x=(int)seriesselection.getXValue();

//获取y轴的值

int y=(int)seriesselection.getValue();

Toast toast=new Toast(this);

toast=Toast.makeText(getApplicationContext(),"时间:"+time+"n"+"值:"+y, Toast.LENGTH_LONG);

//设置toast显示的位置

toast.setGravity(Gravity.getAbsoluteGravity(x, y), 500, 100);

Toast.makeText(getApplicationContext(), Gravity.getAbsoluteGravity(x, y)+"", Toast.LENGTH_LONG).show();

LinearLayout toastView=(LinearLayout)toast.getView();

//设置Toast的背景色

toastView.setBackgroundColor(Color.BLUE);

toast.show();//显示Toast

}

}

//这里只做了一个监听,就是监听图上数据,当点击图上局数据是会显示详细信息,如果你需要再第二绘图时还有此功能,只要把监听从新设置一下,然后调用就 可以了。

我这里没有实现 第二次点击还有效果,需要时自己设置

第四步:在数函数中调用

import android.os.Bundle;

import android.app.Activity;

import android.content.Intent;

import android.view.View;

import android.view.View.OnClickListener;

import android.widget.Button;

public class MainActivity extends Activity implements OnClickListener{

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

private Button rainbar2;//折线图

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

rainbar2 = (Button) findViewById(R.id.rain2);//折线图

rainbar2.setOnClickListener(this);

}

/**

* 监听

*/

@Override

public void onClick(View v) {

switch(v.getId()){

case R.id.rain2:

/*RainViewImp2 rainview2=new RainViewImp2();

Intent linetent2=rainview2.getIntent(this);

startActivity(linetent2);*/

Intent linetent2 = new Intent(MainActivity.this,ChartLineMainActivity.class);

startActivity(linetent2);

break;

}

}

}

这里用到了Intent对象需要在AndroidManifest.xml中注册一下

这是我使用的包,尼克一根据你自己的项目包注册一下,

否则程序一运行就停止,原因就是没有在AndroidManifest.xml中注册。

好了,这样一个简单的折线图就完成了

如果需要做状图的话,很简单只要该getTimeChartView,这个方法就可以了,有时候可能会出错,原因是渲染器造成的,柱状图的渲染器属性设置

和折线图的属性不一样,需要注意看一下。

如果需要的话可以查看官方的API文档,这里为大家提供一个网址

http://www.achartengine.org/content/javadoc/org/achartengine/ChartFactory.html#getCubeLineChartViewandroid.content.Context(, org.achartengine.model.XYMultipleSeriesDataset, org.achartengine.renderer.XYMultipleSeriesRenderer, float)

赞助本站

人工智能实验室

相关热词: AchartEngine android开发

AiLab云推荐
展开

热门栏目HotCates

Copyright © 2010-2024 AiLab Team. 人工智能实验室 版权所有    关于我们 | 联系我们 | 广告服务 | 公司动态 | 免责声明 | 隐私条款 | 工作机会 | 展会港