Android学习笔记之使用百度地图实现地图控制

PS:吾之荣耀,离别已久.网络

 

学习内容:ide

1.实现地图控制.函数

2.百度地图开发的一些细节布局

 

  1.实现地图控制:学习

  这一篇主要写在百度地图上添加一些其余控制.上一篇书写了覆盖物的添加,地理编码和反地理编码,还有如何实现定位.那么这一篇主要是说一下实现地图控制,以及一些细节.因为我也是看着牛人的博客学习的.所以可能有点杂乱无章.动画

  MapView.ui

  地图控制主要是经过使用MapView类中的一些相关函数来实现地图控制.这里的实现地图控制主要是控制Map上的View视图.在Map上添加或者移除一个View.控制缩放控件和比例尺控件,设置缩放控件和比例尺的相关位置.默认的状况下,MapView是自带缩放控件和比例尺的.this

//不显示缩放按钮和比例尺
mapView.showZoomControls(false);
mapView.showScaleControl(false);

  设置缩放控件和比例尺的相关位置编码

mapView.setZoomControlsPosition(new Point(150,60));
mapView.setScaleControlsPosition(new Point(150,60));

  这里还须要说明一点就是关于MapView的生命周期问题.MapView的生命周期和当前的Activity是紧密关联的.所以咱们须要在Activity当中去设置MapView的生命周期.同时在使用MapView控件的时候必需要使用SDKInitializer.initialize(Context)函数去提供全局的Context信息.spa

  MapView的内部函数其实并非很是的多.也就这么几种View的相应控制,以及生命周期函数的设定.例举一下内部的相关函数.

mapView.addView(View child,LayoutParams params); //在地图上添加子View.并设置相关的参数.
mapView.onDestory(); //生命周期函数,当Activity被销毁的时候.地图控件也被销毁.
mapView.onPause(); //生命周期函数
mapView.onResume(); //生命周期函数
mapView.remove(View view);  //移除MapView上的View视图.
mapView.onLayout(boolean changed,int l,int t,int r,int b); //我的认为是指定mapView的布局.官方API没给出解释.

  BaiduMap的监听事件控制

  在地图上咱们能够设置相关的监听函数.监听的接口以下:

  setOnMapClickListener(OnMapClickListener)  点击函数.

bdMap.setOnMapClickListener(new OnMapClickListener() {
            
            @Override
            public boolean onMapPoiClick(MapPoi arg0) {
                // TODO Auto-generated method stub
                return false;
            }
            
            @Override
            public void onMapClick(LatLng arg0) {
                // TODO Auto-generated method stub
                //设置地图中心点
                msu = msuFactory.newLatLng(arg0);
                bdMap.animateMapStatus(msu);
                Toast.makeText(getApplicationContext(), "地图中心点移动到"+arg0.toString(), Toast.LENGTH_SHORT).show();
            }
        });

  setOnMapDoubleClickListener(OnMapClickListener) 双击函数.

    bdMap.setOnMapDoubleClickListener(new OnMapDoubleClickListener() {
            @Override
            public void onMapDoubleClick(LatLng arg0) {

            }
    });

  setOnMapLongClickListener(OnMapClickListener) 长按函数.

 setOnMapStatusChangerListener(OnMapStatusChangerListener) 地图状态变化的监听函数.

 这两个就不列举了.主要是BaiduMap的两个

 void animateMapStatus(MapStatusUpdate status)

 void animateMapStatus(MapStatusUpdate update int duration)

 这两个函数表示当地图状态发生变化的时候.以动画的形式进行改变.第一个函数没有指定动画的时间.默认时间为300毫秒.第二个则是指定时间的动画.传递的参数则是MapStatusUpdate参数.不难看出这个类的含义就是当地图状态发生改变时的更新状态.须要将这个改变的状态封装成MapStatusUpdate对象.而后经过使用animateMapStatus()函数去完成这个变化. MapStatusUpdate是一个静态类.所以实例化对象的方式采用MapStatusUpdateFactory工厂来完成对象的实例化. 这个类的内部函数仍是很是的多的.咱们能够经过使用内部的函数构造出各类各样的MapStatusUpdate对象..

  仍是传一张图吧.手打真伤不起..

 缩小地图(缩小一个级别)

msu = msuFactory.zoomOut();
bdMap.animateMapStatus(msu);

 放大地图(放大一个级别)

msu = msuFactory.zoomIn();
bdMap.animateMapStatus(msu);

 设置地图中心点

msu = msuFactory.newLatLng(arg0);
bdMap.animateMapStatus(msu);

 其余函数就不一一列举了.咱们能够看到这个类的内部存在一个newMapStatus(MapStatus status)函数.这个函数是将MapStatus封装成MapStatusUpdate,而后经过调用animateMapStatus(msu);一样能够完成一个地图的状态更新.那么就不得不说一下MapStatus了.这个类的相关函数以下:

 这个类能够设置地图的旋转和俯视效果.设置了相关效果以后.将MapStatus封装成MapStatusUpdate对象.就能够实现旋转和俯视效果的地图状态更新了.实现方式:

 设置了一个旋转效果的地图状态.

mapStatus = new MapStatus.Builder(bdMap.getMapStatus()).rotate(rotateAngle +=30).build();
msu = msuFactory.newMapStatus(mapStatus);
bdMap.animateMapStatus(msu);

 设置了一个俯视效果的地图状态.

mapStatus = new MapStatus.Builder(bdMap.getMapStatus()).overlook(overlookAngle -=10).build();
msu = msuFactory.newMapStatus(mapStatus);
bdMap.animateMapStatus(msu);

 这样经过定义MapStatus对象也可以实现一些地图状态的控制.最后再说一个关于地图截图的问题.我的感受有点不是很是的使用了.现现在的手机均可以经过快捷键去直接实现截屏功能.这个功能就有点不怎么适用了.既然说了,那么仍是要简单的说一下.

 实现地图的截图须要使用如下函数.

 snapshot()函数..SnapshotReadyCallback()为其回调接口.截屏以后咱们还能够对截取到的图片进行数据的保存.

bdMap.snapshot(new SnapshotReadyCallback() {
                
                @Override
                public void onSnapshotReady(Bitmap bitmap) {
                    // TODO Auto-generated method stub
                    File file = new File("/mnt/sdcard/test.png");
                    FileOutputStream fos = null;
                    try {
                        fos = new FileOutputStream(file);
                        if(bitmap.compress(Bitmap.CompressFormat.JPEG, 100, fos)){
                            fos.flush();
                            fos.close();
                        }
                        Toast.makeText(MapControllActivity.this,"屏幕截图成功,图片存在: " + file.toString(),Toast.LENGTH_SHORT).show();

                    } catch (Exception e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                }
            });

 2.百度地图开发的一些其余细节.

 也算是对本身昨天写的东西进行一些相关的补充.上一篇博客写了关于定位的功能.也就是使用LocationClient去实现客户端定位.同时也说了一下内部的监听函数.实现定位首先须要初始化对象.而后注册定位监听.而后设置相关的定位参数.最后开始定位就能够了.

 只是忘记了说另外一个监听函数:

 NotifyListener()

 注册位置提醒监听.位置提醒通常表示的是咱们设置了某一位置,当咱们快要到达这个位置的时候,开启位置监听.能够经过振动的方式来提示咱们已经到达了这个位置的附近.所以这个监听的注册是否必要取决于咱们的需求.

 而且设置了这些相关监听的同时,咱们须要在最后去释放这些监听.

 释放的方式:重写onDestory函数去释放.

    @Override  
        protected void onDestroy() {  
            super.onDestroy();  
            mapview.onDestroy();  
            locationClient.unRegisterLocationListener(locationListener);  
            //取消位置提醒  
            locationClient.removeNotifyEvent(notifyListener);  
            locationClient.stop();  
        }  
class MyNotifyListener extends BDNotifyListener {
        @Override
        public void onNotify(BDLocation bdLocation, float distance) {
            super.onNotify(bdLocation, distance);
            mVibrator.vibrate(1000);//振动提醒已到设定位置附近
            Toast.makeText(LocationActivity.this, "震动提醒", Toast.LENGTH_SHORT).show();
        }
    }

 LocationOptions的相关补充.

 LocationOptions表示的是定位参数.咱们在定位的时候能够经过设置相关的参数去完善定位.

 还要说一下这个定位模式的问题:

 1. 高精度定位模式:同时使用网络定位和GPS定位,优先返回最高精度的定位结果。

 

 2. 低功耗定位模式:不使用GPS,只使用网络定位(WiFi和基站)。

 

 3. 仅用设备定位模式: 不适用网络定位,只使用GPS进行定位。可是此模式下不支持室内环境的定位。

 LocationOptions的一些相关函数:

LocationClientOption locOption = new LocationClientOption();
locOption.setLocationMode(LocationMode.Hight_Accuracy);// 设置定位模式
locOption.setCoorType("bd09ll");// 设置定位结果类型
locOption.setScanSpan(5000);// 设置发起定位请求的间隔时间,ms
locOption.setIsNeedAddress(true);// 返回的定位结果包含地址信息
locOption.setNeedDeviceDirect(true);// 设置返回结果包含手机的方向

 还有关于定位是否可以成功.仍是发生了失败的缘由,咱们能够经过使用getLocType()这个方法获取到,返回的值为int类型.

  经过这个值咱们就能够判断咱们的定位是否成功,而且若是发生了错误,咱们能够经过捕捉这个int数据来判断咱们在什么位置上发生了错误.经过这个错误信息咱们就能够去调试.仍是比较方便的.

 整体也就这么多了.最后再放上一个代码.方便你们去研究.

 http://files.cnblogs.com/files/RGogoing/Map_1.rar

相关文章
相关标签/搜索