- 新建BaseActivity类
由于传感器较多,新建一个BaseActivity封装属性和方法:
package com.example.gingerbread;
import java.util.List;
import android.app.Activity;
import android.content.Context;
import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
import android.widget.TextView;
public class BaseActivity extends Activity implements SensorEventListener {
public TextView tx1;
public TextView tx2;
public float[] angle = new float[3];
public long lastTime;
public SensorManager sm;
public String content;
private OnChangeListener onChangeListener;
private Sensor acceleromererSensor;
public List<Sensor> initSensorS() {
//获取手机所有的传感器
sm = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
return sm.getSensorList(Sensor.TYPE_ALL);
}
public void initSensor(Context ctx, int type) {
//根据传入的传感器类型初始化传感器
sm = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
acceleromererSensor = sm.getDefaultSensor(type);
// //注册传感器,第一个参数为距离监听器,第二个是传感器类型,第三个是获取数据速度
sm.registerListener(this, acceleromererSensor,
SensorManager.SENSOR_DELAY_NORMAL);
}
public static interface OnChangeListener {
public void onAccuracyChanged2(Sensor sensor, int accuracy);
public void onSensorChanged2(SensorEvent event);
}
public final void setOnChangeListener(OnChangeListener listener) {
onChangeListener = listener;
}
@Override
protected void onDestroy() {
// TODO Auto-generated method stub
super.onDestroy();
if (sm != null) {
//理解为取消这个事件监听实现注销传感器
sm.unregisterListener(this);
}
}
// 向量求模
public double magnitude(float x, float y, float z) {
double magnitude = 0;
magnitude = Math.sqrt(x * x + y * y + z * z);
return magnitude;
}
@Override
public void onSensorChanged(SensorEvent event) {
// TODO Auto-generated method stub
onChangeListener.onSensorChanged2(event);
}
@Override
public void onAccuracyChanged(Sensor sensor, int accuracy) {
// TODO Auto-generated method stub
// 精度发生改变
// 什么也不干
onChangeListener.onAccuracyChanged2(sensor, accuracy);
}
}
2.方向传感器:
- 新建activity
public class DirectionActivity extends BaseActivity implements OnChangeListener
- 初始化UI和传感器
setContentView(R.layout.activity_main);
tx2 = (TextView) findViewById(R.id.TextView02);
tx1 = (TextView) findViewById(R.id.TextView01);
// 系统设置的重力加速度标准值,设备在水平静止的情况下就承受这个压力,所以默认Y轴方向的加速度值为STANDARD_GRAVITY
initSensor(this, Sensor.TYPE_ORIENTATION);
setOnChangeListener(this);
- 主体:传感器数据处理
/**
* 第一个角度:Azimuth (degrees of rotation around the z axis).
*
* 表示手机自身的y轴与地磁场北极方向的角度,即手机顶部朝向与正北方向的角度。
*
*
* 当手机绕着自身的z轴旋转时,该角度值将发生改变。
*
* 例如该角度值为0时,表示手机顶部指向正北;该角度为90度时,代表手机顶部指向正东;该角度为180度时,代表手机顶部指向正南;
* 该角度为270度时,代表手机顶部指向正西。
*
*
*
* 第二个角度:Pitch (degrees of rotation around the x axis).
*
* 表示手机顶部或尾部翘起的角度。
*
* 当手机绕着自身的x轴旋转,该角度会发生变化,值的范围是-180到180度。
*
* 绕着X轴顺时针旋转时,该角度是负值;
*
* 绕着X轴逆时针旋转时,该角度是正值。
*
* 假设将手机屏幕朝上水平放在桌子上,如果桌子是完全水平的,该角度应该是0。
*
*
*
* 第三个角度:Roll (degrees of rotation around the y axis).
*
* 表示手机左侧或右侧翘起的角度。
*
* 当手机绕着自身Y轴旋转时,该角度值将会发生变化,取值范围是-90到90度。
*
* 绕着Y轴顺时针旋转时,该角度是负值;
*
* 绕着Y轴逆时针旋转时,该角度是正值。
*/
long currentTime = System.currentTimeMillis();
// 没100毫秒取一次距离
if (currentTime - lastTime < 100)
return;
lastTime = currentTime;
// if (timestamp != 0) {
// final float dT = (event.timestamp - timestamp) * NS2S;
// angle[0] = event.values[0] * dT * 100;
// angle[1] = event.values[1] * dT * 100;
// angle[2] = event.values[2] * dT * 100;
// }
timestamp = event.timestamp;
angle[0] = event.values[0];
angle[1] = event.values[1];
angle[2] = event.values[2];
content = String.format("Azimuth :%8.4f , Pitch :%8.4f , Roll :%8.4f",
angle[0], angle[1], angle[2]);
tx2.setText(content);
tx1.setText(timestamp + "");
Demo下载:gingerbread
相关链接:我的Android开发相关文章