AChartEngine應(yīng)用之LineChart(模擬動態(tài)生命特征值圖)
接著上一次寫的內(nèi)容,構(gòu)建動態(tài)曲線圖,并產(chǎn)生與用戶交互,考慮到數(shù)據(jù)都是活動的,不可能總是用靜態(tài)數(shù)據(jù),所以我下面的demo就是模擬。項目作用:模擬生命特征值圖,動態(tài)顯示分鐘脈搏生命特征值走向每隔1000ms產(chǎn)生50組數(shù)據(jù),并填充到表格中,主要使用的到是Handler+Task,因為我是用Activity顯示這個表格每次產(chǎn)生的數(shù)據(jù)都需要快速的填充到主線程UI中,所以我就用Handler,這里的數(shù)據(jù)我都是采用隨機數(shù)表示,這個demo可以作為開發(fā)醫(yī)療設(shè)備顯示生命癥狀的表格信息參考,實際項目中如果需要用的每隔XX時間產(chǎn)生XX數(shù)據(jù),最好是用Web提供數(shù)據(jù),這樣可以實現(xiàn)多個客戶端 共享數(shù)據(jù)
構(gòu)建LineChart圖的步驟主要分為以下四步,還需要在項目中引入AChartEngine依賴jar包,在Manifest中添加:<activityandroid:name="org.achartengine.GraphicalActivity" />
1.設(shè)置XYMultipleSeriesRenderer
mXYRenderer = buildRenderer(color, style, true); mXYRenderer.setShowGrid(true);// 顯示表格 mXYRenderer.setGridColor(Color.GREEN);// 據(jù)說綠色代表健康色調(diào),不過我比較喜歡灰色 mXYRenderer.setXLabels(20); mXYRenderer.setYLabels(10); mXYRenderer.setYLabelsAlign(Align.RIGHT);// 右對齊 // mXYRenderer.setPointSize((float) 2); mXYRenderer.setShowLegend(false);// 不顯示圖例 mXYRenderer.setZoomEnabled(false); mXYRenderer.setPanEnabled(true, false); mXYRenderer.setClickEnabled(false); setChartSettings(mXYRenderer, title, "時間", "數(shù)量", 0, X, 0, Y, Color.WHITE, Color.WHITE);// 這個是采用官方APIdemo提供給的方法 // 設(shè)置好圖表的樣式 |
2.構(gòu)建數(shù)據(jù)源CategorySeries
series = new XYSeries(title);// 這個類用來放置曲線上的所有點,是一個點的集合,根據(jù)這些點畫出曲線 mDataset = new XYMultipleSeriesDataset(); // 創(chuàng)建一個數(shù)據(jù)集的實例,這個數(shù)據(jù)集將被用來創(chuàng)建圖表 mDataset.removeSeries(series);// 移除數(shù)據(jù)集中舊的點集 series.clear();// 點集先清空,為了做成新的點集而準備
for (int k = 0; k < X; k++) {// 實際項目中這些數(shù)據(jù)最好是由線程搞定,可以從WebService中獲取 int y = (int) (Math.random() * Y); series.add(k, y); } mDataset.addSeries(series);// 在數(shù)據(jù)集中添加新的點集 mViewChart.invalidate();// 視圖更新,沒有這一步,曲線不會呈現(xiàn)動態(tài) |
3.通過ChartFactory.getLineChartView生成曲線圖
mViewChart = ChartFactory.getLineChartView(context, mDataset, mXYRenderer);// 通過ChartFactory生成圖表
mLayout.addView(mViewChart, new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT));// 將圖表添加到布局中去 |
4.構(gòu)建定時器任務(wù)
private final class StartBtn implements OnClickListener { @Override public void onClick(View arg0) { Log.i("qiuzhping", "startBtn onClick"); handler = new Handler() {// 簡單的通過Handler+Task形成一個定時任務(wù),從而完成定時更新圖表的功能 @Override public void handleMessage(Message msg) { if (msg.what == 1) { Log.i("qiuzhping", "Handler handleMessage"); updateChart(); // 刷新圖表,handler的作用是將此方法并入主線程,在非主線程是不能修改UI的 super.handleMessage(msg); } } };
task = new TimerTask() {// 定時器 @Override public void run() { Message message = new Message(); message.what = 1;// 設(shè)置標志 handler.sendMessage(message); Log.i("qiuzhping", "TimerTask run"); } }; timer.schedule(task, 1000, 1000);// 運行時間和間隔都是1000ms } } |
效果圖:
Code:
package com.qiuzhping.achart.app; import java.util.Timer; import java.util.TimerTask; import org.achartengine.ChartFactory; import org.achartengine.GraphicalView; import org.achartengine.chart.PointStyle; import org.achartengine.model.XYMultipleSeriesDataset; import org.achartengine.model.XYSeries; import org.achartengine.renderer.XYMultipleSeriesRenderer; import org.achartengine.renderer.XYSeriesRenderer; import android.app.Activity; import android.content.Context; import android.graphics.Color; import android.graphics.Paint.Align; import android.os.Bundle; import android.os.Handler; import android.os.Message; import android.util.Log; import android.view.View; import android.view.View.OnClickListener; import android.view.ViewGroup.LayoutParams; import android.widget.Button; import android.widget.LinearLayout; import com.qiuzhping.achart.R; /** * @項目名稱:模擬生命特征值圖 * @類名稱:AnalogPulse * @作者:Qiuzhping * @時間:2014-1-17上午11:46:51 * @作用 :模擬生命特征值圖,動態(tài)顯示分鐘脈搏走向 * 每隔1000ms產(chǎn)生50組數(shù)據(jù),并填充到表格中,主要使用的到是Handler+Task,因為我是用Activity顯示這個表格 * 每次產(chǎn)生的數(shù)據(jù)都需要快速的填充到主線程UI中,所以我就用Handler,這里的數(shù)據(jù)我都是采用隨機數(shù)表示,這個demo可以作為開發(fā) * 醫(yī)療設(shè)備顯示生命癥狀的表格信息參考,實際項目中如果需要用的每隔XX時間產(chǎn)生XX數(shù)據(jù),最好是用Web提供數(shù)據(jù),這樣可以實現(xiàn)多個客戶端 共享數(shù)據(jù) * @說明:環(huán)境是android4.0 */ public class LifeEigenvalues extends Activity { private Button startBtn = null; private Button stopBtn = null; private Timer timer = new Timer();// 定時器 private TimerTask task;// 任務(wù) private Handler handler;// 主要用于更新表格視圖 private String title = "線性統(tǒng)計圖示例"; private XYSeries series;// XY數(shù)據(jù)點 private XYMultipleSeriesDataset mDataset;// XY軸數(shù)據(jù)集 private GraphicalView mViewChart;// 用于顯示現(xiàn)行統(tǒng)計圖 private XYMultipleSeriesRenderer mXYRenderer;// 線性統(tǒng)計圖主描繪器 private Context context;// 用于獲取上下文對象 private LinearLayout mLayout; private int X = 50;// X數(shù)據(jù)集大小 private int Y = 50;// @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.analog_pulse); startBtn = (Button) findViewById(R.id.startBtn); startBtn.setOnClickListener(new StartBtn()); stopBtn = (Button) findViewById(R.id.stopBtn); stopBtn.setOnClickListener(new StopBtn()); context = getApplicationContext();// 獲取上下文對象 mLayout = (LinearLayout) findViewById(R.id.chart);// 這里獲得xy_chart的布局,下面會把圖表畫在這個布局里面 series = new XYSeries(title);// 這個類用來放置曲線上的所有點,是一個點的集合,根據(jù)這些點畫出曲線 mDataset = new XYMultipleSeriesDataset(); // 創(chuàng)建一個數(shù)據(jù)集的實例,這個數(shù)據(jù)集將被用來創(chuàng)建圖表 mDataset.addSeries(series);// 將點集添加到這個數(shù)據(jù)集中 int color = Color.RED;// 設(shè)置顏色 PointStyle style = PointStyle.CIRCLE;// 設(shè)置外觀周期性顯示 mXYRenderer = buildRenderer(color, style, true); mXYRenderer.setShowGrid(true);// 顯示表格 mXYRenderer.setGridColor(Color.GREEN);// 據(jù)說綠色代表健康色調(diào),不過我比較喜歡灰色 mXYRenderer.setXLabels(20); mXYRenderer.setYLabels(10); mXYRenderer.setYLabelsAlign(Align.RIGHT);// 右對齊 // mXYRenderer.setPointSize((float) 2); mXYRenderer.setShowLegend(false);// 不顯示圖例 mXYRenderer.setZoomEnabled(false); mXYRenderer.setPanEnabled(true, false); mXYRenderer.setClickEnabled(false); setChartSettings(mXYRenderer, title, "時間", "數(shù)量", 0, X, 0, Y, Color.WHITE, Color.WHITE);// 這個是采用官方APIdemo提供給的方法 // 設(shè)置好圖表的樣式 mViewChart = ChartFactory.getLineChartView(context, mDataset, mXYRenderer);// 通過ChartFactory生成圖表 mLayout.addView(mViewChart, new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT));// 將圖表添加到布局中去 } @Override public void onDestroy() { if (timer != null) {// 當結(jié)束程序時關(guān)掉Timer timer.cancel(); Log.i("qiuzhping", "onDestroy timer cancel"); super.onDestroy(); } } protected XYMultipleSeriesRenderer buildRenderer(int color, PointStyle style, boolean fill) {// 設(shè)置圖表中曲線本身的樣式,包括顏色、點的大小以及線的粗細等 XYMultipleSeriesRenderer renderer = new XYMultipleSeriesRenderer(); XYSeriesRenderer r = new XYSeriesRenderer(); r.setColor(color); r.setPointStyle(style); r.setFillPoints(fill); r.setLineWidth(3); renderer.addSeriesRenderer(r); return renderer; } protected void setChartSettings(XYMultipleSeriesRenderer renderer, String title, String xTitle, String yTitle, double xMin, double xMax, double yMin, double yMax, int axesColor, int labelsColor) {// 設(shè)置主描繪器的各項屬性,詳情可閱讀官方API文檔 renderer.setChartTitle(title); renderer.setXTitle(xTitle); renderer.setYTitle(yTitle); renderer.setXAxisMin(xMin); renderer.setXAxisMax(xMax); renderer.setYAxisMin(yMin); renderer.setYAxisMax(yMax); renderer.setAxesColor(axesColor); renderer.setLabelsColor(labelsColor); } /** * @方法名: updateChart * @作者:Qiuzhping * @作用: 主要工作是每隔1000ms刷新整個統(tǒng)計圖 產(chǎn)生50組數(shù)據(jù),完全填充表格 */ private void updateChart() {// 主要工作是每隔1000ms刷新整個統(tǒng)計圖 Log.i("qiuzhping", "updateChart ok"); mDataset.removeSeries(series);// 移除數(shù)據(jù)集中舊的點集 series.clear();// 點集先清空,為了做成新的點集而準備 for (int k = 0; k < X; k++) {// 實際項目中這些數(shù)據(jù)最好是由線程搞定,可以從WebService中獲取 int y = (int) (Math.random() * Y); series.add(k, y); } mDataset.addSeries(series);// 在數(shù)據(jù)集中添加新的點集 mViewChart.invalidate();// 視圖更新,沒有這一步,曲線不會呈現(xiàn)動態(tài) } private final class StartBtn implements OnClickListener { @Override public void onClick(View arg0) { Log.i("qiuzhping", "startBtn onClick"); handler = new Handler() {// 簡單的通過Handler+Task形成一個定時任務(wù),從而完成定時更新圖表的功能 @Override public void handleMessage(Message msg) { if (msg.what == 1) { Log.i("qiuzhping", "Handler handleMessage"); updateChart(); // 刷新圖表,handler的作用是將此方法并入主線程,在非主線程是不能修改UI的 super.handleMessage(msg); } } }; task = new TimerTask() {// 定時器 @Override public void run() { Message message = new Message(); message.what = 1;// 設(shè)置標志 handler.sendMessage(message); Log.i("qiuzhping", "TimerTask run"); } }; timer.schedule(task, 1000, 1000);// 運行時間和間隔都是1000ms } } private final class StopBtn implements OnClickListener { @Override public void onClick(View arg0) { Log.i("qiuzhping", "stopBtn onClick"); LifeEigenvalues.this.finish(); } } }
對應(yīng)項目:http://download.csdn.net/detail/qiu_11/6858385
未完待續(xù)。。。。
AChartEngine應(yīng)用系列文章
(二)AChartEngine應(yīng)用之PieChart(餅圖)
(三)
AChartEngine應(yīng)用之BarChart(柱形圖)
(四)
AChartEngine應(yīng)用之PieChart(動態(tài)餅圖,允許產(chǎn)生動態(tài)數(shù)據(jù)并顯示)
(五)
AChartEngine應(yīng)用之LineChart(模擬生命特征值圖)
(六)
AChartEngine應(yīng)用之LineChart(模擬三角函數(shù)sin,cos)
(七) AChartEngine高級應(yīng)用 CombinedXYChart (組合統(tǒng)計圖)
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯(lián)系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
