Android 百度地图 SDK v3_3_0 (四) ---覆盖物

转载请标明出处:http://blog.csdn.net/tanzuai/article/details/43833125

本篇博客要实现的功能

先上效果图:

上面就是我们最终要实现的效果

1.首先我们来介绍下要实现的功能:

A.更改坐标的位置

B.更改坐标的图标

C.删除图标

D.坐标每隔一段时间变动一次

clear.覆盖物的清楚


2.下面我们通过实例,一一的解析上面的功能

2.1首先我们初始化要用到的变量

               /**
		 * MapView 是地图主控件
		 */
		private MapView mMapView;
		/**
		 * 百度地图
		 */
		private BaiduMap mBaiduMap;

		/**
		 * Marker表示为标记
		 */
		private Marker mMarkerA;
		private Marker mMarkerB;
		private Marker mMarkerC;
		private Marker mMarkerD;
		//private Marker mMarkerE;
		/**
		 * 信息窗
		 */
		private InfoWindow mInfoWindow;

		/**
		 *  初始化全局 bitmap 信息,不用时及时 recycle
		 */
		private BitmapDescriptor bdA;
		private BitmapDescriptor bdB;
		private BitmapDescriptor bdC;
		private BitmapDescriptor bdD;
		private BitmapDescriptor bd;
		private BitmapDescriptor bdGround;

       /**
    	 * 初始化布局控件
    	 */
		private void initOfflineLayout() {
			mMapView = (MapView) findViewById(R.id.bmapView);
    		mBaiduMap = mMapView.getMap();
    		MapStatusUpdate msu = MapStatusUpdateFactory.zoomTo(14.0f);
    		mBaiduMap.setMapStatus(msu);
		}

2.2初始化覆盖物,并生成覆盖物相应的行为,最终设置地图的状态

       /**
    	 * 初始化覆盖物
    	 */
		public void initOverlay() {
			//(LatLng表示坐标位置 第一个参数为维度,第一个参数为经度)
			LatLng llA = new LatLng(39.963175, 116.400244);
			LatLng llB = new LatLng(39.942821, 116.369199);
			LatLng llC = new LatLng(39.939723, 116.425541);
			LatLng llD = new LatLng(39.906965, 116.401394);
			//LatLng llText = new LatLng(39.86923, 116.397428);

			//这里是将图标转化为对象
			bdA = BitmapDescriptorFactory
					.fromResource(R.drawable.icon_marka);
			bdB = BitmapDescriptorFactory
					.fromResource(R.drawable.icon_markb);
			bdC = BitmapDescriptorFactory
					.fromResource(R.drawable.icon_markc);
			bdD = BitmapDescriptorFactory
					.fromResource(R.drawable.icon_markd);
			bd = BitmapDescriptorFactory
					.fromResource(R.drawable.icon_gcoding);
			bdGround = BitmapDescriptorFactory
					.fromResource(R.drawable.ground_overlay);

			//定义四种不同类型的覆盖物
			OverlayOptions ooA = new MarkerOptions().position(llA).icon(bdA)
					.zIndex(9).draggable(true);//OverlayOptions 地图覆盖物选型

			mMarkerA = (Marker) (mBaiduMap.addOverlay(ooA));//addOverlay在当前图层添加覆盖物对象
			OverlayOptions ooB = new MarkerOptions().position(llB).icon(bdB)
					.zIndex(5);
			mMarkerB = (Marker) (mBaiduMap.addOverlay(ooB));
			OverlayOptions ooC = new MarkerOptions().position(llC).icon(bdC)
					.perspective(false).anchor(0.5f, 0.5f).rotate(30).zIndex(7);
			mMarkerC = (Marker) (mBaiduMap.addOverlay(ooC));
			//将A,B,C三种坐标添加到list中
			ArrayList<BitmapDescriptor> giflist = new ArrayList<BitmapDescriptor>();
			giflist.add(bdA);
			giflist.add(bdB);
			giflist.add(bdC);
			OverlayOptions ooD = new MarkerOptions().position(llD).icons(giflist)
					.zIndex(0).period(10);//每隔10毫秒变动下标记(自v3.3.0版本起,SDK提供了给Marker增加动画的能力)
			mMarkerD = (Marker) (mBaiduMap.addOverlay(ooD));

			//构建文字Option对象,用于在地图上添加文字
//			OverlayOptions textOption = new TextOptions()
//			    .bgColor(0xAAFFFF00)
//			    .fontSize(24)
//			    .fontColor(0xFFFF00FF)
//			    .text("百度地图SDK")
//			    .rotate(-30)
//			    .position(llText);
//			//在地图上添加该文字对象并显示
//			mMarkerE = (Marker) (mBaiduMap.addOverlay(textOption));

			// add ground overlay
			LatLng southwest = new LatLng(39.92235, 116.380338);
			LatLng northeast = new LatLng(39.947246, 116.414977);
			LatLngBounds bounds = new LatLngBounds.Builder().include(northeast)
					.include(southwest).build();

			OverlayOptions ooGround = new GroundOverlayOptions()
					.positionFromBounds(bounds).image(bdGround).transparency(0.8f);
			mBaiduMap.addOverlay(ooGround);

			//生成变化地图状态
			MapStatusUpdate u = MapStatusUpdateFactory
					.newLatLng(bounds.getCenter());//newLatLng设置地图新中心点
			//设置地图状态
			mBaiduMap.setMapStatus(u);
		}

 2.3设置坐标和地图的监听事件

       /**
         * 设置坐标和地图的监听事件
         */
        private void initOverlayListener() {
        	//设置坐标点击事件
        	mBaiduMap.setOnMarkerClickListener(new OnMarkerClickListener() {
    			public boolean onMarkerClick(final Marker marker) {
    				Button button = new Button(getApplicationContext());
    				button.setBackgroundResource(R.drawable.popup);
    				OnInfoWindowClickListener listener = null;
    				if (marker == mMarkerA || marker == mMarkerD) {
    					button.setText("更改位置");
    					listener = new OnInfoWindowClickListener() {
    						public void onInfoWindowClick() {
    							LatLng ll = marker.getPosition();
    							LatLng llNew = new LatLng(ll.latitude + 0.005,
    									ll.longitude + 0.005);//改变坐标的维度和经度
    							marker.setPosition(llNew);//设置坐标的位置
    							mBaiduMap.hideInfoWindow();//隐藏消息窗
    						}
    					};
    					LatLng ll = marker.getPosition();
    					mInfoWindow = new InfoWindow(BitmapDescriptorFactory.fromView(button), ll, -47, listener);
    					mBaiduMap.showInfoWindow(mInfoWindow);//显示消息窗
    				} else if (marker == mMarkerB) {
    					button.setText("更改图标");
    					button.setOnClickListener(new OnClickListener() {
    						public void onClick(View v) {
    							marker.setIcon(bd);//改变坐标的图标
    							mBaiduMap.hideInfoWindow();//隐藏消息窗
    						}
    					});
    					LatLng ll = marker.getPosition();
    					mInfoWindow = new InfoWindow(button, ll, -47);//设置消息窗
    					mBaiduMap.showInfoWindow(mInfoWindow);//显示消息窗
    				} else if (marker == mMarkerC) {
    					button.setText("删除");
    					button.setOnClickListener(new OnClickListener() {
    						public void onClick(View v) {
    							marker.remove();//删除坐标
    							mBaiduMap.hideInfoWindow();//隐藏消息窗
    						}
    					});
    					LatLng ll = marker.getPosition();
    					mInfoWindow = new InfoWindow(button, ll, -47);//设置消息窗
    					mBaiduMap.showInfoWindow(mInfoWindow);//显示消息窗
    				}
    				return true;
    			}
    		});

        	//地图点击事件
        	mBaiduMap.setOnMapClickListener(new OnMapClickListener() {

				@Override
				public boolean onMapPoiClick(MapPoi arg0) {
					return false;
				}

				@Override
				public void onMapClick(LatLng arg0) {
					mBaiduMap.hideInfoWindow();
				}
			});
		}

2.4设置清除和重设按钮相应的事件

		/**
		 * 清除所有Overlay
		 *
		 * @param view
		 */
		public void clearOverlay(View view) {
			mBaiduMap.clear();//清除地图上的所有坐标
		}

		/**
		 * 重新添加Overlay
		 *
		 * @param view
		 */
		public void resetOverlay(View view) {
			clearOverlay(null);
			initOverlay();
		}

2.5为了节省电量,设置地图相应的生命周期(千万要记住要在onDestroy()方法里面把bitmap资源回收)

		@Override
		protected void onPause() {
			// MapView的生命周期与Activity同步,当activity挂起时需调用MapView.onPause()
			mMapView.onPause();
			super.onPause();
		}

		@Override
		protected void onResume() {
			// MapView的生命周期与Activity同步,当activity恢复时需调用MapView.onResume()
			mMapView.onResume();
			super.onResume();
		}

		@Override
		protected void onDestroy() {
			// MapView的生命周期与Activity同步,当activity销毁时需调用MapView.destroy()
			mMapView.onDestroy();
			super.onDestroy();
			// 回收 bitmap 资源
			bdA.recycle();
			bdB.recycle();
			bdC.recycle();
			bdD.recycle();
			bd.recycle();
			bdGround.recycle();
		}

好了!介绍完毕!是不是觉得很简单!

下面为本篇博客的源码下载地址:

源码下载地址

时间: 2024-10-20 01:32:41

Android 百度地图 SDK v3_3_0 (四) ---覆盖物的相关文章

Android 百度地图 SDK v3_3_0 (三) ---离线地图

转发请标明出处:http://blog.csdn.net/tanzuai/article/details/43793455 本篇博客要实现的功能 先上效果图: 下面我们来介绍怎么一一实现 1.功能介绍 对于官方开发指南对于离线地图的教程,提供了两种方案: 第一,手动导入,先将从官网下载的离线包解压,把vmp文件夹拷入SD卡根目录下的BaiduMapSDK文件夹内. 第二,接口下载方法如下:mOffline.start(cityid);还比较靠谱,我相信这是大家最喜欢的. 2.百度地图离线相关AP

Android 百度地图 SDK v3_3_0 (五) ---POI搜索和在线建议查询功能

转载请标明出处:http://blog.csdn.net/tanzuai/article/details/43835431 目前百度地图SDK所集成的检索服务包括:POI检索.公交信息查询.线路规划.地理编码.在线建议查询.短串分享. 本篇博客将先介绍POI检索和在线建议查询(在地图地位功能基础上实现的,还不知道定位的童靴,请参考Android 百度地图 SDK v3.3.0 (二)--- 地图定位和图层展示) 百度地图SDK提供三种类型的POI检索:周边检索.区域检索和城市内检索.下面将以城市

Android 百度地图 SDK v3_3_0 (六) ---驾车、步行、公交路线搜索

目前百度地图SDK所集成的检索服务包括:POI检索.公交信息查询.线路规划.地理编码.在线建议查询.短串分享. 上篇博客讲解了POI检索和在线建议查询,这篇博客将讲解经常用到的线路规划. 在讲解代码之前先上张效果图: 好了!现在我们上代码,来实现上面的功能(代码中都做了相应的注解) 路线规划检索有三种检索:驾车,步行,公交车!三种实现的步骤基本类似,下面我们就拿一种来做解析(公交车). 1.首先我们要实例化路线规划检索的实例 // 初始化搜索模块,注册事件监听 mSearch = RoutePl

Android 百度地图 SDK v3.0.0 (四) 引入离线地图功能

转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/37758097 一直觉得地图应用支持离线地图很重要啊,我等移动2G屌丝,流量不易,且用且珍惜. 对于官方开发指南对于离线地图的教程,提供了两种方案: 第一,手动导入,先将从官网下载的离线包解压,把vmp文件夹拷入SD卡根目录下的BaiduMapSDK文件夹内.好吧,我表示不能接受,无视了. 第二,接口下载方法如下:mOffline.start(cityid);还比较靠谱,就是没详

Android 百度地图 SDK v3.0.0 (四) 离线地图功能介绍

转载请注明出处:http://blog.csdn.net/lmj623565791/article/details/37758097 一直认为地图应用支持离线地图非常重要啊.我等移动2G屌丝,流量不易.且用且珍惜. 对于官方开发指南对于离线地图的教程,提供了两种方案: 第一.手动导入,先将从官网下载的离线包解压,把vmp目录拷入SD卡根目录下的BaiduMapSDK目录内. 好吧,我表示不能接受,无视了. 第二,接口下载方法例如以下:mOffline.start(cityid);还比較靠谱,就是

Android 百度地图 SDK v3.0.0 (二) 定位与结合方向传感器

在上一篇博客中,我们成功把地图导入了我们的项目.本篇我们准备为地图添加:第一,定位功能:第二,与方向传感器结合,通过旋转手机进行道路的方向确认.有了这两个功能,地图已经可以为我服务了~~~~ 效果图: 好了,可以代码,为了方便,我把所有的按钮都放到了menu菜单中. 1.初次启动定位 [java] view plaincopy /** * 定位的客户端 */ private LocationClient mLocationClient; /** * 定位的监听器 */ public MyLoca

Android 百度地图 SDK v3.0.0 (一)

转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/37729091 最近公司要把百度地图集成的项目中,于是我就研究了一天百度地图的SDK,当前的版本:Android SDK v3.0.0 . 虽然百度地图网上相关代码比较多,大多可能都是比较旧的版本,且百度地图API的改动感觉也比较大,所以再此跟大家分享一下一天的劳动成功. 下面简单展示下,博客中会介绍的功能: 1.功能介绍 a.首先肯定是导入地图,然后就是地图模式的一些切换,普通

Android百度地图SDK 导航初始化和地图初始化引起的冲突

如题,同样是百度地图SDK开发过程中遇到的一个问题,交代下背景: 开发了一款内嵌百度地图的应用,因此里面差不多将目前百度地图SDK开放的主要功能都用到了,定位,地图显示,覆盖物标示,POI搜索,行程路线规划,GPS导航..等等都有.开发最开始用到的SDK版本因为是整合版本,因此各个功能部分的SDK都不确保是最新的,也就没有遇到诸如论坛上的好多仁兄遇到的将分别下载的几个单独的SDK包集成到一个应用中引发的冲突的问题,毕竟之前用的整合包导航SDK还是1.1的定位SDK还是5.3的地图SDK则用的是3

Android百度地图SDK 导航SDK2.0结合定位SDK6.0.5的导航参数设置方法

前段时间做了一阵百度地图的内容,还未来的及总结,很快有些问题及解决办法都忘了,现在记录下之前比较纠结的问题,分享如下 如题,现在的导航SDK2.0的导航发起函数如下 public boolean launchNavigator(Activity activity, java.util.List<BNRoutePlanNode> nodes, int preference, boolean isGPSNav, BaiduNaviManager.RoutePlanListener listener