今天做了一個自制的指南針,很簡單的一個小程序給大家分享下,首先說一下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版本不同造成的,所以效果都一樣。