高德的API文档很简洁。简洁有几种好处,当然是在能把问题秒速清楚的前提下才可以称为是好处。可问题就发生在没有说清楚却还保持简洁的个性,这简直就是在暴虐。

Marker对于常规操作还是很有用的,在 com.amap.api.maps2d.model中,难得的见到超过两行的介绍(我指在文档中两行),所以可见官方还是蛮重视这个类的:

Marker 是在地图上的一个点绘制图标。这个图标和屏幕朝向一致,和地图朝向无关。一个marker有如下属性: 锚点:图标摆放在地图上的基准点。默认情况下,锚点是从图片下沿的中间处。 位置:marker是通过经纬度的值来标注在地图上的。 标题:当点击Marker 显示在信息窗口的文字,随时可以更改。 片段:除了标题外其他的文字,随时可以更改。 图标:Marker 显示的图标。如果未设置图标,API 将使用默认的图标,高德为默认图标提供了10 种颜色备选。默认情况下,Marker 是可见的。你们随时更改marker 的可见性。

 说一说我的理解吧。

初始化一个Marker,一般是通过AMap的addMarker来获得添加的对象,也可以使用new的方式,但至今还没有发现其最后如何与AMap关联起来,说白了就不知道怎么用。初始化时,无论是在new Marker或者使用addMarker时都需要传入一个 MarkerOptions 对象,而这个呢,默认的构造函数可以生成默认的式样。如果想要自定义icon,则需要对MarkerOptions对象的icon方法传入 BitmapDescriptor 对象即可。但是这个 BitmapDescriptor 对象则需要通过 BitmapDescriptorFactory 来获得。正如官方文档所说的:

在高德地图API 里,如果需要将一张图片绘制为Marker,需要用这个类把图片包装成对象,可以通过BitmapDescriptorFactory 获得一个BitmapDescriptor 对象。

我可以从多个资源来获取新的自定义icon,比如想要的图片资源,比如默认的几个图标。

private MarkerOptions init_markeroptions(LatLng pos){
    if(pos==null)
        pos=defalut_latlng;
    MarkerOptions mo=new MarkerOptions();
    mo.icon(BitmapDescriptorFactory.fromResource(R.drawable.plane));
    mo.anchor(0.5f, 0.5f);
    mo.position(pos);
    return mo;
}
public class PointStatus {
    public static float Wait=BitmapDescriptorFactory.HUE_RED;
    public static float Dealing=BitmapDescriptorFactory.HUE_YELLOW;
    public static float Done= BitmapDescriptorFactory.HUE_GREEN;
    public static float Side=BitmapDescriptorFactory.HUE_VIOLET;
}
public int main(){
    Marker marker=new Marker(init_markeroptions(null));
    marker.setIcon(BitmapDescriptorFactory.defaultMarker(PointStatus.Wait)
    marker.setPosition(defalut_latlng);
}

对于一个marker的定位,可以通过marker.setPosition(LatLng),也可以通过定义时传入的 MarkerOptions 对象mo.position(LatLng)来实现(上面例子都有)。

坑一:Marker的旋转。

大多数情况下是不需要旋转Marker的icon的,但是我涉及的就需要了。悲催的是文档中关于旋转介绍就是那么简洁:

android高德地图SDK路线显示箭头_锚点

首先抛去锚点的问题,就说这个旋转。它实际上的表达方式是北方向(正上方)为0度,逆时针旋转方向为正,好了,好了,信任的小船翻了。因为我接触的都是顺时针啊,于是乎当图标旋转时,加上下面的问题,我看到icon在做莫名其妙的运动,和三体世界的人看那个三个太阳一样一样。

坑二:Marker的锚点

锚点就是作为的icon在地图上的基准点,对应固定的一个坐标在icon的位置上。这份文档倒是全面,可惜是我没注意过。于是随意给了个0,0点,我的错我的错,这个问题很轻易就解决了。如果要使icon的中心放在指定位置,就老老实实的输入0.5,0.5吧。

android高德地图SDK路线显示箭头_ico_02

路漫漫其修远兮。吾将上下而求码。