转载请注明出处:
前两篇关于百度地图的blog写的是,一些基本图层的展示和覆盖物的添加+地理编码和反地理编码。
接下来,这篇blog主要说一些关于地图控制方面的内容和定位功能。
百度地图提供的关于地图的操作主要有:单击、双击、长按、缩放、旋转、俯视等。
地图控制
我们现在已经知道,想要显示一个地图,只需要在xml文件中添加一个MapView控件即可,,但是想要对其进行一些控制,就需要通过这个控件返回一个BaiduMap对象。
从API中先看一下MapView的方法:
对于MapView这个类,官方解释是一个显示地图的视图,负责从服务器端获取地图数据,并且会捕捉到屏幕触控手势事件。使用这个类必须按照它的生命周期进行操作,从上图可以看到,它包括一些类似于activity生命周期的方法:onResume()、onPause()、onDestory()。所以我们需要在activity的各个生命周期中,把MapView的各个生命周期函数添加进去。
在使用地图控件之前必须调用SDKInitializer.initialize(Context)函数用以提供全局Context信息。
默认情况下,地图显示的时候会带着原生的缩放控件:
。还有比例尺控件:
。
通过showZoomControls(boolean show)和showScaleControl(boolean show)这两个方法可以设置显示或者不显示两个控件。还可以通过设置setxxxPosition(Point p)方法来设置控件的位置。
mapView.showZoomControls(false);// 不显示默认的缩放控件mapView.showScaleControl(false);// 不显示默认比例尺控件 要想实现地图的一些控制,就需要使用到BaiduMap,这个类是专门用来操作地图控件的。
上面的四个接口就是用来对地图添加相应的事件的。我们主要看一下下面的两个方法,它们都是以动画的方式更新地图状态。不同的是一个可以指定时长,另一个有默认的动画耗时。
参数MapStatusUpdate描述的是地图状态将要发生的变化。也就是说,要想改变地图的某些状态,需要构造出一个MapStatusUpdate对象,然后使用animateMapStatus()方法来更新地图状态。但是并没有在API中找到它的相关的构造方法。但是在com.baidu.mapapi.map包下面找到了对应的"工厂类"。
打开MapStatusUpdateFactory可以看到很多静态的方法:
通过这些静态的方法能够构造出各种类型的MapStatusUpdate对象。
zoomIn()和zoomOut()分别是放大和缩小地图,分别是在当前基础上增加或较少1个级别。zoomTo()可以自己设置某一个缩放级别。百度地图将地图的级别定义为【3~19】。
放大:msu = msuFactory.zoomIn();bdMap.animateMapStatus(msu);缩小:msu = msuFactory.zoomOut();bdMap.animateMapStatus(msu);设置地图中心点:msu = msuFactory.newLatLng(arg0);bdMap.animateMapStatus(msu); 其他的方法就不一一叙述了。 关于地图控制状态的还有两个类:MapStatus和MapStatus.Builder。Builder是MapStatus的一个内部类,用于构造它,我们在API中可以看到MapStatus中是没有构造函数的。
使用这两个类可以对地图进行旋转、俯视、设置中心点、设置缩放级别等操作。通过这些方法构造出MapStatus方法之后,怎么让BaiduMap调用它呢?
查阅BaiduMap的所有方法之后也没有找到参数是MapStatus的方法。那么,猜想可能是通过把MapStatus转换成一个其他的对象,然后在由BaiduMap调用。而BaiduMap只有animateMapStatus()方法来更新地图状态。所以很定是MapStatus—>MapStatusUpdate。在MSU的工厂类中有这样一个方法:newMapStatus(MapStatus mapStatus)。OK,通过这个方法,可以把构造的MapStatus对象转成MapStatusUpdate,然后在通过animateMapStatus()调用就行了。
旋转:mapStatus = new MapStatus.Builder(bdMap.getMapStatus()).rotate(rotateAngle += 30).build();msu = msuFactory.newMapStatus(mapStatus);bdMap.animateMapStatus(msu);俯视(-45°~0):mapStatus = new MapStatus.Builder(bdMap.getMapStatus()).overlook(overlookAngle -= 10).build();msu = msuFactory.newMapStatus(mapStatus);bdMap.animateMapStatus(msu); 这里,lz有一个疑问:MapStaus.Builder中有一个设置地图中心点的方法:
,在MapStatusUpdateFactory中也有一个设置中心点的方法:
。连个都是设置中心点,不知道区别是什么?希望知道的给我留个言,告知一下!!谢谢!~~截屏:
在BaiduMap中有一个截屏的回调接口和一个截图的请求方法:
你挤进地铁时,西藏的山鹰一直盘旋云端,