`
348725767
  • 浏览: 103982 次
  • 性别: Icon_minigender_1
  • 来自: 温州
社区版块
存档分类
最新评论

achartengine动态加载数据

阅读更多

现在项目有个需求就是利用achartengine动态的加载数据,当拖动图表时会下载几条数据,拖动的轨迹越长,加载的数据就越多。网上查了些资料,找不到这样的例子。于是自己写了个package com.cng;

import java.util.ArrayList;
import java.util.List;

import org.achartengine.ChartFactory;
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.R.integer;
import android.app.Activity;
import android.content.Intent;
import android.graphics.Color;
import android.graphics.Paint.Align;
import android.os.Bundle;
import android.util.Log;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnTouchListener;
import android.widget.LinearLayout;

public class DynLoadActivity extends Activity {
    /** Called when the activity is first created. */
	 private  XYMultipleSeriesDataset mDataset=new XYMultipleSeriesDataset();;
	 private  XYSeries mAtentionSeries=new XYSeries("哈哈哈");
	 //全局变量  , 记录条数
	 private int total=0;
    @Override
    public void onCreate(Bundle savedInstanceState) {
    	super.onCreate(savedInstanceState);
    	 setContentView(R.layout.main);
    	String[] titles = new String[] { "Crete"};
        int[] colors = new int[] { Color.BLUE};
        PointStyle[] styles = new PointStyle[] { PointStyle.CIRCLE};
        XYMultipleSeriesRenderer renderer = buildRenderer(colors, styles);
        int length = renderer.getSeriesRendererCount(); 
        for (int i = 0; i < length; i++) {
          ((XYSeriesRenderer) renderer.getSeriesRendererAt(i)).setFillPoints(true);
        }
        setChartSettings(renderer, "Average temperature", "Month", "Temperature", 0.5, 12.5, -10, 2000,
            Color.LTGRAY, Color.LTGRAY);
//        renderer.setXAxisMin(0);
//        renderer.setXAxisMax(100);
        renderer.setXLabels(12);
        renderer.setYLabels(10); 
        renderer.setShowGrid(true); 
        renderer.setXLabelsAlign(Align.RIGHT);
        renderer.setYLabelsAlign(Align.RIGHT); 
        renderer.setZoomButtonsVisible(true);
        renderer.setPanLimits(new double[] { -10, 2000, -10, 2000 });
        renderer.setZoomLimits(new double[] { -10, 2000, -10, 2000 });
        LinearLayout linearLayout=(LinearLayout)findViewById(R.id.linear);
        total++;
        mAtentionSeries.add(1, 11);
        
        mDataset.addSeries(mAtentionSeries);
        View view = ChartFactory.getLineChartView(this,mDataset ,
            renderer); 
        linearLayout.addView(view);
        view.setOnTouchListener(new OnTouchListener() { 
        	int x=0;
    		int x2=0;
        	public boolean onTouch(View v, MotionEvent event) { 
        		
                switch (event.getAction()) { 

                  case MotionEvent.ACTION_DOWN: {
                        //按下时触发
                	  //判断是否向做移动
                	  if(x-x2>0)
                	  {
                		  //获取要从服务器获取的条数
                		  int length=(x-x2)/20;
                		  //添加数据至图标中
                		  for(int i=0;i<length;i++)
                		  {
                			  /** toatal可当做参数传至服务器上来获取数据
                			   *  因为获取数据时必须获取的是少量的中间的连续数据
                			   *  可从for循环外面将参数total,total+length传入获取数据库中的第total到total+length数据
                			   */
                			  total++;
                			  Log.e(total+"", total+"");
                			  mAtentionSeries.add(total, total);
                		  }
                	  }
                	  //将触摸式按下的横坐标记住
                	  x=(int) event.getX();
                  } 

                  case MotionEvent.ACTION_MOVE: {
                         //移动时触发
                	  //将触摸时手指离开时的横坐标记录
                	  x2=(int) event.getX();
                  } 

                  case MotionEvent.ACTION_UP: {
                          //触摸后触发 
                  } 
                }
				return false;
            }
        });

    }
    
    
    private XYMultipleSeriesRenderer buildRenderer(int[] colors,
			PointStyle[] styles)
	{
		XYMultipleSeriesRenderer renderer = new XYMultipleSeriesRenderer();
		// 控制横纵轴的属性字大小
		renderer.setAxisTitleTextSize(15);
		// 控制横纵轴的值大小
		renderer.setChartTitleTextSize(20);
		renderer.setLabelsTextSize(15);
		renderer.setLegendTextSize(15);
		renderer.setPointSize(5f);
		renderer.setMargins(new int[]
		{ 20, 30, 15, 0 });
		int length = colors.length;
		for (int i = 0; i < length; i++)
		{
			XYSeriesRenderer r = new XYSeriesRenderer();
			r.setColor(colors[i]);
			r.setPointStyle(styles[i]);
			renderer.addSeriesRenderer(r);
		}
		return renderer;
	}

	private void setChartSettings(XYMultipleSeriesRenderer renderer,
			String title, String xTitle, String yTitle, double xMin,
			double xMax, double yMin, double yMax, int axesColor,
			int labelsColor)
	{
		renderer.setChartTitle(title);
		renderer.setXTitle(xTitle);
		renderer.setYTitle(yTitle);
		renderer.setXAxisMin(xMin);
		renderer.setXAxisMax(xMax);
		renderer.setYAxisMin(yMin);
		renderer.setYAxisMax(yMax);
		renderer.setAxesColor(axesColor);
		renderer.setLabelsColor(labelsColor);
	}

	private XYMultipleSeriesDataset buildDataset(String[] titles,
			List<double[]> xValues, List<double[]> yValues)
	{
		XYMultipleSeriesDataset dataset = new XYMultipleSeriesDataset();
		int length = titles.length;
		for (int i = 0; i < length; i++)
		{
			XYSeries series = new XYSeries(titles[i]);
			double[] xV = xValues.get(i);
			double[] yV = yValues.get(i);
			int seriesLength = xV.length;
			for (int k = 0; k < seriesLength; k++)
			{
				series.add(xV[k], yV[k]);
			}
			dataset.addSeries(series);
		}
		return dataset;
	}
}
 

其实原理很简单  就是捕获ontouch事件的ACTION_DOWN ,ACTION_UP事件,记下他们的x坐标。在下一次ACTION_DOWN 时出发加载数据事件,我这里没有调用访问webservice事件,

只是模拟了几个数据。

这代码很水,望指教

3
0
分享到:
评论
13 楼 348724481 2013-12-12  
ducp123 写道
348725767 写道
bailin_ys 写道
348725767 写道
天涯jelly 写道
你好,我用achartengine做出来的图,我想设置整个布局的背景,为什莫运行出来后变成了那个图标的背景呢,四周都是黑色的呢?

貌似我也遇到过,但是没解决。。



我也纠结了好久,发现一个方法可以解决,renderer.setMarginsColor(color);
因为backgroundColor只是图标中间绘图部分的背景颜色,所以要使周边也变色就要加上这句了。

学习了




你好!!我想问一下,他怎么去获取list里面的数据?list类型为List<May<String,Object>> data ;请问怎么获取data里面的数据来进行数据的build呢?

下面的背景改不了啊
12 楼 ducp123 2012-08-24  
348725767 写道
bailin_ys 写道
348725767 写道
天涯jelly 写道
你好,我用achartengine做出来的图,我想设置整个布局的背景,为什莫运行出来后变成了那个图标的背景呢,四周都是黑色的呢?

貌似我也遇到过,但是没解决。。



我也纠结了好久,发现一个方法可以解决,renderer.setMarginsColor(color);
因为backgroundColor只是图标中间绘图部分的背景颜色,所以要使周边也变色就要加上这句了。

学习了




你好!!我想问一下,他怎么去获取list里面的数据?list类型为List<May<String,Object>> data ;请问怎么获取data里面的数据来进行数据的build呢?
11 楼 348725767 2012-08-12  
bailin_ys 写道
348725767 写道
天涯jelly 写道
你好,我用achartengine做出来的图,我想设置整个布局的背景,为什莫运行出来后变成了那个图标的背景呢,四周都是黑色的呢?

貌似我也遇到过,但是没解决。。



我也纠结了好久,发现一个方法可以解决,renderer.setMarginsColor(color);
因为backgroundColor只是图标中间绘图部分的背景颜色,所以要使周边也变色就要加上这句了。

学习了
10 楼 bailin_ys 2012-08-07  
348725767 写道
天涯jelly 写道
你好,我用achartengine做出来的图,我想设置整个布局的背景,为什莫运行出来后变成了那个图标的背景呢,四周都是黑色的呢?

貌似我也遇到过,但是没解决。。



我也纠结了好久,发现一个方法可以解决,renderer.setMarginsColor(color);
因为backgroundColor只是图标中间绘图部分的背景颜色,所以要使周边也变色就要加上这句了。
9 楼 hubenshan 2012-04-18  
按还在学习学习学习!
8 楼 cn23snyga 2012-04-18  
图表的背景与它的父容器背景是分开的。
图表中有一个属性,可以设置穿透背景色,就可以显示出其父容器的背景了
而且设置图表的背景,同时还要设置图表背景生效的一个属性。

我的图表已经重做了,使用Canvas 绘图,因为项目需求又要增加更多的关于图表的操作
个人认为,使用ACE制表,只适合单一的图表显示,不适合在其上增加操作
自己绘图,可以更好的控制图表的坐标,增加响应事件。
7 楼 348725767 2012-04-17  
天涯jelly 写道
你好,我用achartengine做出来的图,我想设置整个布局的背景,为什莫运行出来后变成了那个图标的背景呢,四周都是黑色的呢?

貌似我也遇到过,但是没解决。。
6 楼 天涯jelly 2012-04-17  
你好,我用achartengine做出来的图,我想设置整个布局的背景,为什莫运行出来后变成了那个图表的背景呢,四周都是黑色的呢?
5 楼 天涯jelly 2012-04-17  
你好,我用achartengine做出来的图,我想设置整个布局的背景,为什莫运行出来后变成了那个图标的背景呢,四周都是黑色的呢?
4 楼 cn23snyga 2012-03-07  
348725767 写道
cn23snyga 写道
或者换个说法,拆线图表中,如何获取到横、纵坐标的节点值?怎样和屏幕坐标换算呢?
或者可不可以在节点处加一图形,我就想在点击这个节点时,弹出一个pop窗口,不是任意一点都可以弹,只是在节点处触发!!?
请贵博赐教!!!

这个我不知道。。我也是新手。。也没深入研究过。。
要么你去网上找找看,他那个图表的移动肯定也是根据横纵坐标来移动的。

问题解决了,实现方法有点笨拙,就是换算图表和屏幕坐标,期待大家有更好的方法实现。
有需要的朋友可以联系我QQ:14561917
3 楼 348725767 2012-02-18  
cn23snyga 写道
或者换个说法,拆线图表中,如何获取到横、纵坐标的节点值?怎样和屏幕坐标换算呢?
或者可不可以在节点处加一图形,我就想在点击这个节点时,弹出一个pop窗口,不是任意一点都可以弹,只是在节点处触发!!?
请贵博赐教!!!

这个我不知道。。我也是新手。。也没深入研究过。。
要么你去网上找找看,他那个图表的移动肯定也是根据横纵坐标来移动的。
2 楼 cn23snyga 2012-02-16  
或者换个说法,拆线图表中,如何获取到横、纵坐标的节点值?怎样和屏幕坐标换算呢?
或者可不可以在节点处加一图形,我就想在点击这个节点时,弹出一个pop窗口,不是任意一点都可以弹,只是在节点处触发!!?
请贵博赐教!!!
1 楼 cn23snyga 2012-02-16  
  请教贵博,用ACE 绘制出的图表,可以捕捉到点击事件的坐标值吗?(注:是图表中的坐标,而不是屏幕的坐标,或者有好方法可以二者换算也可以)

另:贵博很强大,膜拜!!!

相关推荐

Global site tag (gtag.js) - Google Analytics