安卓 使用開源AChartEngine圖表庫畫折線圖
安卓 使用開源AChartEngine圖表庫畫折線圖
一、簡述
記--使用AChartEngine開源圖表庫繪製簡單的折線圖。
AChartEngine是一個開源的Android圖表庫,可以用來畫折線圖、面積圖、條形圖、柱形圖、組合圖表等等。
簡單的折線圖例子:連結: https://pan.baidu.com/s/1ed3wiBEde4FgSNADTjfdQg 提取碼: w3a2
開源庫 achartengine-1.1.0.jar:連結: https://pan.baidu.com/s/15og74JFUMf-HSgYD6FFpOA 提取碼: 9k2d
其他圖表例子:連結: https://pan.baidu.com/s/1BaDPzW2xG0u4Grc_4OukpA 提取碼: n4ag
二、效果
三、工程結構
四、原始檔
MainActivity.java檔案
package com.liang.chart; import org.achartengine.chart.PointStyle; import android.os.Bundle; import android.app.Activity; import android.graphics.Color; public class MainActivity extends Activity { private LineChart mLineChart;//直線圖類 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main);//設定主介面 //建立折線圖例項 (X軸標題,Y軸標題,X軸的最小值,X軸的最大值,Y軸的最小值,Y軸的最大值,座標軸的顏色,刻度值的顏色) mLineChart = new LineChart("時間(min)", "", 0, 100, -8000, 8000, Color.WHITE, Color.WHITE); }; @Override protected void onResume() //在本頁面onStart()之後設定為繪圖所在的頁面 { super.onResume(); //設定圖表顯示頁面為本頁面 mLineChart.setChartViewActivity(this); mLineChart.addLineToChart("折線A", PointStyle.CIRCLE, Color.BLUE);//新增折線A mLineChart.addLineToChart("折線B", PointStyle.DIAMOND, Color.GREEN);//新增折線B mLineChart.addLineToChart("折線C", PointStyle.TRIANGLE, Color.CYAN);//新增折線C mLineChart.addLineToChart("折線D", PointStyle.SQUARE, Color.YELLOW);//新增折線D //折線A 新增資料 (新增折點) mLineChart.addData("折線A", 10, 3000); mLineChart.addData("折線A", 30, 7000); mLineChart.addData("折線A", 70, 3000); mLineChart.addData("折線A", 90, 5000); //折線B 新增資料 (新增折點) mLineChart.addData("折線B", 5, 0); mLineChart.addData("折線B", 40, 2000); mLineChart.addData("折線B", 60, 6000); mLineChart.addData("折線B", 80, 4000); //折線C 新增資料 (新增折點) mLineChart.addData("折線C", 10, 7000); mLineChart.addData("折線C", 30, 300); mLineChart.addData("折線C", 60, 1000); mLineChart.addData("折線C", 90, 2000); //折線D 新增資料 (新增折點) mLineChart.addData("折線D", 20, 2000); mLineChart.addData("折線D", 30, 4000); mLineChart.addData("折線D", 50, 3000); mLineChart.addData("折線D", 90, 7000); //繪製折線圖 mLineChart.mChartView.repaint(); } }//end with MainActivity
LineChart.java檔案
package com.liang.chart;
import java.util.ArrayList;
import java.util.List;
import org.achartengine.ChartFactory;
import org.achartengine.GraphicalView;
import org.achartengine.chart.PointStyle;
import org.achartengine.model.SeriesSelection;
import org.achartengine.model.XYMultipleSeriesDataset;
import org.achartengine.model.XYSeries;
import org.achartengine.renderer.XYMultipleSeriesRenderer;
import org.achartengine.renderer.XYSeriesRenderer;
import com.liang.chart.R;
import android.app.Activity;
import android.graphics.Color;
import android.graphics.Paint.Align;
import android.view.View;
import android.view.ViewGroup.LayoutParams;
import android.widget.LinearLayout;
import android.widget.Toast;
//折線圖 類
public class LineChart
{
// 渲染資料集 (圖表的資料,折線的折點座標資訊等)
private XYMultipleSeriesDataset mDataset;
// 多重圖層渲染器 (可以看做是總渲染器(含多個子渲染器),繪製背景網格,折線圖等)
private XYMultipleSeriesRenderer mMltRenderer;
// 折線集合
private List<XYSeries> mSeriesList;
// 標記折線圖是否可以拖動
public boolean mIsCanMove = true;
// 圖表檢視(就是最後繪製出來的整個折線圖)
public GraphicalView mChartView;
//無參建構函式 (如果有 有引數的建構函式,就不會自動新增無參建構函式,最好自己加上無參建構函式,)
public LineChart(){}
/* 有參建構函式
* 設定圖表屬性
* xTitle:X軸標題
* yTitle:Y軸標題
* xMin:X軸的最小值
* xMax:X軸的最大值
* yMin:Y軸的最小值
* yMax:Y軸的最大值
* axisColor:座標軸的顏色
* labelsColor:標籤的顏色(標籤:也就是座標軸上的刻度值10,20...80)
*/
public LineChart(String xTitle, String yTitle, double xMin,
double xMax, double yMin, double yMax, int axisColor, int labelsColor)
{
mDataset = new XYMultipleSeriesDataset();// 例項化資料集物件
mMltRenderer = new XYMultipleSeriesRenderer();// 例項化多層渲染器物件
mSeriesList = new ArrayList<XYSeries>(); // 初始化折線集合
mMltRenderer.setXTitle(xTitle);// 設定X軸標題
mMltRenderer.setYTitle(yTitle);// 設定Y軸標題
mMltRenderer.setXAxisMin(xMin);// 設定X軸的最小值
mMltRenderer.setXAxisMax(xMax);// 設定X軸的最大值
mMltRenderer.setYAxisMin(yMin);// 設定Y軸的最小值
mMltRenderer.setYAxisMax(yMax);// 設定Y軸的最大值
mMltRenderer.setAxesColor(axisColor);// 設定座標軸顏色
mMltRenderer.setLabelsColor(labelsColor);// 設定標籤(刻度值)顏色
mMltRenderer.setShowGrid(true);// 顯示網格
mMltRenderer.setGridColor(Color.GRAY);// 設定網格顏色
mMltRenderer.setXLabels(10);// 設定X軸的標籤數(有幾個刻度)
mMltRenderer.setXLabelsPadding(10);//設定X軸標籤的間距
mMltRenderer.setYLabels(16);// 設定Y軸的標籤數
mMltRenderer.setYLabelsAlign(Align.RIGHT);// 設定Y軸標籤的方向
mMltRenderer.setPointSize((float) 2);//設定折線點的大小
mMltRenderer.setShowLegend(true);// 下面的 圖例標註,如圓點的藍色的折線是X軸...
mMltRenderer.setZoomButtonsVisible(false);// 隱藏放大縮小按鈕
mMltRenderer.setZoomEnabled(true, false);// 設定縮放,這邊是橫向可以縮放,豎向不能縮放
mMltRenderer.setPanEnabled(true, false);// 設定滑動,這邊是橫向可以滑動,豎向不可滑動
}
//新增一條折線到圖表
public void addLineToChart(String lineTitle, PointStyle pointStyle, int lineColor)
{
XYSeriesRenderer serRender = new XYSeriesRenderer();//建立1個子渲染器
XYSeries series = new XYSeries(lineTitle);//建立1條折線
mMltRenderer.addSeriesRenderer(serRender);// 將子渲染器新增到總渲染器
mDataset.addSeries(series);// 將折線新增到資料集
mSeriesList.add(series);// 將折線新增到折線集合
// 設定折線渲染屬性
serRender.setPointStyle(pointStyle);// 設定折點的樣式
serRender.setColor(lineColor);// 設定折線的顏色
serRender.setFillPoints(true);// 設定折點是實心還是空心
serRender.setDisplayChartValues(true);// 顯示折點的Y值
serRender.setDisplayChartValuesDistance(10);// 設定數值與折點的距離
}
//設定圖表的顯示頁面 (activity:圖表顯示所在的頁面)
public void setChartViewActivity(final Activity activity)
{
if (mChartView == null)
{
//獲取一個layout,用來顯示圖表
LinearLayout layout = (LinearLayout) activity.findViewById(R.id.chart);
//生成圖表
mChartView = ChartFactory.getLineChartView(activity, mDataset,mMltRenderer);
mMltRenderer.setClickEnabled(true);// 可以響應點選
mMltRenderer.setSelectableBuffer(10);// 設定點的緩衝半徑值(在某點附近點選時,在點的半徑範圍內都算點選這個點)
//折線的點選響應
mChartView.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
// 拿到點選的折線物件、折點
SeriesSelection seriesSelection = mChartView.getCurrentSeriesAndPoint();
if (seriesSelection != null)
{
// 將所點選的點的資訊通過Toast展示(點選的是那一條折線,第幾個折點,座標值)
Toast.makeText(activity,
"折線:"+ seriesSelection.getSeriesIndex()
+ "\n點: "+ seriesSelection.getPointIndex()
+ "\nX="+ seriesSelection.getXValue() + ", Y="+ seriesSelection.getValue(),
Toast.LENGTH_SHORT).show();
}
}
});
// 將圖表新增到layout中
layout.addView(mChartView, new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));
}
else
{
mChartView.repaint();//繪製折線圖(重繪,更新)
}
}
// 向某條折線新增折點(x,y) (新增資料)lineTitle:折線的標題
public void addData(String lineTitle, double x, double y)
{
if(mSeriesList.size() > 0 )//有折線
{
for(XYSeries ser : mSeriesList)//遍歷折線集合
{
if(ser.getTitle().equals(lineTitle))// 找到指定的折線
{
ser.add(x, y);
break;
}
}
}
}
}
佈局檔案
activity_main.xml檔案
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity" >
<LinearLayout
android:id="@+id/chart"
android:layout_width="fill_parent"
android:layout_height="500dp"
android:orientation="horizontal" >
</LinearLayout>
</RelativeLayout>
五、總結
5.1 AChartEngine開源庫的使用事項:
1) 需要將對應的jar包新增到libs目錄下(右鍵專案->Build Path->ConfigureBuild Path...->Libraries->Add External JARs)
還需要直接右鍵拷貝到libs目錄下
2) 需要在AndroidManifest.xml檔案中的application標籤內新增<activity android:name="org.achartengine.GraphicalActivity" />
如果使用的是 ChartFactory.getLineChartView()得到一個GraphicalView型別的檢視,則可以不用新增。
3) 匯入 例子時,可能出現專案有紅色歎號的情況,此時需要修改jar包的路徑。
(右鍵專案->Build Path->ConfigureBuild Path...->Libraries->Edit)
4) 設定模擬器的大小
六、其他圖表例子
作者ddanny的demo: https://github.com/ddanny/achartengine
演示: