[Andriod] 透過AChartEngine實現BarChart

  • 16965
  • 0
  • 2013-05-08

AChartEngine主要透過ChartFactory.getBarChartView()決定Chart的類型, 主要傳入參數是Dataset及Renderer, 一個MultipleRenderer就是一個Chart, 可包含多個Renderer, Renderer的資料來源是Dataset, 可透過Series設定多個資料來源

STP1. 下載AChartEngine, 我使用的版本是achartengine-1.0.0.jar.zip, 複製至\libs下, 並匯入Eclipse, Project>Proerties>JavaBuildPath>Libraries>AddExternalJAR..>OK

 

STP2. res/layout/activity_main.xml, 加入一個LinearLayout以承接BarChart


<TableLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >

    <LinearLayout
        android:id="@+id/llBarChart"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical" >

    </LinearLayout>

</TableLayout>

 

STP3. src/../MainActivity.java

AChartEngine主要透過ChartFactory.getBarChartView()決定Chart的類型, 主要傳入參數是Dataset及Renderer, 一個MultipleRenderer就是一個Chart, 可包含多個Renderer, Renderer的資料來源是Dataset, 可透過Series設定多個資料來源


package com.example.achartenginebarchart;

import org.achartengine.ChartFactory;
import org.achartengine.chart.BarChart.Type;
import org.achartengine.model.XYMultipleSeriesDataset;
import org.achartengine.model.XYSeries;
import org.achartengine.renderer.XYMultipleSeriesRenderer;
import org.achartengine.renderer.XYSeriesRenderer;

import android.os.Bundle;
import android.app.Activity;
import android.graphics.Color;
import android.graphics.Paint.Align;
import android.graphics.Typeface;
import android.view.View;
import android.widget.LinearLayout;
import android.widget.LinearLayout.LayoutParams;

public class MainActivity extends Activity {
	
	private LinearLayout llBarChart;
	private View vChart;

	private String[][] Top10ErrCode={{"ADFU1","20"},{"MBPW2","19"},{"ABCDE","17"},{"BLFU1","16"},{"LCVD3","15"},{"ADDK1","11"},{"CMFU3","8"},{"LCCR2","7"},{"QBLE1","5"},{"SPNS1","2"}};
		
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		
		llBarChart = (LinearLayout) findViewById(R.id.llBarChart);
		
		try{			
			vChart = getBarChart("PQC Top 10 ErrCode", "ErrCode", "QTY", Top10ErrCode);
			llBarChart.removeAllViews();
			//llBarChart.addView(vChart);
			llBarChart.addView(vChart, new LayoutParams(LayoutParams.WRAP_CONTENT, 300));

		}catch(Exception e){
			
		}
	}
	
	private View getBarChart(String chartTitle, String XTitle, String YTitle, String[][] xy){
		
			XYSeries Series = new XYSeries(YTitle);

			XYMultipleSeriesDataset Dataset = new XYMultipleSeriesDataset();             
			Dataset.addSeries(Series);
		
			XYMultipleSeriesRenderer Renderer = new XYMultipleSeriesRenderer(); 
			XYSeriesRenderer yRenderer = new XYSeriesRenderer();        
			Renderer.addSeriesRenderer(yRenderer);
						
			//Renderer.setApplyBackgroundColor(true);			//設定背景顏色
			//Renderer.setBackgroundColor(Color.BLACK);			//設定圖內圍背景顏色
			Renderer.setMarginsColor(Color.WHITE);				//設定圖外圍背景顏色
			Renderer.setTextTypeface(null, Typeface.BOLD);		//設定文字style

			Renderer.setShowGrid(true);							//設定網格
			Renderer.setGridColor(Color.GRAY);					//設定網格顏色
			
			Renderer.setChartTitle(chartTitle);					//設定標頭文字
			Renderer.setLabelsColor(Color.BLACK);				//設定標頭文字顏色
			Renderer.setChartTitleTextSize(20);					//設定標頭文字大小
			Renderer.setAxesColor(Color.BLACK);					//設定雙軸顏色
			Renderer.setBarSpacing(0.5);						//設定bar間的距離
			
			//Renderer.setXTitle(XTitle);						//設定X軸文字      
			//Renderer.setYTitle(YTitle);						//設定Y軸文字 
			Renderer.setXLabelsColor(Color.BLACK);				//設定X軸文字顏色
			Renderer.setYLabelsColor(0, Color.BLACK);			//設定Y軸文字顏色
			Renderer.setXLabelsAlign(Align.CENTER);				//設定X軸文字置中
			Renderer.setYLabelsAlign(Align.CENTER);				//設定Y軸文字置中
			Renderer.setXLabelsAngle(-25); 						//設定X軸文字傾斜度
			
			Renderer.setXLabels(0); 							//設定X軸不顯示數字, 改以程式設定文字
			Renderer.setYAxisMin(0);							//設定Y軸文最小值
			
			yRenderer.setColor(Color.RED);              		//設定Series顏色
			//yRenderer.setDisplayChartValues(true);			//展現Series數值
			
			Series.add(0, 0); 
			Renderer.addXTextLabel(0, "");
			for(int r=0; r<xy.length; r++) {
				//Log.i("DEBUG", (r+1)+" "+xy[r][0]+"; "+xy[r][1]);
				Renderer.addXTextLabel(r+1, xy[r][0]);
				Series.add(r+1, Integer.parseInt(xy[r][1]));     
			}
			Series.add(11, 0); 
			Renderer.addXTextLabel(xy.length+1, "");
			
			View view = ChartFactory.getBarChartView(getBaseContext(), Dataset, Renderer, Type.DEFAULT);                			
			return view;
	}

}

 

STP4. 必須要把org.achartengine.GraphicalActivity加入application, 否則會出現android.content.ActivityNotFoundException


<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.achartenginebarchart"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk
        android:minSdkVersion="8"
        android:targetSdkVersion="17" />

    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name="com.example.achartenginebarchart.MainActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity android:name="org.achartengine.GraphicalActivity" />
    </application>

</manifest>

 

結果如下