使用传感器的关键点:
创建传感器管理器: private SensorManager mSensorManager = (SensorManager)getSystemService(Context.SENSOR_SERVICE);
创建一个传感器:Sensor mSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_ORIENTATION);
然后创建一个传感器事件监听器: private final SensorEventListener mListener = new SensorEventListener()
该传感器监听器有两个方法:public void onSensorChanged(SensorEvent event) public void onAccuracyChanged(Sensor sensor, int accuracy)
然后注册传感器侦听回调函数:mSensorManager.registerListener(mListener, mSensor, SensorManager.SENSOR_DELAY_GAME);
最后销毁传感器回调函数: mSensorManager.unregisterListener(mListener);
package com.example.compass;
import android.app.Activity;
import android.content.Context;
import android.graphics.*;
import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
import android.os.Bundle;
import android.util.Config;
import android.util.Log;
import android.view.View;
public class Compass extends Activity {
private static final String TAG = "Compass";
private SensorManager mSensorManager;//传感器管理器
private Sensor mSensor; //传感器
private SampleView mView;// view
private float[] mValues;
private final SensorEventListener mListener = new SensorEventListener() {
public void onSensorChanged(SensorEvent event) {
if (Config.DEBUG) Log.d(TAG,
"sensorChanged (" + event.values[0] + ", " + event.values[1] + ", " + event.values[2] + ")");
mValues = event.values;
if (mView != null) {
mView.invalidate();
}
}
public void onAccuracyChanged(Sensor sensor, int accuracy) {
}
};
@Override
protected void onCreate(Bundle icicle) {
super.onCreate(icicle);
mSensorManager = (SensorManager)getSystemService(Context.SENSOR_SERVICE);
mSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_ORIENTATION);
mView = new SampleView(this);
setContentView(mView);
}
@Override
protected void onResume()
{
if (Config.DEBUG) Log.d(TAG, "onResume");
super.onResume();
mSensorManager.registerListener(mListener, mSensor,
SensorManager.SENSOR_DELAY_GAME);
}
@Override
protected void onStop()
{
if (Config.DEBUG) Log.d(TAG, "onStop");
mSensorManager.unregisterListener(mListener);
super.onStop();
}
private class SampleView extends View {
private Paint mPaint = new Paint();
private Path mPath = new Path();
private boolean mAnimate;
public SampleView(Context context) {
super(context);
// Construct a wedge-shaped path,设置指南针轮廓
mPath.moveTo(0, -50);
mPath.lineTo(-20, 80);
mPath.lineTo(0, 50);
mPath.lineTo(20, 80);
mPath.close();
}
@Override protected void onDraw(Canvas canvas) {
Paint paint = mPaint;
canvas.drawColor(Color.WHITE);//设置canvas背景颜色
paint.setAntiAlias(true);//设置抗锯齿
paint.setColor(Color.BLACK);//设置paint的颜色
paint.setStyle(Paint.Style.STROKE);//设置填充方式
int w = canvas.getWidth();
int h = canvas.getHeight();
int cx = w / 2;
int cy = h / 2;
canvas.translate(cx, cy);//canvas平移到屏幕中间
if (mValues != null) {
canvas.rotate(-mValues[0]);
}
canvas.drawPath(mPath, mPaint);
}
@Override
protected void onAttachedToWindow() {
mAnimate = true;
if (Config.DEBUG) Log.d(TAG, "onAttachedToWindow. mAnimate=" + mAnimate);
super.onAttachedToWindow();
}
@Override
protected void onDetachedFromWindow() {
mAnimate = false;
if (Config.DEBUG) Log.d(TAG, "onDetachedFromWindow. mAnimate=" + mAnimate);
super.onDetachedFromWindow();
}
}
}