Android中指南针的实现 您所在的位置:网站首页 android传感器高级编程 Android中指南针的实现

Android中指南针的实现

2023-08-26 21:32| 来源: 网络整理| 查看: 265

其实这篇博客不是做真正的指南针,因为真正的指南针需要做一个完整的自定义控件来指示方向。我们这里只是简单通过代码获取用户手机头部指向的方向。这个功能往往在我们定位获取的时候,用户方向变更后进行采集、车辆行驶偏移等有一定的作用。下面我们通过代码简单编写一下。

activity_main.xml

MainActivity.java

public class MainActivity extends BaseActivity implements SensorEventListener { private TextView tv_direction; private SensorManager mSensorMgr;// 声明一个传感管理器对象 private float[] mAcceValues; // 加速度变更值的数组 private float[] mMagnValues; // 磁场强度变更值的数组 private TextView tv_jt; @Override protected MvcBaseModel getModelImp() { return null; } @Override protected int getContentLayoutId() { return R.layout.activity_main; } @Override protected void initWidget() { tv_direction = findViewById(R.id.tv_direction); tv_jt = findViewById(R.id.tv_jt); // 从系统服务中获取传感管理器对象 mSensorMgr = (SensorManager) getSystemService(Context.SENSOR_SERVICE); } @Override protected void onPause() { super.onPause(); // 注销当前活动的传感监听器 mSensorMgr.unregisterListener(this); } @Override protected void onResume() { super.onResume(); int suitable = 0; // 获取当前设备支持的传感器列表 List sensorList = mSensorMgr.getSensorList(Sensor.TYPE_ALL); for (Sensor sensor : sensorList) { if (sensor.getType() == Sensor.TYPE_ACCELEROMETER) { // 找到加速度传感器 suitable += 1; } else if (sensor.getType() == Sensor.TYPE_MAGNETIC_FIELD) { // 找到磁场传感器 suitable += 10; } } if (suitable / 10 > 0 && suitable % 10 > 0) { // 给加速度传感器注册传感监听器 mSensorMgr.registerListener(this, mSensorMgr.getDefaultSensor(Sensor.TYPE_ACCELEROMETER), SensorManager.SENSOR_DELAY_NORMAL); // 给磁场传感器注册传感监听器 mSensorMgr.registerListener(this, mSensorMgr.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD), SensorManager.SENSOR_DELAY_NORMAL); } else { tv_direction.setText("当前设备不支持指南针,请检查是否存在加速度和磁场传感器"); } } @Override public void onSensorChanged(SensorEvent event) { if (event.sensor.getType() == Sensor.TYPE_ACCELEROMETER) { // 加速度变更事件 mAcceValues = event.values; } else if (event.sensor.getType() == Sensor.TYPE_MAGNETIC_FIELD) { // 磁场强度变更事件 mMagnValues = event.values; } if (mAcceValues != null && mMagnValues != null) { calculateOrientation(); // 加速度和磁场强度两个都有了,才能计算磁极的方向 } } //当传感器精度改变时回调该方法,一般无需处理 public void onAccuracyChanged(Sensor sensor, int accuracy) {} // 计算指南针的方向 private void calculateOrientation() { float[] values = new float[3]; float[] R = new float[9]; SensorManager.getRotationMatrix(R, null, mAcceValues, mMagnValues); SensorManager.getOrientation(R, values); values[0] = (float) Math.toDegrees(values[0]); Log.i("aaaaaaaaaaa",values[0]+""); tv_jt.setRotation(values[0]); // 设置罗盘视图中的指南针方向 if (values[0] >= -10 && values[0] < 10) { tv_direction.setText("手机上部方向是正北"); } else if (values[0] >= 10 && values[0] < 80) { tv_direction.setText("手机上部方向是东北"); } else if (values[0] >= 80 && values[0] = 100 && values[0] < 170) { tv_direction.setText("手机上部方向是东南"); } else if ((values[0] >= 170 && values[0] = -180 && values[0] < -170) { tv_direction.setText("手机上部方向是正南"); } else if (values[0] >= -170 && values[0] < -100) { tv_direction.setText("手机上部方向是西南"); } else if (values[0] >= -100 && values[0] < -80) { tv_direction.setText("手机上部方向是正西"); } else if (values[0] >= -80 && values[0] < -10) { tv_direction.setText("手机上部方向是西北"); } } }

这样就实现了方向的获取和配合指针的一个旋转。如果大家需要可以在UI上进行相应的变化。



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有