MPChartAndroid使用讲解

<span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);">    最的项目里又要加更加复杂的图表了,实在是不想在去自己实现了,就想找个第三方的开源图表库去实现,以前自己封装过achartenginee这个apache的图表引擎,但看到这个MPChartAndroid后,觉得 achartengine简直是弱爆了。下面就先对比一下MPChartEnginee的优势,及其使用。</span>

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<LineDataSet> sets = (ArrayList<LineDataSet>) 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<LineDataSet> sets = (ArrayList<LineDataSet>) 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<LineDataSet> sets = (ArrayList<LineDataSet>) 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<String> xVals = new ArrayList<String>();
		ArrayList<Entry> yVals = new ArrayList<Entry>();
		for (int i = 0; i < count; i++)
		{
			xVals.add((i % 30) + "/" + (i % 12) + "/14");
			yVals.add(new Entry((float) (Math.random() * 4), i));
		}

		// create a dataset and give it a type
		LineDataSet set1 = new LineDataSet(yVals, "DataSet 1");
		set1.setLineWidth(1.5f);
		set1.setCircleSize(4f);
		set1.setCircleColor(Color.parseColor("#fd4634"));
		// create a data object with the datasets
		LineData data = new LineData(xVals, set1);
		// set data
		mChart.setData(data);
	}
}

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

时间: 2024-08-10 21:13:12

MPChartAndroid使用讲解的相关文章

拓扑排序讲解

在这里我们要说的拓扑排序是有前提的 我们在这里说的拓扑排序是基于有向无环图的!!!. (⊙o⊙)…我所说的有向无环图都知道是什么东西吧.. 如果不知道,我们下面先来来说说什么是有向无环图. 所谓有向无环图,顾名思义是不存在环的有向图(至于有向图是什么不知道的在前面我们有一个图论讲解上都有). 点的入度:以这个点为结束点的边数. 点的出度:以这个点为出发点的边的条数. 拓扑序就是对于一个节点的一个排列,使得(u,v)属于E,那么u一定出现在v的前面.然而拓扑排序就是一个用来求拓扑序的东西. 对于左

形象易懂讲解算法I——小波变换

https://zhuanlan.zhihu.com/p/22450818?refer=dong5 最早发于回答:能不能通俗的讲解下傅立叶分析和小波分析之间的关系? - 咚懂咚懂咚的回答现收入专栏. 从傅里叶变换到小波变换,并不是一个完全抽象的东西,可以讲得很形象.小波变换有着明确的物理意义,如果我们从它的提出时所面对的问题看起,可以整理出非常清晰的思路. 下面我就按照傅里叶-->短时傅里叶变换-->小波变换的顺序,讲一下为什么会出现小波这个东西.小波究竟是怎样的思路.(反正题主要求的是通俗形

vim编辑器讲解

--vim编辑器讲解(vim(vi的升级版),推荐vim) 打开文件(如果该文件不存在,则创建之后,保存,从内存写到硬盘上,不保存,则删除掉该文件) vim filename vim编辑器有3中模式:命令模式,插入模式,尾行模式. 命令模式:刚进入文件的时候开始的状态.u为撤销键 命令模式进入插入模式:可以通过快捷键 i(当前光标位置插入) I(本行的开头) a(当前光标位置之后) A(当前光标所在最后) o O 插入模式返回命令模式:ESC 插入模式:主要用来编辑文本的. 尾行模式:主要用来,

Smarty 函数讲解

这里给大家总结了几种Smarty 函数并分别详细讲解了.如果你正在学习Smarty  ,希望这篇文章对你有用. html_checkboxes 自定义函数 html_checkboxes 根据给定的数据创建复选按钮组. 该函数可以指定哪些元素被选定. 要么必须指定 values 和 ouput 属性,要么指定 options 替代. 所有的输出与 XHTML 兼容 html_checkbox用来用给定的数据创建checkbox.name表示checkbox的名称,values表示checkbox

ThinkPHP讲解(一)框架基础

ThinkPHP框架知识点过于杂乱,接下来将以问题的形势讲解tp(ThinkPHP的简写) 1.tp框架是什么,为什么使用是它? 一堆代码的集合,里边有变量.函数.类.常量,里边也有许多设计模式MVC.AR数据库.单例等等.框架可以节省我们50-60%的工作量,我们全部精力都集中在业务层次. 为什么使用框架 框架可以帮组我们快速.稳定.高效搭建程序系统 该系统由于框架的使用使得本身的维护性.灵活性.适应客户需求方面得到最大化的增强. 使用框架的过程中可以使得我们的注意力全部集中业务层面,而无需关

nfs 深度讲解及inotify

目  录 第1章共享目录的挂载及参数mount1 1.1挂载nfs下共享的data目录... 1 1.2 查看挂载的目录... 2 1.3 mount 挂载的参数... 2 1.3.1 mount –o 参数对用的选项... 3 1.3.2 man mount后的-o参数中英文翻译对比... 3 1.4 Mount挂载性能优化参数选项... 4 第2章 NFS深度讲解... 5 2.1 NFS内核优化建议... 5 2.2 服务端nfs内核优化... 5 2.3 企业生产场景NFS共享存储优化小

React Native控件之PullToRefreshViewAndroid下拉刷新组件讲解

转载请标明出处: http://blog.csdn.net/developer_jiangqq/article/details/50664323 本文出自:[江清清的博客] (一)前言 今天我们一起来看一下PullToRefreshViewAndroid下拉刷新组件讲解以及使用实例 刚创建的React Native技术交流群(282693535),欢迎各位大牛,React Native技术爱好者加入交流!同时博客左侧欢迎微信扫描关注订阅号,移动技术干货,精彩文章技术推送! 该PullToRefr

[转载]oracle游标概念讲解

原文URL:http://www.2cto.com/database/201203/122387.html ORACLE游标概念讲解 什么是游标?  ①从表中检索出结果集,从中每次指向一条记录进行交互的机制.      ②关系数据库中的操作是在完整的行集合上执行的.   由SELECT 语句返回的行集合包括满足该语句的WHERE 子句所列条件的所有行.由该语句返回完整的行集合叫做结果集.      应用程序,尤其是互动和在线应用程序,把完整的结果集作为一个单元处理并不总是有效的.      这些

zerglurker的C语言教程004——指针初步讲解

在上次的教程里面,我提到了指针. 针对指针,这次我将简单的讲讲,后面我还会讲到--那个时候你应该有了相当的基础. 首先,先讲讲指针类型. 任何类型关键字后面加一个*符号,就会变成指针类型. 比如: char → char* 字符指针 int → int* 整数指针 double→double* 双精度指针 甚至还可以这样: char*→char** 字符指针的指针类型 →char*** 字符指针的指针的指针类型- 指针本质上是一个内存地址值,该内存地址上存放的是相关类型的数值.但是void*指针