AchartEnghine制作折线图

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

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

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

第一步:

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

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

代码是:  <activity android:name="org.achartengine.GraphicalActivity" />


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

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <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>
</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<Date> xvalue, List<Double> yvalue){
return ChartFactory.getTimeChartView(context, getDataSet(xvalue,yvalue), getRenderer(), "M/d HH:mm");
}
/**
* 构造数据
* @return
*/

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

           一定要注意把这个点放进barDataset中,也就是  barDataset.addSeries(timeseries);这句代码
public XYMultipleSeriesDataset getDataSet( List<Date> xvalue,List<Double> yvalue) {
// 构造数据
XYMultipleSeriesDataset barDataset = new XYMultipleSeriesDataset();    

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

// List<Date> xvalue=new ArrayList<Date>();
// List<Double> yvalue=new ArrayList<Double>();
 
// 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);


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[i]);
       }
    */
       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<Date> xvalue=new ArrayList<Date>();
List<Double> yvalue=new ArrayList<Double>();
  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);
  
      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{

    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中注册一下

 <activity android:name="com.example.c.ChartLineMainActivity"/>这是我使用的包,尼克一根据你自己的项目包注册一下,

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








评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值