`
348725767
  • 浏览: 105228 次
  • 性别: 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 绘制出的图表,可以捕捉到点击事件的坐标值吗?(注:是图表中的坐标,而不是屏幕的坐标,或者有好方法可以二者换算也可以)

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

相关推荐

    安卓实现achartengine+动态饼图+动态柱形图

    否则那些数据都会被加载,最后重新绘制饼图,构建动态饼图的步骤主要分为以下四步,还需要在项目中引入AChartEngine依赖jar包,在Manifest中添加&lt;activityandroid:name="org.achartengine.GraphicalActivity" /&gt;

    Achartengine

    4. 添加数据:将数据源映射到图表上,可以是静态数据,也可以是动态加载的数据。 5. 渲染和显示:将创建好的图表渲染成位图并显示在界面上,或使用View直接添加到布局中。 6. 处理用户交互:如需要,可以添加监听器...

    安卓实现AChartEngine+动态饼图+柱形图

    官方的API并没有提供可以借鉴的动态更新饼图的方法,考虑到数据都是活动的,不可能总是用静态数据,所以我下面的demo就是模拟动态数据用饼图显示,但是肯定可以使用的,具体是通过定时器+Handler实现定时任务,通过...

    achartengine

    - 当处理大量数据时,考虑使用动态数据加载,以提高性能。 - 优化图表的尺寸和比例,确保在不同屏幕尺寸和分辨率的设备上看起来良好。 - 为用户提供解释图表的能力,例如添加图例和数据点的提示。 总结,...

    android 绘制折线图(AChartEngine)Linechart 动态更新横轴为获取的当前时间

    可以使用`AsyncTask`或者`Retrofit`等网络库来异步加载数据,并在回调中更新图表。数据结构可以是包含时间戳和对应值的列表。 动态更新的关键在于调用`ChartView`的`refresh()`方法。每次数据刷新后,我们需要更新`...

    achartengine1.2.0类库源文件

    针对大数据集,AChartEngine支持动态加载和缓存策略,以提高图表渲染效率,避免内存泄漏和卡顿现象。 9. **标签应用**: 在描述中提到的"曲线图"是AChartEngine支持的一种图表类型,开发者可以使用`...

    AchartEngine1.0.0

    例如,示例代码可以展示如何创建图表、加载数据、设置图表样式等,而文档则会详细解释各个API的作用和使用方法。 为了更好地利用AchartEngine,开发者需要了解一些Android编程的基础知识,如布局管理、数据绑定和...

    AChartEngine

    1. 考虑性能:在处理大量数据时,注意优化数据加载和绘制过程,避免影响应用的流畅性。 2. 自定义样式:为了使图表更具吸引力,可以深度定制图表的颜色、字体、背景等视觉元素。 3. 更新与维护:由于AChartEngine...

    Android画图之AChartEngine折线图

    本篇文章将深入探讨如何使用`AChartEngine`在Android应用中实现折线图的功能,并强调动态加载数据的实现。 首先,我们需要了解`AChartEngine`的基本用法。这个库提供了多种图表类型,如折线图、柱状图、饼图等。在`...

    achartengine上下滑动翻页

    如果图表数据过多,考虑分页加载,只在当前显示的图表范围内加载数据。同时,`AChartEngine`支持缓存图表图片,这可以避免每次滑动都重新绘制图表,提高滚动流畅性。 总之,AChartEngine结合`ViewPager`能够提供一...

    AChartEngine源码

    - **性能优化**:大量数据时,可以考虑使用缓存或异步加载策略,提高图表绘制效率。 - **交互性增强**:利用AChartEngine提供的触摸事件处理,实现图表的点击、拖动等交互功能。 总结来说,AChartEngine通过其清晰...

    achartengine.jar包h

    AChartEngine支持动态更新图表数据。当数据源发生变化时,可以通过`ChartView`的`refreshChart()`方法刷新图表,以反映最新的数据。 ### 5. 导出图表 除了在应用内显示,AChartEngine还可以将图表导出为图片文件,...

    AchartEngine整体项目

    本项目是围绕AchartEngine进行的,主要目标是实现动态绘图,让数据变化实时反映在图表上,为用户提供直观的数据洞察。 在这个项目中,`.classpath`文件是Eclipse(一个流行的Android开发IDE)的配置文件,它包含了...

    achartengine开发的关于时间的折线图

    在实际项目中,你可能还需要处理其他细节,如时间格式化、数据加载策略以及交互式功能的添加。`TestChart`这个文件可能是示例代码或者测试用例,进一步探索这个文件可以加深对`ACHartEngine`的理解和应用。 总的来...

    android折线图(AChartEngine和ichartjs)

    总的来说,无论选择AChartEngine还是iChartJS,理解数据结构、掌握库的API以及合理设计图表样式都是成功实现折线图的关键。通过不断实践和优化,你可以在Android应用中创建出专业且引人入胜的数据展示。

    Android AChartEngine1.0 源码

    1. 性能优化:在处理大量数据时,考虑使用缓存策略减少计算量,或者采用异步加载数据的方式,避免 UI 延迟。 2. 动态更新:实时更新数据时,使用 `ChartView.repaint()` 方法刷新图表。 3. 自定义渲染:通过继承...

    achartengine_jar包.zip

    在实际应用中,AchartEngine还可以与其他组件结合使用,例如与SQLite数据库配合,动态加载和更新图表数据。同时,它还支持导出图表为图片,方便用户分享或保存。 总之,AchartEngine是Android开发中一个非常实用的...

    achartengine源文件

    7. **动态更新**:如果你的数据是动态变化的,AChartEngine支持实时更新图表,无需重新创建整个图表。 8. **多图表组合**:在一个布局中,你可以同时显示多个不同类型的图表,以便对比和分析数据。 9. **图表动画*...

    achartengineDemo

    **AChartEngine库详解及其在...在这个"achartengineDemo"实例中,折线图的实现展示了AChartEngine在数据可视化方面的灵活性和实用性。无论是在商业应用还是科研项目中,它都能有效地帮助我们更好地理解和传达数据信息。

    AChartEngine框架

    AChartEngine允许动态更新数据,实现图表的实时变化。 3. **设置图表属性**:包括颜色、字体、背景、轴标签、图例等。AChartEngine提供了丰富的定制选项,使得图表的外观可以按照应用的设计风格进行调整。 4. **...

Global site tag (gtag.js) - Google Analytics