【Android源码 栏目提醒】:网学会员鉴于大家对Android源码 十分关注,论文会员在此为大家搜集整理了“[Android.2.0游戏开发实践宝典》源码Android游戏开发视频教程www.microdu.com已更新到16章了].12 - 咨询培训”一文,供大家参考学习
d 第 12 章 A ndroi 专属12.1 Google Maps ww 谷歌地图(Google Maps)是 Google 公司提供的电子地图服务,包括局部详细的卫星照片。
能提供 3 种视图:一是矢量地图(传统地图),可提供政区和交通以及商业信息;二是不同分辨率 w. ;3的卫星照片(俯视图,与 Google Earth 上的卫星照片基本一样) 是地形视图,可用以显示地形和等高线。
mi 2006 年,Google 发布了一个 Java 程式称为 Google Maps for Mobile,可以用在 Java-based 的手机 上 。
直 至 2008 年 12 月 15 日 , Google Maps for Mobile 支 援 以 下 平 台 :
Android iPhone OS cro(iPhone/iPod Touch)Windows Mobile Nokia Symbian S60 3rd Symbian OS(UIQ v3) BlackBerry,使用 Java 平台的手机(MIDP 2.0),如 Sony Ericsson K800i Palm OS 5。
du
Android 操作系统平台很容易跟 Google 其他应用,如 Google 地图整合。
在
Android 应用中,如果能在其中加入 Google 地图,则会为你的应用增添强大的功能,目前不少 LBS 应用(基于地理位置的应用)就是充分将移动与地图结合起来。
下面,一起来学习如何使用 Google 地图。
.co12.1.1 Google Maps API Key m 使用谷歌地图 API 的第一步就是要注册一个 API 密钥,所谓 API 密钥(API Key),其实就是一个字符串,谷歌的 API 使用条款对这个密钥的用途有很正式的说明,其实总结起来也很简单。
(1)谷歌地图 API 提供的服务是免费的,对于通过 API 正常使用谷歌地图的网站基本没有任何限制。
(2)说“基本”没有限制的原因是,谷歌对每个 API 密钥对应的网站所作的地理编码/地址解析请求次数有限制,每天(24 小时)的请求次数不能超过 15000 次。
(3)不能使用谷歌地图从事任何非法的行为,否则谷歌应该能够通过这个密钥阻止你的网站使用谷歌地图。
(4)更简单地说,谷歌使用这个密钥保证能够对所有 API 用户/网站进行区分,方便必要的时候对“超常规”用户进行阻拦。
每一个 Google Maps API Key 对应一个 MD5 认证指纹(fingerprint Certificate),也就是说在取得 Maps API Key 之前,必须先生成一个 MD5 认证指纹。
正好 Java SDK 自带了一个工具(keytool),
Android 应用开发全程实录 可以轻松完成这项任务,一起来见证下如何使用该工具,又是怎么样完成 API KEY 的申请流程的。
第一步:运行 Eclipse,然后依次选择 Window→Preferences→
Android→Build 项,这时候可以 查找 debug.keystore 的路径,如图 12-1 所示。
通过该路径找到 debug.keystore 文件,我们将该文件 复制到 java SDK bin 文件夹下,与 keytool 同文件夹。
如图 12-1 所示。
ww w. mi cro ▲图 12-1 debug.keystore 路径 第二步:运行 cmd,进入到 keytool 的目录下,输入 keytool -list -keystore debug.keystore(只有 du ,否则的话应该这样 keytool -list -alias androiddebugkey 已经将 debug.store 拷贝到同目录下时可用) -keystore quot 路径debug.keystore quot - storepass
android -keypass
android,注意要有双引号。
如图 .co 12-2 MD5 指纹获取。
m ▲图 12-2 MD5 指纹获取 第 三 步 : 开 始 申 请 , 输 入 上 面 得 到 的 MD5 串 。
http://code.google.com/
android/maps-api- signup.html。
如图 12-3 所示。
最后:Google Maps API Key 申请成功。
可以看出 Google 已经给出了如何在 MapView 控件里 使用申请到的 KEY。
有了 KEY 就可以开发地图应用了。
如图 12-4 所示。
338 第 12 章
Android 专属 ww ▲图 12-3 输入 MD5 指纹 ▲图 12-4 生成的 API KEY12.1.2 Geopoint 与 MapView w. 在开始 Google Map 之前,先来认识下 maps 包下两个重要的类 Geopoint 和 MapView 。
Geopoint 类是一个不可变类,表示一组经度和纬度值,以微度的整数形式存储。
mi public 构造方法 GeoPointint latitudeE6 int longitudeE6。
用给定的经度和纬度构造一个 GeoPoint,单位微度 (度 1E6). cro 参数: latitudeE6 - 该点的纬度,为保持 Mercator 投影精确度,其取值范围是-8080。
longitudeE6 - 该点的经度,可被规范化到(-180 180)。
du public int getLatitudeE6 返回 GeoPoint 对象的纬度,单位微度(度 1E6). .co 返回值: 纬度. m public int getLongitudeE6 返回 GeoPoint 对象的经度,单位微度(度 1E6)。
返回值: 经度. 一个 MapView 显示一个由谷歌地图服务获得的数据地图。
当 MapView 具有焦点时,它将捕捉按键和触摸手势平移和自动缩放地图,包括处理缓存及更多的地图网络请求。
它还提供了必要的 UI 元素,为用户控制地图上的所有。
您的应用程序也可以使用 MapView 类的方法来控制MapView 编程和绘制在地图上的覆盖类型。
一般来说,MapView 类提供对谷歌地图 API 的封装,让您的应用程序处理通过类方法谷歌地图数据,它可以让你的地图数据的工作,你将其他类型的意见。
。
将捕捉按键和触摸手势平 MapView 一个查看其中显示的地图(从谷歌地图服务获得的数据)移和缩放地图。
它也可以通过编程方式控制( getController可以得出一个数 Overlay (在上面的 339
Android 应用开发全程实录 地图的 getOverlays 该 地 图 可 以 显 示 在 一 个 模 式 的 数 量 , 见 setSatelliteboolean , setTrafficboolean , 和 setStreetViewboolean 。
它可以选择性地显示一个“十字线”的时候不是触摸模式,以帮助在使用 泛到选择;看到 setReticleDrawModecom.google.
android.maps.MapView.ReticleDrawMode 它也描绘 了在左下角的谷歌徽标。
首选变焦机制是内置变焦,见 setBuiltInZoomControlsboolean 。
当用户触摸地图,缩放控制 会自动在 MapView 底部所示。
该 MapView 也是 ViewGroup 的,让您与附加意见,或者到一个特定的像素偏移,或一个特定 的纬度/经度对 LayoutParameters。
一个 MapView 只能建造(或充气)由 MapActivity 。
这是因为它依赖于后台线程在网络中进 行访问和文件系统中,这些线程必须在牧养的生命周期管理的 MapActivity 。
砖是缓存在您的应用 ww 程序的目录的文件系统。
高速缓存是自动管理的,这样你就不需要用它做什么,随时可以删除它。
12.1.3 Google Maps 实战:漂亮的气泡地图 w. 在地图应用中,我们经常会有对某景点进行查询,显示某景点详细信息的应用需求,这时候如 果能在地图上,用手轻轻一按就快速查询,该有多好。
接下来,一起来实现这一效果,带气泡的地 mi 图。
效果如图 12-5、图 12-6 和如图 12-7 所示。
cro du .co m ▲图 12-5 地图显示景点位置, ▲图 12-6 点击世界之窗后的气泡效果 ▲图 12-7 点击锦绣中华后的效果 并以特定图标标识 工程目录:EX_12_01 第一步,先在 layout 目录下建立一个 MapView ,附上申请的 Google Maps API Key。
ltxml versionquot1.0quot encodingquotutf-8quotgt ltRelativeLayout xmlns:androidquothttp://schemas.
android.com/apk/res/androidquot
android:orientationquotverticalquot
android:layout_widthquotfill_parentquot340 第 12 章
Android 专属
android:layout_heightquotfill_parentquotgt ltcom.google.
android.maps.MapView xmlns:androidquothttp://schemas.
android.com/apk/res/androidquot
android:idquotid/map_viewquot
android:layout_widthquotfill_parentquot
android:layout_heightquotfill_parentquot
android:clickablequottruequot
android:enabledquottruequot
android:apiKeyquot0jFDHBPUJ8bRtUCMX-R9jSPzRj2Gz1Kh879BonAquot /gt lt/RelativeLayoutgt 第二步,创建一个用来显示气泡的布局 View。
ltRelativeLayout xmlns:androidquothttp://schemas.
android.com/apk/res/androidquot
android:backgroundquotdrawable/popquot
android:layout_widthquotwrap_contentquot
android:layout_heightquotwrap_contentquot
android:paddingLeftquot5pxquot ww
android:paddingTopquot5pxquot
android:paddingRightquot5pxquot
android:paddingBottomquot20pxquot gt w. ltTextView
android:idquotid/map_bubbleTitlequot
android:ellipsizequotmarqueequot
android:layout_widthquot120pxquot
android:layout_heightquotwrap_contentquot mi
android:gravityquotcenter_horizontalquot
android:textColorquot000000quot
android:textSizequot16dipquot cro
android:singleLinequottruequot /gt ltImageView
android:idquotid/map_bubbleImagequot
android:backgroundquotdrawable/narrow_selectquot
android:layout_widthquot30pxquot
android:layout_toRightOfquotid/map_bubbleTitlequot du
android:layout_heightquotwrap_contentquot /gt ltTextView
android:idquotid/map_bubbleTextquot .co
android:layout_widthquot150pxquot
android:layout_belowquotid/map_bubbleTitlequot
android:layout_heightquotwrap_contentquot
android:singleLinequotfalsequot /gt m lt/RelativeLayoutgt 第三步,自定义一个 ItemizedOverlay 用来标识景点的图标和文字的图层。
主要对该图层进行重新绘制,来达到想要的效果。
public class MyItemizedOverlay extends ItemizedOverlayltOverlayItemgt private ArrayListltOverlayItemgt overlayItemList new ArrayListltOverlayItemgt private Context context public MyItemizedOverlayContext contextDrawable defaultMarker superdefaultMarker super this.contextcontext this Override public void drawCanvas canvas MapView mapView boolean shadow super.drawcanvas mapView shadow super // Projection 接口用于屏幕像素点坐标系统和地球表面经纬度点坐标系统之间的变换 Projection projection mapView.getProjection // 遍历所有的 OverlayItem 341
Android 应用开发全程实录 int this.size - 1 index gt 0 index-- for int index this // 得到给定索引的 item OverlayItem overLayItem getItemindex // 把经纬度变换到相对于 MapView 左上角的屏幕像素坐标 null Point point projection.toPixelsoverLayItem.getPoint null Paint paintText new Paint paintText.setColorColor.RED paintText.setTextSize13 // 绘制文本 canvas.drawTextoverLayItem.getTitle point.x 10 point.y - 15 paintText Override int protected boolean onTapint index ww // TODO Auto-generated method stub setFocusoverlayItemList.getindex super.onTapindex return super w. Override int protected OverlayItem createItemint i return overlayItemList.geti mi Override cro public int size return overlayItemList.size public void addOverlayOverlayItem overlayItem du overlayItemList.addoverlayItem this.populate this .co 第四步,实现自己的 PopMapActivity,先在地图上根据两景点经纬度创建位置,并以自定义的 m 图标和文字进行标识,给自定义的 ItemizedOverlay 添加焦点改变事件监听,来完成气泡 View 的显 示和隐藏效果。
public class PopMapActivity extends MapActivity / 地图 View / protected MapView mapView / 弹出的气泡 View / private View popView public void onCreateBundle savedInstanceState super.onCreatesavedInstanceState super // 初始化气泡并设置为不可见 this this null popView View.inflatethis R.layout.popview null setContentViewR.layout.mymapview342 第 12 章
Android 专属 mapView MapView findViewByIdR.id.map_view mapView.addViewpopView new MapView.LayoutParams MapView.LayoutParams.WRAP_CONTENT MapView.LayoutParams.WRAP_CONTENT null null MapView.LayoutParams.BOTTOM_CENTER // 由于气泡的尾巴是在下边居中的因此要设置成MapView.LayoutParams.BOTTOM_CENTER. // 这里没有给 GeoPoint在 onFocusChangeListener 中设置 popView.setVisibilityView.GONE / 创建图标资源(用于显示在 overlayItem 所标记的位置) / Drawable drawable thisthis.getResources.getDrawable R.drawable.mis_usemobile // 为 maker 定义位置和边界 drawable.setBounds0 0 drawable.getIntrinsicWidth drawable.getIntrinsicHeight this this MyItemizedOverlay overlay new MyItemizedOverlaythis drawable ww // 设置显示/隐藏气泡的监听器 overlay.setOnFocusChangeListeneronFocusChangeListener / 创建并添加第一个标记:深圳 世界之窗(经度:22.5348 纬度:113.97246) / w. // 构造一个经纬度点 int int GeoPoint point new GeoPointint 22.5348 1E6 int int int 113.97246 1E6 mi // 创建标记世界之窗 OverlayItem overlayItem new OverlayItempoint quot世界之窗quot quot位于中国广东省深圳市南山区华侨城的大型文化旅游景区,是深圳最为著名的旅游景点之一。
quot cro // 将标记添加到图层中(可添加多个 OverlayItem) overlay.addOverlayoverlayItem / du 创建并添加第二个标记:锦绣中华(经度:22.53108 纬度:113.99151) / int int int int.
上一篇:
Android系统Framework层源码分析
下一篇:
创新人才培养及其能力提高的研究与实践