今天做了一个自制的指南针,很简单的一个小程序给大家分享下,首先说一下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版本不同造成的,所以效果都一样。