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版本不同造成的,所以效果都一样。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值