现在的位置: 首页 > 综合 > 正文

【百度地图学习-一】初始化以及TextOverlay

2018年09月13日 ⁄ 综合 ⁄ 共 3594字 ⁄ 字号 评论关闭

一、百度地图的初始化

  主要用到三个类:

  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里面弄反了,所以可能会导致地图显示空白,只有小格子。这个问题纠结了好久。


  
   
 

 

 

抱歉!评论已关闭.