zoukankan      html  css  js  c++  java
  • 【百度地图学习-一】初始化以及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里面弄反了,所以可能会导致地图显示空白,只有小格子。这个问题纠结了好久。


      
       
     
  • 相关阅读:
    17款最佳的代码审查工具
    最全的开发人员在线速查手册
    Expression Blend 4 激活码
    TimeSpan XML序列化
    如何使用策略模式
    .Net 笔记(二) 泛型和集合
    VS2010 旗舰版序列号
    WPF ArrangeOverride与MeasureOverride
    实现zbar扫描二维码的时候就把照片存储出来的办法
    用Jpush极光推送实现抓取特定某个用户Log到七牛云服务器
  • 原文地址:https://www.cnblogs.com/dennisac/p/3496823.html
Copyright © 2011-2022 走看看