1、示例讲解加速剂、磁场传感器、方向传感器
1)MainActivity.java
public class MainActivity extends Activity {
private static final String TAG = MainActivity.class.getSimpleName();
SensorManager sm;
Handler mHandler = new Handler();
TextView tv;
CompassView compassView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
sm = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
tv = (TextView) findViewById(R.id.txt);
compassView = (CompassView) findViewById(R.id.compassView);
Timer timer = new Timer("update", false);
timer.schedule(new TimerTask() {
@Override
public void run() {
mHandler.post(new Runnable() {
@Override
public void run() {
float[] values = calculateOrientation();
if(!(values[0]==0&&values[1]==0&&values[2]==0)){
tv.setText("方位角:"+values[0]
+"\n俯仰角:"+values[1]
+"\n横滚角:"+values[2]);
compassView.setValues(values);
compassView.invalidate();
}
}
});
}
}, 0L, 100L);
setRotation();
}
@Override
protected void onResume() {
super.onResume();
Sensor accelerometer = sm.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
Sensor magneticField = sm.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD);
sm.registerListener(mSensorEventListener, accelerometer, SensorManager.SENSOR_DELAY_FASTEST);
sm.registerListener(mSensorEventListener, magneticField, SensorManager.SENSOR_DELAY_FASTEST);
sm.registerListener(mSensorEventListener, sm.getDefaultSensor(Sensor.TYPE_ORIENTATION), SensorManager.SENSOR_DELAY_NORMAL);
}
@Override
protected void onPause() {
sm.unregisterListener(mSensorEventListener);
super.onPause();
}
private float[] aValues = new float[3];
private float[] mValues = new float[3];
private int rotation;
private SensorEventListener mSensorEventListener = new SensorEventListener() {
@Override
public void onSensorChanged(SensorEvent event) {
//求加速度
// float x = event.values[0];
// float y = event.values[1];
// float z = event.values[2];//9.8m/s^2
// double a = Math.round(Math.sqrt(Math.pow(x, 2)+Math.pow(y, 2)+Math.pow(z, 2)));
// double currentAcceleration = Math.abs(a-SensorManager.STANDARD_GRAVITY);
// Log.d(TAG, x+"-"+y+"-"+z+"-"+currentAcceleration);
if(event.sensor.getType() == Sensor.TYPE_ACCELEROMETER){
aValues = event.values;
}else if(event.sensor.getType() == Sensor.TYPE_MAGNETIC_FIELD){
mValues = event.values;
}else if(event.sensor.getType() == Sensor.TYPE_ORIENTATION){
float headingAngle = event.values[0];
float pitchAngle = event.values[1];
float rollAngle = event.values[2];
Log.d(TAG, headingAngle+"-"+pitchAngle+"-"+rollAngle);
}
}
@Override
public void onAccuracyChanged(Sensor sensor, int accuracy) {
}
};
private float[] calculateOrientation(){
float[] values = new float[3];
float[] inR = new float[9], outR = new float[9];
SensorManager.getRotationMatrix(inR, null, aValues, mValues);
int x_axis = SensorManager.AXIS_X, y_axis = SensorManager.AXIS_Y;
switch (rotation) {
case Surface.ROTATION_0:
break;
case Surface.ROTATION_90:
x_axis = SensorManager.AXIS_Y;
y_axis = SensorManager.AXIS_MINUS_X;
break;
case Surface.ROTATION_180:
y_axis = SensorManager.AXIS_MINUS_Y;
break;
case Surface.ROTATION_270:
x_axis = SensorManager.AXIS_MINUS_Y;
y_axis = SensorManager.AXIS_X;
}
SensorManager.remapCoordinateSystem(inR, x_axis, y_axis, outR);
SensorManager.getOrientation(outR, values);
values[0] = (float) Math.toDegrees(values[0]);
values[1] = (float) Math.toDegrees(values[1]);
values[2] = (float) Math.toDegrees(values[2]);
return values;
}
/**
* 每次切屏会调用此方法
*/
private void setRotation(){
//Activity方法,返回Object
WindowManager wm = (WindowManager) getSystemService(Context.WINDOW_SERVICE);
Display d = wm.getDefaultDisplay();
//顺时针旋转,华为X1不显示180,仅显示下面几个固定值
rotation = d.getRotation();
}
}
2)activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
xmlns:android="http://schemas.android.com/apk/res/android">
<TextView
android:id="@+id/txt"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="方位"/>
<com.qinuli.testproject.CompassView
android:id="@+id/compassView"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
</LinearLayout>
3)CompassView.java,显示方位角、俯仰角、横滚角的值
public class CompassView extends View {
private Paint mPaint;
private int increment = 300;
public CompassView(Context context, AttributeSet attrs) {
super(context, attrs);
mPaint = new Paint();
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
//(150,150),(450,450),(750,750)
canvas.drawLine(150f, 150f, (float)(150+Math.sin(-Math.toRadians(values[0]))*120),
(float)(150-Math.cos(Math.toRadians(values[0]))*120), mPaint);
canvas.drawLine(150f, 150f+increment, (float)(150+Math.sin(Math.toRadians(values[1]))*120),
(float)(150+increment-Math.cos(Math.toRadians(values[1]))*120), mPaint);
canvas.drawLine(150f, 150f+increment*2, (float)(150+Math.sin(Math.toRadians(values[2]))*120),
(float)(150+increment*2-Math.cos(Math.toRadians(values[2]))*120), mPaint);
}
private float[] values = new float[3];
public void setValues(float[] values){
this.values = values;
}
}