高德地图——点击定位旋转至蓝点方向

2020-04-06  本文已影响0人  禄眠

介绍

可能标题不能够表达清楚,我大概说一下,我要实现的功能就是当用户旋转地图后再次点击定位,地图旋转至定位蓝点方向,用过高德地图的都知道他的定位按钮有两种模式,一种是重置方向,一种是朝向小蓝点方向。这里GIF演示我就不放了,直接上代码把

使用

因为高德地图API没有提供相应的方法,所以我就去百度搜了下,还真有人搞定了,利用反射实现的

Android 高德地图 获取定位蓝点旋转角度 获取Marker对象

代码我只放关键的部分就行了,不然代码太多了

// 定义一个变量,代表采用那种方式
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

上一篇下一篇

猜你喜欢

热点阅读