高德的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的,但是我涉及的就需要了。悲催的是文档中关于旋转介绍就是那么简洁:
首先抛去锚点的问题,就说这个旋转。它实际上的表达方式是北方向(正上方)为0度,逆时针旋转方向为正,好了,好了,信任的小船翻了。因为我接触的都是顺时针啊,于是乎当图标旋转时,加上下面的问题,我看到icon在做莫名其妙的运动,和三体世界的人看那个三个太阳一样一样。
坑二:Marker的锚点
锚点就是作为的icon在地图上的基准点,对应固定的一个坐标在icon的位置上。这份文档倒是全面,可惜是我没注意过。于是随意给了个0,0点,我的错我的错,这个问题很轻易就解决了。如果要使icon的中心放在指定位置,就老老实实的输入0.5,0.5吧。
路漫漫其修远兮。吾将上下而求码。