【百度地图学习-一】初始化以及TextOverlay
一、百度地图的初始化
主要用到三个类:
1、BMapManager:使用地图sdk前需先初始化BMapManager.BMapManager是全局的,可为多个MapView共用,它需要地图模块创建前创建, 并在地图地图模块销毁后销毁,只要还有地图模块在使用,BMapManager就不应该销毁。它属于地图引擎管理类。
最好在用一个自定义的继承于Application的类来依附Activity的生命周期,它有四个常用方法:
public boolean start() //开启百度地图API
public boolean stop() //终止百度地图API,调用此函数后,不会再发生回调
public void destroy() //在程序退出前调用
public boolean init(java.lang.String strKey,MKGeneralListener listener)//其中的参数:
strKey
- 申请的授权验证码,
listener
- 注册回调事件
package org.hjw.hellobaidu; import com.baidu.mapapi.BMapManager; import com.baidu.mapapi.MKGeneralListener; import com.baidu.mapapi.map.MKEvent; import android.app.Application; import android.content.Context; import android.widget.Toast; public class MapApplication extends Application { /** * 使用地图sdk前需先初始化BMapManager. * BMapManager是全局的,可为多个MapView共用,它需要地图模块创建前创建, * 并在地图地图模块销毁后销毁,只要还有地图模块在使用,BMapManager就不应该销毁 */ private static MapApplication mInstance = null; public boolean m_keyRight = true; BMapManager bMapManager = null;//地图管理引擎 public static final String mapKey = "sEtVxB4uwzTRlchScMcELXu8"; @Override public void onCreate() { super.onCreate(); mInstance = this; initMapManager(this); } private void initMapManager(Context context) { if(bMapManager==null){ bMapManager = new BMapManager(context); } if(!bMapManager.init(mapKey, new GeneralListner())){ Toast.makeText(MapApplication.getInstance().getApplicationContext(), "BMapManager 初始化错误!", Toast.LENGTH_LONG).show(); } } public static MapApplication getInstance(){ return mInstance; } static class GeneralListner implements MKGeneralListener{ @Override public void onGetNetworkState(int arg0) { if(arg0 ==MKEvent.ERROR_NETWORK_CONNECT){ Toast.makeText(MapApplication.getInstance().getApplicationContext(), "网络出错啦!", Toast.LENGTH_LONG).show(); }else if(arg0 ==MKEvent.ERROR_NETWORK_DATA){ Toast.makeText(MapApplication.getInstance().getApplicationContext(), "请输入正确的检索条件!", Toast.LENGTH_LONG).show(); } } @Override public void onGetPermissionState(int iError) { if(iError!=0){ Toast.makeText(MapApplication.getInstance().getApplicationContext(), "请输入正确Mapkey!", Toast.LENGTH_LONG).show(); MapApplication.getInstance().m_keyRight=false; }else{ Toast.makeText(MapApplication.getInstance().getApplicationContext(), "MapKey认证成功!", Toast.LENGTH_LONG).show(); MapApplication.getInstance().m_keyRight=true; } } } }
2、MapView类:它直接继承于ViewGroup,显示地图的View,一个显示地图的视图,当被焦点选中时,它能捕获按键事件和触摸手势去平移和缩放地图。
MapView的生命周期与Activity同步,当activity挂起时需调用MapView.onPause()。必须在setContentview后才可以使用mapView,同时也包含了对覆盖物的管理等。
3、MapController类:它是地图控制器,通过mapView对象获得,同时也取得了对mapView的各种操作权限,包括缩放大小,显示不同类型的图等等。
4、MKMapViewListener接口:地图显示事件监听器。 该接口监听地图显示事件,用户需要实现该接口以处理相应事件,包含下面四个方法。
{
void onClickMapPoi(MapPoi mapPoiInfo)
点击到地图可点标注时会回调此接口
void onGetCurrentMap(Bitmap b)
截图成功后会回调此接口
void onMapAnimationFinish()
动画结束时会回调此消息
void onMapLoadFinish()
在图加载完成回调
}
void onMapMoveFinish()
地图移动完成时会回调此接口
重写方法时,必须通过mapView对象注册监听器。
mapView.regMapViewListener(MapApplication.getInstance().bMapManager,mkMapViewListener);// 用户注册地图监听器
二、文字覆盖物的实现
分为以下几步:
1. 用TextItem准备文字数据
2. 创建TextOverlay,调用 addText(TextItem) 接口添加文字.
3. 调用MapView.getOverlays().add()方法添加overlay到mapview中。
4. 调用MapView.refresh() 使Overlay生效。
实现代码:
TextItem textItem = new TextItem(); textItem.fontColor = textColor1; //textItem.bgColor = textColor1; textItem.fontSize = 20; textItem.text = "这里是中心广场"; textItem.pt = mapView.getMapCenter(); TextOverlay textOverlay = new TextOverlay(mapView); textOverlay.addText(textItem); mapView.getOverlays().add(textOverlay); mapView.refresh();
其中对于TextItem类中的fontColor和fontSize是必须赋值的,否则地图上面会看不到的。
下面是效果图:
那个很小的”这里是中心广场”就是覆盖物,因此需适量调整字体大小。其中TextItem中的fontSize和fontColor是必须要设置的,这是在百度sdk2.0之后才需要这样,2.0之前都是直接继承基类Overlay重写Draw方法。
还有一点就是官方提供的Demo里面,GeoPoint的初始化,参数分别为纬度和经度,Demo里面弄反了,所以可能会导致地图显示空白,只有小格子。这个问题纠结了好久。