热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

MPChartAndroid使用讲解

最的项目里又要加更加复杂的图表了,实在是不想在去自己实现了,就想找个第三方的开源图表库去实现,以前自己封装过achartenginee这个apache的图表引擎,但看到这个MPCh

    最的项目里又要加更加复杂的图表了,实在是不想在去自己实现了,就想找个第三方的开源图表库去实现,以前自己封装过achartenginee这个apache的图表引擎,但看到这个MPChartAndroid后,觉得 achartengine简直是弱爆了。下面就先对比一下MPChartEnginee的优势,及其使用。

  MPChartEnginee的优点:1.更加美观的外表,从官方给的各自的两个Demo就可以看出,MPChartAndroid绘出来的图表更加的柔和,美观。

                                            2.更加完美的事件冲突处理,用过achartenginee的都知道,achartenginee在事件冲突的处理上真的不是十分完美,achartenginee做出来的图表放到                                                ScrollView中,会导致ScrollView滑动不灵敏,而MPChartEnginee则不存在此问题,官方给出的demo就有在ListView中的图表,有在ScrollView                                                   中的图表,可以说对事件的处理可以算是完美。

                                            3.更加强大的可定制性,在学习和使用achartenginee时,发现图表有很多属性是没有提供set方法去设置的,导致很多情况下,做出来的图表不符合                                                实际需求,样式特别的难看,而MPChartEnginee则几乎对所有可见的属性都提供了set方法,可以轻松的定制图表外观,这也是我转而使用这个框                                                架的主要原因。

                                            4.强大的动画特效,可以为我们的 App增色不少。(存在一点点bug,不是必现的)。


  基于以上几点,我们以后可以放弃achartenginee等图表框架,而全部使用MpChartEnginee了。下面就我对框架源码的理解,首先讲解一下源码的组成结构。看下源码结构      图:

  技术分享

  源码结构中,我们只要重点关注chart包,components包,data,listener包和animation包即可。其中,chart包中定义了所有可以绘制的图表种类,主要用来绘制图表的整体属性,定义事件处理等,data包中定义了不同图表所需要的不同数据类型,components包中定义了所有chart相关的组件定义,listener中则定义了与用户的事件交互处理。

   官方Demo讲解:   

package com.xxmassdeveloper.mpchartexample;

public class LineChartActivity1 extends DemoBase
{
	private LineChart mChart;

	@Override
	protected void onCreate(Bundle savedInstanceState)
	{
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_linechart);

		mChart = (LineChart) findViewById(R.id.chart1);
		mChart.setDescription("");    //设置图表描述信息
		mChart.setScaleEnabled(false); //设置图表是否可缩放
		mChart.setBackgroundColor(Color.WHITE); //设置图表背景颜色
		mChart.setDrawGridBackground(false);  //设置是否显示表格

		XAxis xAxis = mChart.getXAxis();     //得到图表的X轴实例
		xAxis.setPosition(XAxisPosition.BOTTOM);//设置X轴的显示位置
		xAxis.setDrawGridLines(false);  //设置是否显示X轴表格
		xAxis.setAvoidFirstLastClipping(true); //设置x轴起点和终点label不超出屏幕
		xAxis.setDrawAxisLine(true);           //设置显示x轴
		xAxis.setSpaceBetweenLabels(0); // 设置x轴label不间隔

		YAxis leftAxis = mChart.getAxisLeft();  //得到图表的左侧Y轴实例
		leftAxis.setAxisMaxValue(3.4482f); // 设置Y轴最大值
		leftAxis.setAxisMinValue(3.1872f);// 设置Y轴最小值。
		leftAxis.setStartAtZero(false);   //设置图表起点从0开始
		leftAxis.enableGridDashedLine(10f, 10f, 0f); //设置横向表格为虚线
                 
		// limit lines are drawn behind data (and not on top)
		leftAxis.setDrawLimitLinesBehindData(true);

		mChart.getAxisRight().setEnabled(false); //设置右侧Y轴不可用(这里可以向得到左侧Y轴那样,得到右侧Y轴实例去处理)
                // YAxis rightAxis = mChart.getAxisRight();
                // rightAxis.setTextSize();
                // rightAxis.setTextColor();等一系列的设置
                // add data
		setData(7, 3);

		// mChart.setVisibleXRange(5, AxisDependency.LEFT);
		// mChart.setVisibleYRangeMaximum(5f, AxisDependency.LEFT);
		// dont forget to refresh the drawing
		mChart.invalidate();
	}

	@Override
	public boolean onCreateOptionsMenu(Menu menu)
	{
		getMenuInflater().inflate(R.menu.line, menu);
		return true;
	}

	@Override
	public boolean onOptionsItemSelected(MenuItem item)
	{

		switch (item.getItemId())
		{
		case R.id.actionToggleValues:
		{
			for (DataSet set : mChart.getData().getDataSets())
				set.setDrawValues(!set.isDrawValuesEnabled());

			mChart.invalidate();
			break;
		}
		case R.id.actionToggleHighlight:
		{
			if (mChart.isHighlightEnabled())
				mChart.setHighlightEnabled(false);
			else mChart.setHighlightEnabled(true);
			mChart.invalidate();
			break;
		}
		case R.id.actionToggleFilled:
		{

			ArrayList sets = (ArrayList) mChart.getData().getDataSets();

			for (LineDataSet set : sets)
			{
				if (set.isDrawFilledEnabled())
					set.setDrawFilled(false);
				else set.setDrawFilled(true);
			}
			mChart.invalidate();
			break;
		}
		case R.id.actionToggleCircles:
		{
			ArrayList sets = (ArrayList) mChart.getData().getDataSets();

			for (LineDataSet set : sets)
			{
				if (set.isDrawCirclesEnabled())
					set.setDrawCircles(false);
				else set.setDrawCircles(true);
			}
			mChart.invalidate();
			break;
		}
		case R.id.actionToggleCubic:
		{
			ArrayList sets = (ArrayList) mChart.getData().getDataSets();

			for (LineDataSet set : sets)
			{
				if (set.isDrawCubicEnabled())
					set.setDrawCubic(false);
				else set.setDrawCubic(true);
			}
			mChart.invalidate();
			break;
		}
		case R.id.actionToggleStartzero:
		{
			mChart.getAxisLeft().setStartAtZero(!mChart.getAxisLeft().isStartAtZeroEnabled());
			mChart.getAxisRight().setStartAtZero(!mChart.getAxisRight().isStartAtZeroEnabled());
			mChart.invalidate();
			break;
		}
		case R.id.actionTogglePinch:
		{
			if (mChart.isPinchZoomEnabled())
				mChart.setPinchZoom(false);
			else mChart.setPinchZoom(true);

			mChart.invalidate();
			break;
		}
		case R.id.actionToggleAutoScaleMinMax:
		{
			mChart.setAutoScaleMinMaxEnabled(!mChart.isAutoScaleMinMaxEnabled());
			mChart.notifyDataSetChanged();
			break;
		}
		case R.id.animateX:
		{
			mChart.animateX(3000);
			break;
		}
		case R.id.animateY:
		{
			mChart.animateY(3000, Easing.EasingOption.EaseInCubic);
			break;
		}
		case R.id.animateXY:
		{
			mChart.animateXY(3000, 3000);
			break;
		}
		case R.id.actionToggleFilter:
		{

			// the angle of filtering is 35°
			Approximator a = new Approximator(ApproximatorType.DOUGLAS_PEUCKER, 35);

			if (!mChart.isFilteringEnabled())
			{
				mChart.enableFiltering(a);
			}
			else
			{
				mChart.disableFiltering();
			}
			mChart.invalidate();

			//
			// for(int i = 0; i <10; i++) {
			// mChart.addEntry(new Entry((float) (Math.random() * 100),
			// i+2), 0);
			// mChart.invalidate();
			// }
			//
			// Toast.makeText(getApplicationContext(), "valcount: " +
			// mChart.getDataOriginal().getYValCount() + ", valsum: " +
			// mChart.getDataOriginal().getYValueSum(),
			// Toast.LENGTH_SHORT).show();
			//
			break;
		}
		case R.id.actionSave:
		{
			if (mChart.saveToPath("title" + System.currentTimeMillis(), ""))
			{
				Toast.makeText(getApplicationContext(), "Saving SUCCESSFUL!", Toast.LENGTH_SHORT).show();
			}
			else Toast.makeText(getApplicationContext(), "Saving FAILED!", Toast.LENGTH_SHORT).show();

			// mChart.saveToGallery("title"+System.currentTimeMillis())
			break;
		}
		}
		return true;
	}

	private void setData(int count, float range)
	{
		ArrayList xVals = new ArrayList();
		ArrayList yVals = new ArrayList();
		for (int i = 0; i 
   

版权声明:本文为博主原创文章,未经博主允许不得转载。

MPChartAndroid使用讲解


推荐阅读
  • A题简单判断#includeusingnamespacestd;typedeflonglongll;intt;intmain(){cint;whil ... [详细]
  • 深入理解FastDFS
    FastDFS是一款高效、简洁的分布式文件系统,广泛应用于互联网应用中,用于处理大量用户上传的文件,如图片、视频等。本文探讨了FastDFS的设计理念及其如何通过独特的架构设计提高性能和可靠性。 ... [详细]
  • 学习目的:1.了解android线程的使用2.了解主线程与子线程区别3.解析异步处理机制主线程与子线程:所谓主线程,在Windows窗体应用程序中一般指UI线程,这个是程序启动的时 ... [详细]
  • 本文基于https://major.io/2014/05/13/coreos-vs-project-atomic-a-review/的内容,对CoreOS和Atomic两个操作系统进行了详细的对比,涵盖部署、管理和安全性等多个方面。 ... [详细]
  • 本文探讨了在一个UIViewController中同时存在两个或更多tableView时,若它们的初始Y坐标相同,则可能出现布局异常的问题,并深入解析了automaticallyAdjustsScrollViewInsets属性的作用及其设置方法。 ... [详细]
  • 本文旨在介绍Three.js的基础概念及其应用场景。Three.js是一个基于WebGL的JavaScript库,用于在网页上创建和显示3D图形。文中将从Canvas的基本功能出发,探讨其局限性,并引出WebGL及Three.js的解决方案。 ... [详细]
  • 本文探讨了Tomcat在启动过程中遇到的‘严重: Null组件’警告,并提供了解决此问题的方法,特别是当Tomcat使用的JRE版本低于应用所需版本时的处理方案。 ... [详细]
  • 本文深入探讨了Java注解的基本概念及其在现代Java开发中的应用。文章不仅介绍了如何创建和使用自定义注解,还详细讲解了如何利用反射机制解析注解,以及Java内建注解的使用场景。 ... [详细]
  • 本文详细介绍了如何手动编写兼容IE的Ajax函数,以及探讨了跨域请求的实现方法和原理,包括JSONP和服务器端设置HTTP头部等技术。 ... [详细]
  • Redis 教程01 —— 如何安装 Redis
    本文介绍了 Redis,这是一个由 Salvatore Sanfilippo 开发的键值存储系统。Redis 是一款开源且高性能的数据库,支持多种数据结构存储,并提供了丰富的功能和特性。 ... [详细]
  • 题目概述:给定一个数组,计算其中所有连续子序列中平均值不低于给定值k的数量。通过将每个元素减去k并计算前缀和,问题转化为二维数点问题。此问题可以通过离线处理,利用树状数组来高效解决。 ... [详细]
  • 本文介绍了一种利用迭代法解决特定方程问题的方法,特别是当给定函数f(x)在区间[x1, x2]内连续且f(x1)0时,存在一个x~使得f(x~)=0。通过逐步细化搜索范围,可以高效地找到方程的根。 ... [详细]
  • 微信小程序配置详解:pages、window、tabBar与调试模式
    本文详细介绍了如何在微信小程序中配置pages、window、tabBar以及启用调试模式,帮助开发者更好地理解和应用这些配置选项。 ... [详细]
  • 本文通过具体示例探讨了在 C++ 中使用 extern "C" 的重要性及其作用,特别是如何影响编译后的对象文件中的符号名称。 ... [详细]
  • 本文详细介绍了如何在Arch Linux系统中安装和配置FlashTool,包括必要的依赖项安装和udev规则设置,以确保工具能够正确识别USB设备。 ... [详细]
author-avatar
mobiledu2502887833
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有