Android开发之GoogleMaps.docx
- 文档编号:18435513
- 上传时间:2023-08-18
- 格式:DOCX
- 页数:16
- 大小:251.46KB
Android开发之GoogleMaps.docx
《Android开发之GoogleMaps.docx》由会员分享,可在线阅读,更多相关《Android开发之GoogleMaps.docx(16页珍藏版)》请在冰点文库上搜索。
Android开发之GoogleMaps
Android开发之GoogleMaps
AlephSoul
1引言
在Android上开发开发地图应用将是一件很Cool的事,Google为Javascript应用开发者提供了一套API,为Flex应用开发者提供了一套API,作为其得意门生的Android当然拥有一套地图API,本节将简单的介绍一下Android地图应用开发流程,下面这个图是整个地图应用的核心框图。
2准备工作
开发之前需要一定的准备工作,主要有以下几点:
1、SDK要包含GoogleMapsAPI,一般在sdk/add-ons目录下
2、新建一个支持GoogleMapsAPI的项目
3、在AndroidManifest.xml文件中添加库文件
4、在AndroidManifest.xml文件中添加访问网络的许可
3相关类
在开发之前需要一些准备知识,需要对一些相关类有一个大概的了解,它们分别是MapActivity、MapView、GeoPoint、MapController、Overlay、Projection、ItemizedOverlay、MyLocationOverlay。
类名
概述
MapAcitivity
管理Activity的生命周期,为mapview建立及取消对mapservice的连接。
MapActivity是一个抽象类,任何想要显示MapView的activity都需要派生自MapActivity。
并且在其派生类的onCreate()中,都要创建一个MapView实例,可以通过MapViewconstructor(然后添加到View中ViewGroup.addView(View)) 或者通过layoutXML来创建。
注意:
一个进程只能支持一个MapActivity,否则会有意想不到的异常和错误。
MapView
Mapview是用来显示地图的view, 它派生自android.view.ViewGroup。
当MapView获得焦点,可以控制地图的移动和缩放。
地图可以以不同的形式来显示出来,如街景模式,卫星模式等,通过setSatellite(boolean),setTraffic(boolean),setStreetView(boolean) 方法。
MapView只能被MapActivity来创建,这是因为mapview需要通过后台的线程来连接网络或者文件系统,而这些线程要由mapActivity来管理。
MapController
控制地图移动,伸缩,以某个GPS坐标为中心,控制MapView中的view组件,管理Overlay,提供View的基本功能。
使用多种地图模式(地图模式(某些城市可实时对交通状况进行更新)来查看GoogleMap。
Overlay
Overlay是覆盖到MapView的最上层,可以扩展其onDraw接口,自定义在MapView中显示一些自己的东西。
MapView通过MapView.getOverlays()对Overlay进行管理。
Projection
投影,MapView中GPS坐标与设备坐标的转换(GeoPoint和Point)。
ItemizedOverlay
管理一个OverlayItem链表,用图片等资源在地图上作风格相同的标记。
MyLocationOverlay
集成了Android.location中接收当前坐标的接口,集成SersorManager中CompassSensor的接口
我们只需要enableMyLocation(),enableCompass就可以让我们的程序拥有实时的MyLocation以及Compass 功能(Activity.onResume()中)。
3.1MapActivity
创建一个GoogleAPIS项目之后会自动生成一个继承Activity的类,我们需要把它改成继承MapActivity的类,下面是这个类的模板,我们需要在onCreate里创建MapView,关于创建MapView有两种方式,一种是在代码中新建,另一种是在layout的xml文件中新建。
模板代码:
publicclassMapDemoActivityextendsMapActivity{
@Override
protectedvoidonCreate(BundlesaveInstanceState){
super.onCreate(saveInstanceState);
}
/*是否显示路径信息*/
@Override
protectedbooleanisRouteDisplayed(){
returnfalse;
}
}
创建MapView的Xml代码:
android: layout_width="fill_parent" android: layout_height="fill_parent" android: apiKey="0wj68hDN9nGuBbbP_uHPwhMRW8vIBpNPEAOnpxQ" > 3.2MapView 显示地图的载体,它有很多成员方法,这里列举几个常用的方法: ·getController()/*获取地图控制器*/ ·setStreetView()/*设置地图显示模式为街道模式*/ ·setTraffic()/*设置地图显示模式为交通模式*/ ·setSatellite()/*设置地图显示模式为卫星模式*/ ·setZoom()/*设置地图缩放率(1~21)*/ ·getMapCenter()/*获取地图中心*/ ·getLatitudeSpan()/*获取纬度跨度*/ ·getLongitudeSpan()/*获取经度跨度*/ ·setBuiltInZoomControls()/*设置是否内置缩放控制器*/ 代码示例: mMapController=mMapView01.getController(); /*设置地图显示模式为卫星模式*/ mMapView.setSatellite(false); /*设置地图显示模式为街道模式*/ mMapView.setStreetView(false); /*设置地图显示模式为交通模式*/ mMapView.setTraffic(true); intZoomLevel=10; mMapController.setZoom(intZoomLevel); 3.3MapController 控制地图的显示,主要有以下几个常用成员方法: ·setZoom()/*设置地图缩放等级,最为常用*/ ·setCenter()/*根据给定的中心坐标设置地图中心*/ ·animateTo()/*平滑移动到指定点,并将此点设置为显示中心*/ 3.4Overlay 地图覆盖层,这是个抽象类,要为地图添加覆盖层的话需要实现这个类的draw方法,如果需要添加事件响应需要实现onTap方法。 代码示例: publicclassDemoOverlayextendsOverlay{ /*绘制地图标记显示的内容*/ @Override publicvoiddraw(Canvascanvas,MapViewmapView,booleanshadow){ super.draw(canvas,mapView,shadow); } /*单击标记需要执行的事件*/ @Override publicbooleanonTap(GeoPointp,MapViewmapView){ returnsuper.onTap(p,mapView); } } 3.5Projection 投影,用来绘制覆盖注释的画布是一个表示可视的显示表面的标准的Canvas,要根据物理位置添加注释,需要在地理位置和屏幕坐标之间进行转换。 ·fromPixels/*以屏幕为坐标面,转化为实际的经纬度坐标*/ ·toPixels/*将一个经纬度坐标值转化为屏幕坐标值*/ 代码示例: GeoPointgeoPoint=newGeoPoint(12,21); PointgeoPointToPoint=newPoint(); Projectionprojection=DemoView.getProjection(); /*将经纬度转换为屏幕坐标,存放在一个Point实例里*/ projection.toPixels(geoPoint,geoPointToPoint); /*从屏幕坐标获取到经纬度坐标信息*/ GeoPointpointToGeoPoint=projection.fromPixels(geoPointToPoint.x,geoPointToPoint.y); 3.6ItemizedOverlay和OverlayItem 将这两个类放在一起是因为它们两个是配合起来使用的,OverlayItem使用ItemizedOverlay向MapView提供简单的标记功能。 ItemizedOverlay是继承自Overlay类的,这说明ItemizedOverlay是一个覆盖层,OverlayItem是覆盖项,即一个标记,ItemizedOverlay是OverlayItem的载体,所有的OverlayItem将由ItemizedOverlay来管理。 ItemizedOverlay是一个抽象类,所以如果想使用它需要继承它,并且重写它的函数: 构造函数、createItem(intindex)、size(). 代码示例: 使用代码示例: 3.7MyLoacationOverlay 用来在一个MapView中显示当前位置和方向,这是一个专门设计的类,当然我们可以自己继承Overlay来实现一个相同功能的Overley类。 代码示例: MyLocationOverlaymy=newMyLocationOverlay(this,DemoView); overlays.add(my); 4固定视图 下面的截图演示了什么是固定视图,这个过程是动态的,就是当我们移动地图的时候,地图表面的视图保持在屏幕上的位置不动。 其实有两种固定视图: 一是相对屏幕位置不变的视图固定,二是相对地图位置不变的视图固定,他们都是简单的调用了MapView的addView方法完成的,不同的是MapView.addView传入的第二个参数不同。 视图固定到屏幕上: 视图固定到地图上: 5完整实例 5.1概要步骤 1、申请一个MapsKey 2、新建一个支持GoogleMapAPI的android项目 3、在AndroidManifest.xml中添加Permission 4、在AndroidMnifest.xml中添加所需要的库文件 5、在main.xml中添加一个MapView控件 6、编写代码初始化MapView 7、继承Overlay实现一个覆盖层 8、为地图添加覆盖层标识 5.2详细步骤 1、申请一个MapsKey 参见另一篇文档: “Android开发之GoogleMapsKey的申请.doc” 2、新建一个支持GoogleMapApi的android项目(其实也可有来导入maps.jar) A)、检查SDK包里是否有GoogleAPIs,即如下图所示目录存在 B)、新建一个Android项目,指定“BuildTarget”为GoogleAPIs C)、生成项目目录如下图所示 3、在AndroidManifest.xml文件中添加Permission,如下 4、在AndroidManifest.xml中添加所需要的库文件 5、在布局文件main.xml中添加MapView控件 0qCn-t7Hb16pkhRAaZhvz1TrKCoHidM1UEhH16w Example9-04原来的Key: 0dYpmIXGIdwiVm-HEpzuUW2fjNYsFQ9EvYir1sg twStration: 0vUBBiZoYQvqxxLi0pgax3xP_ccG6zB-WhI4U5Q 6、编写代码初始化MapView DemoView=(MapView)this.findViewById(R.id.demoView); controller=DemoView.getController(); DemoView.setTraffic(true); DemoView.setEnabled(true); controller.setZoom(10); Doublelat=12.21*1E6; Doublelon=12.21*1E6; GeoPointpoint=newGeoPoint(lat.intValue(),lon.intValue()); controller.setCenter(point); 7、添加覆盖层 A)、继承Overlay编写自定义的覆盖层 代码示例: classMyOverlayextendsOverlay{ @Override publicvoiddraw(Canvascanvas,MapViewmapView,booleanshadow) { Projectionprojection=DemoView.getProjection(); Doublelat=12.21*1E6; Doublelon=12.21*1E6; GeoPointpoint=newGeoPoint(lat.intValue(), lon.intValue()); Pointp=newPoint(); if(shadow==false){projection.toPixels(point,p); Paintpaint=newPaint(); paint.setARGB(250,255,0,0); paint.setAntiAlias(true); paint.setFakeBoldText(true); intrad=5; RectFoval=newRectF(p.x-rad,p.y-rad, p.x+rad,p.y+rad); canvas.drawOval(oval,paint); canvas.drawText("自定义的标记",p.x+rad,p.y,paint); } super.draw(canvas,mapView,shadow); } @Override publicbooleanonTap(GeoPointp,MapViewmapView){ returnsuper.onTap(p,mapView); } } B)、为MapView添加一个覆盖层 代码示例: List MyOverlaymyOverlay=newMyOverlay(); overlays.add(myOverlay); 4.3示例效果 6补充 上述示例中没有指定位置服务的提供者,系统会自动寻找提供者,如果我们想查看为我们提供服务的提供者的信息,可以用到android原生的类LocationManager,这个类可以获得LocationProvider,下面是一段简短的代码,演示了获取提供者的过程,仅供参考。 示例代码: List Log.i("Tag","providersize: "+String.valueOf(providers.size())); for(Stringprovider: providers){ locationManager.requestLocationUpdates(provider,1000,0, (LocationListener)locationListener); location=locationManager.getLastKnownLocation(provider); Log.i("Tag","forprovider: "+provider); if(location! =null){ Log.i("Tag","notnullprovider: "+provider); longitude=location.getLongitude(); latitude=location.getLatitude(); tv_longitude.setText(String.valueOf(longitude)); tv_latitude.setText(String.valueOf(latitude));Log.i("Tag","Longitude: "+String.valueOf(longitude)+"Lagi tude: "+latitude); break; }else{ tv_longitude.setText("longitude"); tv_latitude.setText("latitude"); } } 以上
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Android 开发 GoogleMaps