您的位置:首页 > 其它

传感器--方向传感器制作指南针

2016-05-19 11:42 363 查看
我们根据地磁传感器和加速度传感器来进行当前手机旋转的方向

同时使用一个imageView来展示我们当前的方向的展示,并让其根据手机旋转的角度来旋转指向正确的方向



public class MainActivity extends AppCompatActivity {

private SensorManager sensorManager;
private Sensor accelerometerSensor;//加速度传感器
private Sensor magneticSensor;//地磁传感器
private ImageView imageView;
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
init();
//将两个传感器注册       sensorManager.registerListener(listener,accelerometerSensor,SensorManager.SENSOR_DELAY_GAME);
sensorManager.registerListener(listener,magneticSensor,SensorManager.SENSOR_DELAY_GAME);
}

private void init() {
sensorManager= (SensorManager) getSystemService(SENSOR_SERVICE);
accelerometerSensor=sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
magneticSensor=sensorManager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD);

imageView= (ImageView) findViewById(R.id.imageView);
}

private SensorEventListener listener=new SensorEventListener() {

float[] accelerometerValues=new float[9];
float[] magneticValues=new float[3];
float lastDegree;//用来记录旋转之前的角度

@Override
public void onSensorChanged(SensorEvent event) {
//
if (event.sensor.getType()==Sensor.TYPE_ACCELEROMETER){
//在赋值的时候一定要调用一下values的clone()方法
//获取加速度传感器中的数据,是一个长度为9的数组
accelerometerValues=event.values.clone();
}else if (event.sensor.getType()==Sensor.TYPE_MAGNETIC_FIELD){
//获取地磁传感器的数据,是一个长度为3的数组
magneticValues=event.values.clone();
}
float[] R=new float[9];
float[] values=new float[3];
//通过下面的方法,获取一个包含旋转矩阵的数组,并将值赋给R,
SensorManager.getRotationMatrix(R,null,accelerometerValues,magneticValues);
SensorManager.getOrientation(R,values);
//values[0]中是围绕z轴旋转的角度,应用Math类将其转换为角度
Log.d("MainActivity",Math.toDegrees(values[0])+"");
float rotateDegree= (float) -Math.toDegrees(values[0]);
//应用动画,根据角度的变化,来旋转指南针图片
if (Math.abs(rotateDegree-lastDegree)>1){
new ObjectAnimator().ofFloat(imageView,"rotation",lastDegree,rotateDegree).setDuration(100).start();
lastDegree=rotateDegree;
}

}

@Override
public void onAccuracyChanged(Sensor sensor, int accuracy) {

}
};

//最后别忘记取消注册传感器
protected void onDestroy() {
super.onDestroy();
sensorManager.unregisterListener(listener);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: