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

  • 我们根据地磁传感器和加速度传感器来进行当前手机旋转的方向
  • 同时使用一个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);
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值