介绍
可能标题不能够表达清楚,我大概说一下,我要实现的功能就是当用户旋转地图后再次点击定位,地图旋转至定位蓝点方向,用过高德地图的都知道他的定位按钮有两种模式,一种是重置方向,一种是朝向小蓝点方向。这里GIF演示我就不放了,直接上代码把
使用
因为高德地图API没有提供相应的方法,所以我就去百度搜了下,还真有人搞定了,利用反射实现的
代码我只放关键的部分就行了,不然代码太多了
// 定义一个变量,代表采用那种方式
private var locationMode = 0
... ...
// 在定位按钮的方法中加入判断
btnLocation.setOnClickListener {
val cameraPosition = aMap!!.cameraPosition
if (locationMode == 0) {
//启动定位
startLocation()
// 重置地图方向
aMap!!.animateCamera(
CameraUpdateFactory
.newCameraPosition(
CameraPosition(
cameraPosition.target,
cameraPosition.zoom,
cameraPosition.tilt,
0f
)
)
)
locationMode = 1
} else {
val a = ReflectUtil.getSpecifiedFieldObject(aMap, "a")
val ac = ReflectUtil.getSpecifiedFieldObject(a, "ac")
val f = ReflectUtil.getSpecifiedFieldObject(ac, "f")
//小蓝点对象
val marker = f as? Marker
//小蓝点的旋转角度
val rotation = (marker?.rotateAngle ?: 0f)
// 旋转地图至小蓝点方向
aMap!!.animateCamera(
CameraUpdateFactory
.newCameraPosition(
CameraPosition(
cameraPosition.target,
cameraPosition.zoom,
cameraPosition.tilt,
-rotation
)
)
)
locationMode = 0
}
public class ReflectUtil {
/**
* 反射获取指定字段的值(是一个对象)
*/
public static Object getSpecifiedFieldObject(Object obj, String fieldName) {
if (obj == null) return null;
Class<?> clazz = obj.getClass();
Object object = null;
try {
Field field = clazz.getDeclaredField(fieldName);
field.setAccessible(true);
object = field.get(obj);
} catch (Exception e) {
e.printStackTrace();
}
return object;
}
}
Over
网友评论