1. 程式人生 > >使用andbase開發框架實現繪製折線圖

使用andbase開發框架實現繪製折線圖



在Android中,當有繪製折線圖的需求時,大多數人使用的AChartEngine,來進行折線圖的繪製。AChartEngine圖表引擎確實可以實現折線圖的功能,除此之外,我們還可以使用andbase開發框架裡面的圖表模組,實現圖示的繪製。前面文章介紹了使用andbase開發框架實現側滑欄效果,今天,我們學習如何實現折線的繪製。

首先,我們還是看一下效果圖


我們模擬的是一家公司12個月中,兩項不同業務的銷售額變化,可以看到,效果還是非常不錯的。

下面,我們開始介紹如何使用andbase實現這個效果。

首先,我們看一下專案結構,非常簡單的結構


就一個xml,一個activity,再加上andbase框架。下面,我們先看一下佈局檔案

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/chart"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

</LinearLayout>

也是非常簡單,只有一個線性佈局檔案。

最主要的東西都在Activity中,下面給出程式碼以及註釋

/**
 * 
 * @ClassName: MainActivity
 * @Description: andbase框架實現表格的繪製
 * @author: ZhaoKaiQiang
 * @time: 2014-7-17下午3:21:11
 * @version: V1.0
 */
public class MainActivity extends Activity {

	private LinearLayout linearLayout;
	// 折線說明文字
	private String[] titles = new String[] { "業務一", "業務二" };
	// 資料
	private List<double[]> values;
	// 每個資料點的顏色
	private List<int[]> colors;
	// 每個資料點的簡要 說明
	private List<String[]> explains;
	// 折線的線條顏色
	private int[] mSeriescolors;
	// 渲染器
	private XYMultipleSeriesRenderer renderer;

	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		linearLayout = (LinearLayout) findViewById(R.id.chart);
		initValues();
		drawChart();
	}

	/**
	 * 初始化資料
	 */
	private void initValues() {
		values = new ArrayList<double[]>();
		colors = new ArrayList<int[]>();
		explains = new ArrayList<String[]>();

		values.add(new double[] { 500, 450, 700, 710, 420, 430, 400, 390, 290,
				400, 340, 500 });
		values.add(new double[] { 523, 450, 320, 370, 480, 570, 420, 350, 400,
				450, 700, 710 });

		colors.add(new int[] { Color.RED, Color.RED, Color.RED, Color.RED,
				Color.RED, Color.RED, Color.RED, Color.RED, Color.RED,
				Color.RED, Color.RED, Color.RED });
		colors.add(new int[] { Color.BLUE, Color.BLUE, Color.BLUE, Color.BLUE,
				Color.GREEN, Color.BLUE, Color.BLUE, Color.BLUE, Color.BLUE,
				Color.BLUE, Color.BLUE, Color.BLUE });

		explains.add(new String[] { "1月業績", "2月業績", "3月業績", "4月業績", "5月業績",
				"6月業績", "7月業績", "8月業績", "9月業績", "10月業績", "11月業績", "12月業績" });
		explains.add(new String[] { "1月業績", "2月業績", "3月業績", "4月業績", "5月業績",
				"6月業績", "7月業績", "8月業績", "9月業績", "10月業績", "11月業績", "12月業績" });

		mSeriescolors = new int[] { Color.rgb(153, 204, 0),
				Color.rgb(247, 185, 64) };
	}

	/**
	 * 開始繪折線圖
	 */
	private void drawChart() {
		renderer = new XYMultipleSeriesRenderer();
		int length = mSeriescolors.length;
		for (int i = 0; i < length; i++) {
			// 建立SimpleSeriesRenderer單一渲染器
			XYSeriesRenderer r = new XYSeriesRenderer();
			// 設定渲染器顏色
			r.setColor(mSeriescolors[i]);
			r.setFillPoints(true);
			r.setPointStyle(PointStyle.SQUARE);
			r.setLineWidth(1);
			r.setChartValuesTextSize(16);
			renderer.addSeriesRenderer(r);
		}
		// 座標軸標題文字大小
		renderer.setAxisTitleTextSize(16);
		// 圖形標題文字大小
		renderer.setChartTitleTextSize(25);
		// 軸線上標籤文字大小
		renderer.setLabelsTextSize(15);
		// 說明文字大小
		renderer.setLegendTextSize(15);
		// 圖表標題
		renderer.setChartTitle("公司2014年銷售業績折線圖");
		// X軸標題
		renderer.setXTitle("時間/月");
		// Y軸標題
		renderer.setYTitle("銷售額/萬元");
		// X軸最小座標點
		renderer.setXAxisMin(0);
		// X軸最大座標點
		renderer.setXAxisMax(12);
		// Y軸最小座標點
		renderer.setYAxisMin(0);
		// Y軸最大座標點
		renderer.setYAxisMax(800);
		// 座標軸顏色
		renderer.setAxesColor(Color.rgb(51, 181, 229));
		renderer.setXLabelsColor(Color.rgb(51, 181, 229));
		renderer.setYLabelsColor(0, Color.rgb(51, 181, 229));
		// 設定圖表上標題與X軸與Y軸的說明文字顏色
		renderer.setLabelsColor(Color.GRAY);
		// 設定字型加粗
		renderer.setTextTypeface("sans_serif", Typeface.BOLD);
		// 設定在圖表上是否顯示值標籤
		renderer.getSeriesRendererAt(0).setDisplayChartValues(true);
		renderer.getSeriesRendererAt(1).setDisplayChartValues(true);
		// 顯示螢幕可見取區的XY分割數
		renderer.setXLabels(12);
		renderer.setYLabels(8);
		// X刻度標籤相對X軸位置
		renderer.setXLabelsAlign(Align.CENTER);
		// Y刻度標籤相對Y軸位置
		renderer.setYLabelsAlign(Align.LEFT);
		renderer.setPanEnabled(true, true);
		renderer.setZoomEnabled(true);
		renderer.setZoomButtonsVisible(true);
		renderer.setZoomRate(1.1f);
		renderer.setBarSpacing(0.5f);

		// 標尺開啟
		renderer.setScaleLineEnabled(true);
		// 設定標尺提示框高
		renderer.setScaleRectHeight(10);
		// 設定標尺提示框寬
		renderer.setScaleRectWidth(150);
		// 設定標尺提示框背景色
		renderer.setScaleRectColor(Color.argb(150, 52, 182, 232));
		renderer.setScaleLineColor(Color.argb(175, 150, 150, 150));
		renderer.setScaleCircleRadius(35);
		// 第一行文字的大小
		renderer.setExplainTextSize1(20);
		// 第二行文字的大小
		renderer.setExplainTextSize2(20);

		// 臨界線
		double[] limit = new double[] { 15000, 12000, 4000, 9000 };
		renderer.setmYLimitsLine(limit);
		int[] colorsLimit = new int[] { Color.rgb(100, 255, 255),
				Color.rgb(100, 255, 255), Color.rgb(0, 255, 255),
				Color.rgb(0, 255, 255) };
		renderer.setmYLimitsLineColor(colorsLimit);

		// 顯示錶格線
		renderer.setShowGrid(true);
		// 如果值是0是否要顯示
		renderer.setDisplayValue0(true);
		// 建立渲染器資料填充器
		XYMultipleSeriesDataset mXYMultipleSeriesDataset = new XYMultipleSeriesDataset();
		for (int i = 0; i < length; i++) {
			CategorySeries series = new CategorySeries(titles[i]);
			double[] v = values.get(i);
			int[] c = colors.get(i);
			String[] e = explains.get(i);
			int seriesLength = v.length;
			for (int k = 0; k < seriesLength; k++) {
				// 設定每個點的顏色
				series.add(v[k], c[k], e[k]);
			}
			mXYMultipleSeriesDataset.addSeries(series.toXYSeries());
		}
		// 背景
		renderer.setApplyBackgroundColor(true);
		renderer.setBackgroundColor(Color.rgb(222, 222, 200));
		renderer.setMarginsColor(Color.rgb(222, 222, 200));

		// 線圖
		View chart = ChartFactory.getLineChartView(this,
				mXYMultipleSeriesDataset, renderer);
		linearLayout.addView(chart);
	}

}

註釋很清楚,就不過多介紹啦。