mapview是view的一个子类,用于在android view中放置地图。mapview的使用方法与android提供的其他view一样。
注意:在sdk各功能组件使用之前都需要调用“sdkinitializer.initialize(getapplicationcontext())”,因此建议在应用创建时初始化sdk引用的context为全局变量。
新建一个自定义的application,在其oncreate方法中完成sdk的初始化。示例代码如下:
public class demoapplication extends application { @override public void oncreate() { super.oncreate(); //在使用sdk各组件之前初始化context信息,传入applicationcontext sdkinitializer.initialize(this); //自4.3.0起,百度地图sdk所有接口均支持百度坐标和国测局坐标,用此方法设置您使用的坐标类型. //包括bd09ll和gcj02两种坐标,默认是bd09ll坐标。 sdkinitializer.setcoordtype(coordtype.bd09ll); } }
在androidmanifest.xml文件中声明该application
注意:在项目中使用地图的时候要特别注意合理地管理地图生命周期,这非常重要。
以下示例代码简述对地图生命周期的管理:
public class mainactivity extends activity { private mapview mmapview = null; @override protected void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); setcontentview(r.layout.activity_main); //获取地图控件引用 mmapview = (mapview) findviewbyid(r.id.bmapview); } @override protected void onresume() { super.onresume(); //在activity执行onresume时执行mmapview. onresume (),实现地图生命周期管理 mmapview.onresume(); } @override protected void onpause() { super.onpause(); //在activity执行onpause时执行mmapview. onpause (),实现地图生命周期管理 mmapview.onpause(); } @override protected void ondestroy() { super.ondestroy(); //在activity执行ondestroy时执行mmapview.ondestroy(),实现地图生命周期管理 mmapview.ondestroy(); } }
完成以上工作即可在您的应用中显示地图:
百度地图sdk支持不用通过layout文件中添加mapview控件,直接在java代码中添加mapview的方式来展示地图,示例如下:
mapview mapview = new mapview(this);
setcontentview(mapview);
另外,在java代码中添加mapview的方式支持通过baidumapoptions对象根据需求构造包含特定地图状态类型和控件显示状态的mapview对象。示例如下:
baidumapoptions options = new baidumapoptions();
//设置地图模式为卫星地图 options.maptype(baidumap.map_type_satellite);
mapview mapview = new mapview(this, options);
setcontentview(mapview);
设置空白地图背景色
注:只有地图类型设置为空白地图时,地图背景色才会设置生效
// 设置空白地图 mbaidumap.setmaptype(baidumap.map_type_none); mbaidumap.setmapbackgroundcolor(color.argb(255, 255, 0, 0)); // 设置地图背景色
baidumapoptions类支持设置的状态如下:
状态 | 含义 |
---|---|
mapstatus | 地图状态 |
compassenable | 是否开启指南针,默认开启 |
maptype | 地图模式,默认为普通地图 |
rotategesturesenabled | 是否允许地图旋转手势,默认允许 |
scrollgesturesenabled | 是否允许拖拽手势,默认允许 |
overlookinggesturesenabled | 是否允许俯视图手势,默认允许 |
zoomcontrolsenabled | 是否显示缩放按钮控件,默认允许 |
zoomcontrolsposition | 设置缩放控件位置 |
zoomgesturesenabled | 是否允许缩放手势,默认允许 |
scalecontrolenabled | 是否显示比例尺控件,默认显示 |
scalecontrolposition | 设置比例尺控件位置 |
logoposition | 设置logo位置 |
百度地图sdk支持21级的地图显示,如下为地图类型和图层支持层级说明
地图类型或图层 | 显示层级 |
---|---|
2d地图 | 4-21 |
3d地图 | 19-21 |
卫星图 | 4-20 |
路况交通图 | 11-21 |
百度城市热力图 | 11-21 |
室内图 | 17-22 |
下表为显示层级与比例尺的对应关系
显示层级 | 比例尺/米 |
---|---|
4 | 1000000 |
5 | 500000 |
6 | 200000 |
7 | 100000 |
8 | 50000 |
9 | 25000 |
10 | 20000 |
11 | 10000 |
12 | 5000 |
13 | 2000 |
14 | 1000 |
15 | 500 |
16 | 200 |
17 | 100 |
18 | 50 |
19 | 20 |
20 | 10 |
21 | 5 |
可以通过如下代码设置地图的缩放级别:
mapstatus.builder builder = new mapstatus.builder(); builder.zoom(18.0f); mbaidumap.setmapstatus(mapstatusupdatefactory.newmapstatus(builder.build()));
地图sdk底层运用两种glsurfaceview和textureview两种opengl es组件构建地图。下面简要介绍。
此处示例代码简要介绍supportmapfragment使用。
@override protected void oncreate(@nullable bundle savedinstancestate) { super.oncreate(savedinstancestate); setcontentview(r.layout.activity_fragment); manager = getsupportfragmentmanager(); //获取到supportmapfragment实例 msupportmapfragment = supportmapfragment.newinstance(mapoptions); //将fragment添加至activity manager.begintransaction().add(r.id.map_container, mapfragment).commit(); }
另外,您也可以使用replace的方法替换已有的fragment。
manager.begintransaction().replace(r.id.map_container, mapfragment).commit();
开发者可以在一个页面中建立多个地图对象,并且针对这些对象分别操作且不会产生相互干扰。 示例代码:在布局文件中添加多个supportmapfragment
在activity中管理地图容器
@override protected void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); setcontentview(r.layout.activity_multi_map_demo); latlng geo_beijing = new latlng(39.945, 116.404); latlng geo_shanghai = new latlng(31.227, 121.481); //北京为地图中心,logo在左上角 mapstatusupdate status1 = mapstatusupdatefactory.newlatlng(geo_beijing); supportmapfragment map1 = (supportmapfragment) (getsupportfragmentmanager() .findfragmentbyid(r.id.map1)); map1.getbaidumap().setmapstatus(status1); map1.getmapview().setlogoposition(logoposition.logopostionlefttop); //上海为地图中心 mapstatusupdate status2 = mapstatusupdatefactory.newlatlng(geo_shanghai); supportmapfragment map2 = (supportmapfragment) (getsupportfragmentmanager() .findfragmentbyid(r.id.map2)); map2.getbaidumap().setmapstatus(status2); }效果如图: