亚洲免费在线-亚洲免费在线播放-亚洲免费在线观看-亚洲免费在线观看视频-亚洲免费在线看-亚洲免费在线视频

AChartEngine應用之LineChart(模擬動態生命特

系統 2688 0

AChartEngine應用之LineChart(模擬動態生命特征值圖)

接著上一次寫的內容,構建動態曲線圖,并產生與用戶交互,考慮到數據都是活動的,不可能總是用靜態數據,所以我下面的demo就是模擬。項目作用:模擬生命特征值圖,動態顯示分鐘脈搏生命特征值走向每隔1000ms產生50組數據,并填充到表格中,主要使用的到是Handler+Task,因為我是用Activity顯示這個表格每次產生的數據都需要快速的填充到主線程UI中,所以我就用Handler,這里的數據我都是采用隨機數表示,這個demo可以作為開發醫療設備顯示生命癥狀的表格信息參考,實際項目中如果需要用的每隔XX時間產生XX數據,最好是用Web提供數據,這樣可以實現多個客戶端 共享數據

構建LineChart圖的步驟主要分為以下四步,還需要在項目中引入AChartEngine依賴jar包,在Manifest中添加:<activityandroid:name="org.achartengine.GraphicalActivity" />

1.設置XYMultipleSeriesRenderer

mXYRenderer = buildRenderer(color, style, true);

mXYRenderer.setShowGrid(true);// 顯示表格

mXYRenderer.setGridColor(Color.GREEN);// 據說綠色代表健康色調,不過我比較喜歡灰色

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, "時間", "數量", 0, X, 0, Y,

Color.WHITE, Color.WHITE);// 這個是采用官方APIdemo提供給的方法

// 設置好圖表的樣式

2.構建數據源CategorySeries

series = new XYSeries(title);// 這個類用來放置曲線上的所有點,是一個點的集合,根據這些點畫出曲線

mDataset = new XYMultipleSeriesDataset(); // 創建一個數據集的實例,這個數據集將被用來創建圖表

mDataset.removeSeries(series);// 移除數據集中舊的點集

series.clear();// 點集先清空,為了做成新的點集而準備

for (int k = 0; k < X; k++) {// 實際項目中這些數據最好是由線程搞定,可以從WebService中獲取

int y = (int) (Math.random() * Y);

series.add(k, y);

}

mDataset.addSeries(series);// 在數據集中添加新的點集

mViewChart.invalidate();// 視圖更新,沒有這一步,曲線不會呈現動態

3.通過ChartFactory.getLineChartView生成曲線圖

mViewChart = ChartFactory.getLineChartView(context, mDataset,

mXYRenderer);// 通過ChartFactory生成圖表

mLayout.addView(mViewChart, new LayoutParams(LayoutParams.FILL_PARENT,

LayoutParams.FILL_PARENT));// 將圖表添加到布局中去

4.構建定時器任務

private final class StartBtn implements OnClickListener {

@Override

public void onClick(View arg0) {

Log.i("qiuzhping", "startBtn onClick");

handler = new Handler() {// 簡單的通過Handler+Task形成一個定時任務,從而完成定時更新圖表的功能

@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;// 設置標志

handler.sendMessage(message);

Log.i("qiuzhping", "TimerTask run");

}

};

timer.schedule(task, 1000, 1000);// 運行時間和間隔都是1000ms

}

}

效果圖:

AChartEngine應用之LineChart(模擬動態生命特征值圖)

AChartEngine應用之LineChart(模擬動態生命特征值圖)

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
 * @作用 :模擬生命特征值圖,動態顯示分鐘脈搏走向
 *     每隔1000ms產生50組數據,并填充到表格中,主要使用的到是Handler+Task,因為我是用Activity顯示這個表格
 *     每次產生的數據都需要快速的填充到主線程UI中,所以我就用Handler,這里的數據我都是采用隨機數表示,這個demo可以作為開發
 *     醫療設備顯示生命癥狀的表格信息參考,實際項目中如果需要用的每隔XX時間產生XX數據,最好是用Web提供數據,這樣可以實現多個客戶端 共享數據
 * @說明:環境是android4.0
 */
public class LifeEigenvalues extends Activity {
	private Button startBtn = null;
	private Button stopBtn = null;
	private Timer timer = new Timer();// 定時器
	private TimerTask task;// 任務
	private Handler handler;// 主要用于更新表格視圖
	private String title = "線性統計圖示例";
	private XYSeries series;// XY數據點
	private XYMultipleSeriesDataset mDataset;// XY軸數據集
	private GraphicalView mViewChart;// 用于顯示現行統計圖
	private XYMultipleSeriesRenderer mXYRenderer;// 線性統計圖主描繪器
	private Context context;// 用于獲取上下文對象
	private LinearLayout mLayout;
	private int X = 50;// X數據集大小
	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);// 這個類用來放置曲線上的所有點,是一個點的集合,根據這些點畫出曲線

		mDataset = new XYMultipleSeriesDataset(); // 創建一個數據集的實例,這個數據集將被用來創建圖表
		mDataset.addSeries(series);// 將點集添加到這個數據集中

		int color = Color.RED;// 設置顏色
		PointStyle style = PointStyle.CIRCLE;// 設置外觀周期性顯示
		mXYRenderer = buildRenderer(color, style, true);
		mXYRenderer.setShowGrid(true);// 顯示表格
		mXYRenderer.setGridColor(Color.GREEN);// 據說綠色代表健康色調,不過我比較喜歡灰色
		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, "時間", "數量", 0, X, 0, Y,
				Color.WHITE, Color.WHITE);// 這個是采用官方APIdemo提供給的方法
											// 設置好圖表的樣式

		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) {// 當結束程序時關掉Timer
			timer.cancel();
			Log.i("qiuzhping", "onDestroy timer cancel");
			super.onDestroy();
		}
	}

	protected XYMultipleSeriesRenderer buildRenderer(int color,
			PointStyle style, boolean fill) {// 設置圖表中曲線本身的樣式,包括顏色、點的大小以及線的粗細等
		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) {// 設置主描繪器的各項屬性,詳情可閱讀官方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刷新整個統計圖 產生50組數據,完全填充表格
	 */
	private void updateChart() {// 主要工作是每隔1000ms刷新整個統計圖
		Log.i("qiuzhping", "updateChart ok");
		mDataset.removeSeries(series);// 移除數據集中舊的點集
		series.clear();// 點集先清空,為了做成新的點集而準備

		for (int k = 0; k < X; k++) {// 實際項目中這些數據最好是由線程搞定,可以從WebService中獲取
			int y = (int) (Math.random() * Y);
			series.add(k, y);
		}
		mDataset.addSeries(series);// 在數據集中添加新的點集
		mViewChart.invalidate();// 視圖更新,沒有這一步,曲線不會呈現動態
	}

	private final class StartBtn implements OnClickListener {
		@Override
		public void onClick(View arg0) {
			Log.i("qiuzhping", "startBtn onClick");
			handler = new Handler() {// 簡單的通過Handler+Task形成一個定時任務,從而完成定時更新圖表的功能
				@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;// 設置標志
					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();
		}
	}
}

  

對應項目:http://download.csdn.net/detail/qiu_11/6858385

未完待續。。。。

AChartEngine應用系列文章

(一)AChartEngine簡介

(二)AChartEngine應用之PieChart(餅圖)

(三) AChartEngine應用之BarChart(柱形圖)

(四) AChartEngine應用之PieChart(動態餅圖,允許產生動態數據并顯示)

(五) AChartEngine應用之LineChart(模擬生命特征值圖)

(六) AChartEngine應用之LineChart(模擬三角函數sin,cos)

(七) AChartEngine高級應用 CombinedXYChart (組合統計圖)





AChartEngine應用之LineChart(模擬動態生命特征值圖)


更多文章、技術交流、商務合作、聯系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯系: 360901061

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

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 操操片 | 久久久久免费精品国产小说 | 欧美亚洲综合另类成人 | 色色色在线 | 亚洲欧美中文字幕 | 色啦啦在线观看 | 亚洲精品乱码久久久久蜜桃 | 天天干天天舔天天操 | 日本免费一区二区三区中文 | 久久人人干 | 九九热在线视频观看这里只有精品 | 四虎影视国产精品婷婷 | 夜夜久久 | 日韩毛片欧美一级国产毛片 | 免费一看一级毛片全播放 | 久久这里精品青草免费 | 久久99国产精品久久欧美 | 久久精品三级 | 欧美日韩中文在线 | 欧美一区二区三区在线可观看 | 欧美成人交tv免费观看 | 高清中文字幕免费观在线 | 国产亚洲精品成人久久网站 | 羞羞视频免费观看网站 | 九热在线| 天天操天天干天天干 | 久久一区视频 | 老色鬼久久综合第一 | 久久亚洲精品一区二区三区浴池 | 久久综合操 | 99久久精品免费看国产一区二区 | 成人黄18免费视频 | 亚洲资源站资源网在线 | 亚洲免费美女视频 | 日本三级11k影院在线 | 久久久久久九九 | 国产目拍亚洲精品一区二区三区 | 视频在线一区二区三区 | 国产色婷婷免费视频 | 4htv影院永久免费在线地址 | 欧美成人精品一区二区 |