Android第三方acharrtengine绘制折线图

public class ChartView {
	/**
	 * 绘制图表方法
	 * 
	 * @param context
	 *            上下文对象
	 * @param chartPagerBean
	 *            图表容器
	 * @param layout
	 *            展示图表的Layout
	 * @param xAxisMax
	 *            最大X轴的值
	 */
	public void draw(Context context, ChartPagerBean chartPagerBean,
			LinearLayout layout, int xAxisMax) {

		// 曲线图表信息对象,最多存储两个曲线图的信息
		ChartPagerBean mChartPagerBean = chartPagerBean;
		// 图表数据集合
		XYMultipleSeriesDataset mDataset;
		// 图表数据渲染器
		XYMultipleSeriesRenderer mRenderer;
		// 图表view
		GraphicalView mChartView;
		// 创建图表数据集合
		mDataset = new XYMultipleSeriesDataset();
		mRenderer = setRenderer();

		int yAxisMin = mChartPagerBean.majorMin;// Y轴的最小值
		int yAxisMax = mChartPagerBean.majorMax;// Y轴的最大值

		// 创建一个数据子集
		XYSeries seriesMajor = new XYSeries(mChartPagerBean.majorName);
		int i = 1;
		// 将数据添加到数据子集中,并动态修改最大值和最小值
		for (int value : mChartPagerBean.majorValueList) {
			seriesMajor.add(i, value);
			if (value < yAxisMin) {
				yAxisMin = value;
			}
			if (value > yAxisMax) {
				yAxisMax = value;
			}
			i++;
		}
		// 将数据子集添加到图表数据集合中
		mDataset.addSeries(seriesMajor);
		ColoursXYSeriesRenderer rendererMajor = setMajorSeriesRenderer(mChartPagerBean);
		// 将曲线渲染对象添加到图表渲染器中
		mRenderer.addSeriesRenderer(rendererMajor);

		// 如果图表中存在两条曲线,则再分别创建一个数据子集和一个曲线渲染对象
		if (mChartPagerBean.isHasSlave) {
			// 创建一个数据子集
			XYSeries seriesSlave = new XYSeries(mChartPagerBean.slaveName);
			i = 1;
			// 将数据添加到数据子集中,并动态修改最大值和最小值
			for (int value : mChartPagerBean.slaveValueList) {
				value = mChartPagerBean.slaveValueList.get(i - 1);
				seriesSlave.add(i, value);
				if (value < yAxisMin) {
					yAxisMin = value;
				}
				if (value > yAxisMax) {
					yAxisMax = value;
				}
				i++;
			}
			// 将数据子集添加到图表数据集合中
			mDataset.addSeries(seriesSlave);
			// ColoursXYSeriesRenderer是在Achartengine开源的项目中自定义的类
			ColoursXYSeriesRenderer rendererSlave = setSlaveSeriesRenderer(mChartPagerBean);
			// 将曲线渲染对象添加到图表渲染器中
			mRenderer.addSeriesRenderer(rendererSlave);
		}

		setMaxMinVallue(xAxisMax, mRenderer, yAxisMin, yAxisMax);

		layout.removeAllViews();
		mChartView = setView(context, mDataset, mRenderer);
		// 将图表view添加图表容器中
		layout.addView(mChartView, new LayoutParams(LayoutParams.MATCH_PARENT,
				LayoutParams.MATCH_PARENT));
		// 图表重绘
		mChartView.repaint();

	}

	/**
	 * 设置图表XY轴的最大值和最小值
	 * 
	 * @param xAxisMax
	 *            X轴最大值
	 * @param mRenderer
	 *            渲染器
	 * @param yAxisMin
	 *            Y轴最小值
	 * @param yAxisMax
	 *            Y轴最大值
	 */
	private void setMaxMinVallue(int xAxisMax,
			XYMultipleSeriesRenderer mRenderer, int yAxisMin, int yAxisMax) {
		mRenderer.setYAxisMin(yAxisMin);
		mRenderer.setYAxisMax(yAxisMax);
		mRenderer.setXAxisMin(1);
		mRenderer.setXAxisMax(xAxisMax + 1);
	}

	/**
	 * 创建图表View
	 * 
	 * @param context
	 *            上下文对象
	 * @param mDataset
	 *            数据集
	 * @param mRenderer
	 *            渲染器
	 * @return 图表视图
	 */
	private GraphicalView setView(Context context,
			XYMultipleSeriesDataset mDataset, XYMultipleSeriesRenderer mRenderer) {
		GraphicalView mChartView;
		mChartView = ChartFactory
				.getLineChartView(context, mDataset, mRenderer);
		mRenderer.setApplyBackgroundColor(true);// 开启背景颜色
		mRenderer.setBackgroundColor(Color.TRANSPARENT);// 设置背景透明
		mRenderer.setMarginsColor(Color.TRANSPARENT);// 设置边缘透明
		mRenderer.setSelectableBuffer(10);
		return mChartView;
	}

	/**
	 * 创建次曲线渲染对象
	 * 
	 * @param mChartPagerBean
	 *            图表容器
	 * @return 曲线渲染对象
	 */
	private ColoursXYSeriesRenderer setSlaveSeriesRenderer(
			ChartPagerBean mChartPagerBean) {
		ColoursXYSeriesRenderer rendererSlave = new ColoursXYSeriesRenderer();
		rendererSlave.setPointStyle(PointStyle.CIRCLE);// 设置为曲线图
		rendererSlave.setFillPoints(true);// 数据点被填充
		rendererSlave.setDisplayChartValues(true);// 在图表中显示点的值
		rendererSlave.setDisplayChartValuesDistance(1);// 在X轴上,设置两点之间的距离
		rendererSlave.setColor(Color.YELLOW);// 设置点的颜色
		rendererSlave.setChartValuesTextSize(25);// 设置点值文本的尺寸大小
		rendererSlave.setChartValuesSpacing(15f);// 实时数据文本到中心点的间距
		rendererSlave.setUseColor(true);// 设置当前为双色曲线图
		rendererSlave.setWarningMinValue(mChartPagerBean.slaveWarningMin);// 设置告警最小值
		rendererSlave.setWarningMaxValue(mChartPagerBean.slaveWarningMax);// 设置告警最大值
		return rendererSlave;
	}

	/**
	 * 创建主曲线渲染对象
	 * 
	 * @param mChartPagerBean
	 *            图表容器
	 * @return 曲线渲染对象
	 */
	private ColoursXYSeriesRenderer setMajorSeriesRenderer(
			ChartPagerBean mChartPagerBean) {
		ColoursXYSeriesRenderer rendererMajor = new ColoursXYSeriesRenderer();
		rendererMajor.setPointStyle(PointStyle.CIRCLE);// 设置为曲线图
		rendererMajor.setFillPoints(true);// 数据点被填充
		rendererMajor.setDisplayChartValues(true);// 在图表中显示点的值
		rendererMajor.setDisplayChartValuesDistance(1);// 在X轴上,设置两点之间的距离
		rendererMajor.setColor(Color.BLUE);// 设置点的颜色
		rendererMajor.setChartValuesTextSize(25);// 设置点值文本的尺寸大小
		rendererMajor.setChartValuesSpacing(15f);// 实时数据文本到中心点的间距
		rendererMajor.setUseColor(true);// 设置当前为双色曲线图
		rendererMajor.setPointColor(Color.GREEN);// 设置点的颜色
		rendererMajor.setChartValueTextColor(Color.WHITE);// 设置数值文本的颜色
		rendererMajor.setWarningMinValue(mChartPagerBean.majorWarningMin);// 设置告警最小值
		rendererMajor.setWarningMaxValue(mChartPagerBean.majorWarningMax);// 设置告警最大值
		return rendererMajor;
	}

	/**
	 * 创建图表数据渲染器
	 * 
	 * @return 图表数据渲染器
	 */
	private XYMultipleSeriesRenderer setRenderer() {
		XYMultipleSeriesRenderer mRenderer;
		mRenderer = new XYMultipleSeriesRenderer();

		mRenderer.setApplyBackgroundColor(true);// 开启背景颜色
		mRenderer.setAxisTitleTextSize(25);// 设置坐标文字尺寸大小
		mRenderer.setAxesColor(Color.BLACK);// /设置坐标文字颜色
		mRenderer.setChartTitleTextSize(20);// 设置图表标题文字尺寸大小
		mRenderer.setLabelsTextSize(18);// 设置刻度显示文字的大小(XY轴都会被设置)
		mRenderer.setLabelsColor(Color.BLACK);// 设置XY轴线的颜色
		mRenderer.setLegendTextSize(25);// 图例文字大小
		mRenderer.setMargins(new int[] { 0, 20, 0, 20 });// 设置图表的外边框(上/左/下/右)
		mRenderer.setZoomButtonsVisible(true);// 是否显示放大缩小按钮
		mRenderer.setPointSize(10);// 设置点的大小(图上显示的点的大小和图例中点的大小都会被设置)

		mRenderer.setXLabelsColor(Color.WHITE);// 设置X轴标签文本的颜色
		mRenderer.setYLabelsColor(0, Color.WHITE);// 设置Y轴标签文本的颜色
		return mRenderer;
	}
}

/**
 * 曲线图表信息类,存储曲线图的信息
 * 
 *
 */
public class ChartPagerBean {
	
	public ChartPagerBean(String majorName) {
		this.majorName = majorName;
	}
	// 主曲线图的名称
	public String majorName = "";
	// 主曲线图的点集合
	public LinkedList<Integer> majorValueList = new LinkedList<Integer>();
	// 主曲线图y轴最小值
	public int majorMin = 0;
	// 主曲线图y轴最大值
	public int majorMax = 0;
	// 告警最小值
	public int majorWarningMin = 0;
	// 告警最大值
	public int majorWarningMax = 0;

	// 是否存在次曲线图
	public boolean isHasSlave = false;
	// 次曲线图的名称
	public String slaveName = "";
	// 次曲线图的点集合
	public LinkedList<Integer> slaveValueList = new LinkedList<Integer>();
	// 次曲线图y轴最小值
	public int slaveMin = 0;
	// 次曲线图y轴最大值
	public int slaveMax = 0;
	// 告警最小值
	public int slaveWarningMin = 0;
	// 告警最大值
	public int slaveWarningMax = 0;
}

/**
 * App运行控制主类
 * 
 *
 */
public class MainActivity extends Activity {
	private ChartView mChartView;
	private ChartPagerBean mBean;
	private LinkedList<Integer> mList;
	private Random mRandom = new Random();
	private Handler mHandler = new Handler();
	private Runnable mRunnable;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		getWindow();
		requestWindowFeature(Window.FEATURE_NO_TITLE);

		setContentView(R.layout.activity_main);
		initData();
		mChartView = new ChartView();
		setRunnable();
		mHandler.postDelayed(mRunnable, 50);
	}

	/**
	 * 设置Runnable对象
	 * 
	 */
	private void setRunnable() {
		mRunnable = new Runnable() {

			@Override
			public void run() {
				if (mList.size() <= 8) {
					mList.add(mRandom.nextInt(6) * 100);
					mChartView.draw(MainActivity.this, mBean,
							(LinearLayout) findViewById(R.id.chart_show), 6);
					mHandler.postDelayed(mRunnable, 1500);
				} else {
					mList.poll();
					mList.add(mRandom.nextInt(6) * 100);
					mChartView.draw(MainActivity.this, mBean,
							(LinearLayout) findViewById(R.id.chart_show), 6);
					mHandler.postDelayed(mRunnable, 1500);
				}
			}
		};
	}

	/**
	 * 初始化mBean
	 * 
	 */
	private void initData() {
		mList = new LinkedList<Integer>();
		mBean = new ChartPagerBean(getString(R.string.temp));
		mBean.isHasSlave = false;
		mBean.majorMax = 800;
		mBean.majorMin = 50;
		mBean.majorWarningMax = 500;
		mBean.majorWarningMin = 100;
		mBean.majorValueList = mList;
	}
}

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值