文档章节

Google Map 开发(二):根据方向传感器对 Marker 进行旋转

范特彪西
 范特彪西
发布于 2018/07/20 19:43
字数 947
阅读 1.5K
收藏 0

这是最近做的一个小功能,虽然很简单,网上却很少有相关例子,关于怎么使用地磁和加速度传感器的例子是有了,怎么旋转 Google Map Marker 也能 Google 到一些,但是结合起来就基本没看到,也可能是我搜索方式不对,所以还是自己来实现了。

首先找找 Google Map Marker 相关的文档,如何使用可以参见这个:

https://developers.google.com/maps/documentation/android-sdk/marker?hl=zh-cn

对于 Marker 类可以参考:

https://developers.google.com/android/reference/com/google/android/gms/maps/model/Marker?hl=zh-cn

(2018/06/29 验证)

Marker 有一个很重要的属性:Anchor,请记者这个小东西,后面要用到它,官方的解释是 :

The point on the image that will be placed at the LatLng position of the marker. This defaults to 50% from the left of the image and at the bottom of the image.

接着说说怎么利用方向传感器,在 Android 中,方位是通过加速度传感器和地磁传感器共同确定。

sensorManager = (SensorManager) getActivity().getSystemService(Context.SENSOR_SERVICE);
Sensor magnetic = null;
if (sensorManager != null) {
    magnetic = sensorManager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD);
}
Sensor acceleromter = null;
if (sensorManager != null) {
    acceleromter = sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
}
if (sensorManager != null) {
    sensorManager.registerListener(sensorEventListener, magnetic, SensorManager.SENSOR_DELAY_GAME);
}
if (sensorManager != null) {
    sensorManager.registerListener(sensorEventListener, acceleromter, SensorManager.SENSOR_DELAY_GAME);
}

在获取到传感器的数据后,可以获取用户此时旋转了多少度,然后再对 Marker 进行旋转。

private SensorEventListener sensorEventListener = new SensorEventListener() {
      @Override
      public void onSensorChanged(SensorEvent event) {
       
      }
      @Override
      public void onAccuracyChanged(Sensor sensor, int accuracy) {
      }
 };

我们的逻辑代码就写在 onSensorChanged 方法里,准备两个 float 类型的数据,分别存储地磁传感器和加速度传感器的数据。

 float[] magneticValues = new float[3];
 float[] acceleromterValues = new float[3];

传感器的数据更新是非常快的,为了避免 Marker 旋转像是遇到了鬼一样,我们对时间间隔和更新角度信息做个显示,定义两个变量分别表示上次旋转的角度和上次传感器数据更新的时间。

private float lastRotateDegree;
private long lastUpdatetime;

将传感器数据赋值给数组:

 // 判断数据来源于哪个传感器
 if (event.sensor.getType() == Sensor.TYPE_ACCELEROMETER) {
     acceleromterValues = event.values.clone();
 } else if (event.sensor.getType() == Sensor.TYPE_MAGNETIC_FIELD) {
     magneticValues = event.values.clone();
 }

为了得到传感器的航向角、俯仰角、横滚角等数据,我们需要计算一个旋转矩阵,不过 SensorManager 已经提供了,只需要调用就可以了,并用新的数组保存他们。

float[] R = new float[9];
float[] values = new float[3];
SensorManager.getRotationMatrix(R, null, acceleromterValues, magneticValues);
SensorManager.getOrientation(R, values);

接下来计算出旋转角度,并用 0~360° 表示。

 float roteteDegree = -(float) Math.toDegrees(values[0]);
 if (roteteDegree < 0) roteteDegree = 360 + roteteDegree;
 if (roteteDegree < 0 || roteteDegree > 360) return;

计算本次旋转角度更新的度数,定义如果在 0.5°之间是属于抖动,直接过滤掉,不予更新。

float offset = roteteDegree - lastRotateDegree;
if (Math.abs(offset) < 0.5f) return;

在得到了 roteteDegree 的值后,就已经可以把角度传递给 Marker,Google Map Marker 中的 setRotation 方法可以让 Marker 进行旋转。

 gUserMarker.setRotation(roteteDegree);

好了,真机运行看看,emmm... Marker 的旋转十分奇怪啊,怎么以边界为原点进行旋转,而不是以中心点旋转,这就像一个圆形的门牌,最上面边缘的钉子掉了一样。这时再回顾看看 Marker 类中 Anchor,setAnchor 可以设定它的值,文档地址:

https://developers.google.com/android/reference/com/google/android/gms/maps/model/Marker?hl=zh-cn#setAnchor(float,%20float)

官方画了一个直击灵魂的图表示这个属性值是什么作用:

所以,给它设定 0.5,0.5 就圆点居中了,不信阔以试一试~

© 著作权归作者所有

范特彪西
粉丝 15
博文 4
码字总数 3717
作品 0
杭州
程序员
私信 提问
加载中

评论(0)

Android/Unity混合开发屏幕旋转问题以及8.0透明页面兼容

前段时间做个项目是 Android 集成Unity的,混合开发。测试没问题,发布出去了。 但是突然收到消息说崩溃了。没办法,看呗。然后查看平板设备,发现是8.0系统问题 它不让透明的页面申请屏幕变...

芝麻粒儿
2019/12/26
0
0
Android操作系统11种传感器介绍

在Android2.3 gingerbread系统中,google提供了11种传感器供应用层使用。 我们依次看看这十一种传感器 1 加速度传感器 加速度传感器又叫G-sensor,返回x、y、z三轴的加速度数值。 该数值包含...

无鸯
2011/09/25
4.9W
21
【设计体验之旅——jQuery就是牛!】第一部 35个高级jQuery插件使用体验持续更新(三)

gmap(google地图应用插件) 【下载地址】--------》Download 【应用范围】 google地图的简单应用,地点表示,图片显示,pup显示等等; 【使用体验】 首先,我们根据作者的提示去Google申请一个...

游戏人间Linux
2012/02/05
128
0
MyEclipse移动Web模拟器指南(二)

在移动Web模拟器指南(一)一文中,小编为大家介绍了如何启动Web模拟器、如何设置模拟器配置以及如何设置操作系统版本等内容。接下来,我们将介绍有关MyEclipse移动Web模拟器的更多内容,欢迎...

Miss_Hello_World
2015/06/18
165
0
前端二三维一体化地图引擎 Maptalks 发布 v0.38.1 版

maptalks是国人开发的一款前端javascript二三维一体化地图引擎,可以同时渲染二维和三维图形。maptalks定位是一款用户驱动型开源产品,如果你想打造自己心目中理想的地图引擎,欢迎加入开发或...

fuzhenn
2018/02/02
3.5K
7

没有更多内容

加载失败,请刷新页面

加载更多

随机梯度下降

本文首发自公众号:RAIS,点击直接关注。 前言 本系列文章为 《Deep Learning》 读书笔记,可以参看原书一起阅读,效果更佳。 梯度下降算法 在机器学习或深度学习中,模型的训练在一般都会被...

我是任玉琢
15分钟前
15
0
Navicat for MySQL下载安装和破解教程

1.进https://navicatformysql.en.softonic.com/官网 2.第二步 3.第三步等待下载完成 4.第四步双击 二,破解 1.链接:https://pan.baidu.com/s/1CjV7JVzi7pVqlxKMQ3S8wg 密码:hk59 下载后解压...

osc_zgt6zhsy
15分钟前
9
0
Modbus协议和应用开发介绍

因业务需要了解Modbus协议的使用,因此对Modbus的协议,以及相应的C#处理应用进行了解,针对协议的几种方式(RTU、ASCII、TCPIP)进行了封装,以及对Modbus的各种功能码的特点进行了详细的了...

osc_9yulefcq
17分钟前
9
0
golang设置代理

golang.org打不开,设置一下代理. 打开 MODULE: set GO111MODULE=on //windowsexport GO111MODULE=on //linux 设置代理: // set GOPROXY=https://proxy.golang.orgset GOPROXY=https://mi......

漫步海边小路
17分钟前
11
0
01.ElasticSearch (RestFul Api 基本操作)

创建操作 创建索引(库) #number_of_shards 设置分片#number_of_replicas 设置备份PUT 索引{ "settings": { "number_of_shards": 1, "number_of_replicas": 0 }} 创建映射类......

Pole丶逐
18分钟前
7
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部