第一步:
我使用的事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)