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

  • 我们根据地磁传感器和加速度传感器来进行当前手机旋转的方向
  • 同时使用一个imageView来展示我们当前的方向的展示,并让其根据手机旋转的角度来旋转指向正确的方向
    传感器--方向传感器制作指南针_第1张图片
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);
    }
}

你可能感兴趣的:(传感器,指南针,Android)