java傳感器應用之指南針

        今天做了一個自制的指南針,很簡單的一個小程序給大家分享下,首先說一下android的傳感器吧。

       傳感器類型介紹

        Android庫中顯示的可支持的傳感器類型共有11種,但是並不是每部手機都裝置了所有的傳感器。這全部11種包括,加速度(accelerometer),磁場(magnetic field),方位角(orientation),陀螺儀(gyroscope),光線(light),壓力(pressure),溫度(temperature), 周圍物體感應(proximity),重力(gravity),線性加速度(linear acceleration),旋轉矢量(rotation vector)。

        我們接下來實現指南針的傳感器是使用方位角(orientation)傳感器,首先我們要得到傳感器管理器,然後再得到我們想要的類型的傳感器,下面是得到傳感器滴代碼:

		sm = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
		sensor = sm.getDefaultSensor(Sensor.TYPE_ORIENTATION);

SensorManager可以得到制定類型的傳感器也可以得到當前手機的所有傳感器,只要調用方法getSensorList(Sensor.TYPE_ALL)就行了。

得到SensorManager和Sensor後,我們需要設置一個監聽器去監聽傳感器事件,下面就是設置監聽器和卸載監聽器方法:

	@Override
	protected void onResume() {
		sm.registerListener(listener, sensor, SensorManager.SENSOR_DELAY_GAME);
		super.onResume();
	}

	@Override
	protected void onStop() {
		sm.unregisterListener(listener);
		super.onStop();
	}

下面是監聽器的實現,我們需要在監聽器中得到極方位角代碼如下:

	private SensorEventListener listener = new SensorEventListener() {

		@Override
		public void onAccuracyChanged(Sensor sensor, int accuracy) {
			// TODO Auto-generated method stub

		}

		@Override
		public void onSensorChanged(SensorEvent event) {
			data = event.values;
		}

	};

得到極方位角以後我們就可以自定義個view然後在onDraw()方法中實現方位變換時轉動,代碼如下:

		@Override
		public void draw(Canvas canvas) {
			canvas.drawColor(Color.WHITE);

			int cx = canvas.getWidth() / 2;
			int cy = canvas.getHeight() / 2;
			canvas.translate(cx, cy);
			Matrix matrix = new Matrix();
			if (data != null) {
				matrix.postRotate(-data[0]);
			}
			canvas.drawBitmap(point, matrix, paint);
			invalidate();
			super.draw(canvas);
		}

下面是整個類的代碼:

package com.metarnet.test;

import android.app.Activity;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Matrix;
import android.graphics.Paint;
import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
import android.os.Bundle;
import android.view.View;

public class TestsensorActivity extends Activity {
	/** Called when the activity is first created. */

	private SensorManager sm;

	private Sensor sensor;

	private float[] data;

	private Bitmap point;

	private SensorEventListener listener = new SensorEventListener() {

		@Override
		public void onAccuracyChanged(Sensor sensor, int accuracy) {
			// TODO Auto-generated method stub

		}

		@Override
		public void onSensorChanged(SensorEvent event) {
			data = event.values;
		}

	};

	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		point = BitmapFactory.decodeResource(getResources(),
				R.drawable.point_where);
		sm = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
		sm.getSensorList(Sensor.TYPE_ALL);
		sensor = sm.getDefaultSensor(Sensor.TYPE_ORIENTATION);
		Mapview view = new Mapview(this);
		setContentView(view);
	}

	class Mapview extends View {

		private Paint paint;

		public Mapview(Context context) {
			super(context);
			paint = new Paint();
		}

		@Override
		public void draw(Canvas canvas) {
			canvas.drawColor(Color.WHITE);

			int cx = canvas.getWidth() / 2;
			int cy = canvas.getHeight() / 2;
			canvas.translate(cx, cy);
			Matrix matrix = new Matrix();
			if (data != null) {
				matrix.postRotate(-data[0]);
			}
			canvas.drawBitmap(point, matrix, paint);
			invalidate();
			super.draw(canvas);
		}
	}

	@Override
	protected void onResume() {
		sm.registerListener(listener, sensor, SensorManager.SENSOR_DELAY_GAME);
		super.onResume();
	}

	@Override
	protected void onStop() {
		sm.unregisterListener(listener);
		super.onStop();
	}

}

至於什麼是極方位角這個大家可以去查詢質料,這裏推介一篇文章大家可以看看http://www.ijowett.com/android-sensor-compass.html

他這個案例中的一些方法可能和我的方法有一定差別,主要是我們用的android版本不同造成的,所以效果都一樣。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章