`

Android开发之:谷歌地图应用开发

阅读更多

 

IT168技术】在开始Google Map之前,先来认识下maps包下两个重要的类Geopoint 和MapView 。Geopoint类是一个不可变类,表示一组经度和纬度值,以微度的整数形式存储。public 构造方法GeoPoint(int latitudeE6, int longitudeE6)。用给定的经度和纬度构造一个GeoPoint,单位微度(度* 1E6).

  参数:

  latitudeE6 - 该点的纬度,为保持Mercator投影精确度,其取值范围是[-80,80]。

  longitudeE6 - 该点的经度,可被规范化到(-180, 180)。

  public int getLatitudeE6()

  返回GeoPoint对象的纬度,单位微度(度* 1E6).

  返回值:

  纬度.

  public int getLongitudeE6()

  返回GeoPoint对象的经度,单位微度(度* 1E6)。

  返回值:

 

经度.

  一个MapView显示一个由谷歌地图服务获得的数据地图。 当MapView具有焦点时,它将捕捉按键和触摸手势平移和自动缩放地图,包括处理瓷砖更多的地图网络请求。 它还提供了必要的UI元素,为用户控制地图上的所有。 您的应用程序也可以使用MapView类的方法来控制MapView编程和绘制在地图上的覆盖类型。

  一般来说,MapView类提供对谷歌地图API的封装,让您的应用程序处理通过类方法谷歌地图数据,它可以让你的地图数据的工作,你将其他类型的意见。

  MapView一个查看其中显示的地图(从谷歌地图服务获得的数据)。将捕捉按键和触摸手势平移和缩放地图。 它也可以通过编程方式控制( getController()可以得出一个数Overlay (在上面的地图的getOverlays()

  该地图可以显示在一个模式的数量,见setSatellite(boolean) , setTraffic(boolean) ,和setStreetView(boolean) 。 它可以选择性地显示一个“十字线”的时候不是触摸模式,以帮助在使用泛到选择;看到setReticleDrawMode(com.google.android.maps.MapView.ReticleDrawMode) 它也描绘了在左下角的谷歌徽标。

  首选变焦机制是内置变焦,见setBuiltInZoomControls(boolean) 。 当用户锅地图,缩放控制会自动在MapView底部所示。

  该MapView也是ViewGroup的,让您与附加意见,或者到一个特定的像素偏移,或一个特定的纬度/经度对LayoutParameters。

 

 一个MapView只能建造(或充气)由MapActivity 。 这是因为它依赖于后台线程在网络中进行访问和文件系统中,这些线程必须在牧养的生命周期管理的MapActivity 。 砖是缓存在您的应用程序的目录的文件系统。 高速缓存是自动管理的,这样你就不需要用它做什么,随时可以删除它。

  12.1.3 Google Maps实战:漂亮的气泡地图

  在地图应用中,我们经常会有对某景点进行查询,显示某景点详细信息的应用需求,这时候如果能在地图上,用手轻轻一按就快速查询,该有多好。接下来,一起来实现这一效果,带气泡的地图。效果如图12-5、图12-6和如图12-7所示。

  

 

  ▲图12-5 地图显示景点位置

                 

 

  ▲图12-6 点击世界之窗后的气泡效果

  

 

 ▲图12-7 点击锦绣中华后的效果并以特定图标标识

  第一步,先在layout目录下建立一个MapView ,附上申请的Google Maps API Key。


<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout 
xmlns:android
="http://schemas.android.com/apk/res/android"
android:orientation
="vertical" 
android:layout_width
="fill_parent"
android:layout_height
="fill_parent">
<com.google.android.maps.MapView
  xmlns:android
="http://schemas.android.com/apk/res/android"
  android:id
="@+id/map_view"
  android:layout_width
="fill_parent" 
  android:layout_height
="fill_parent"
  android:clickable
="true" 
  android:enabled
="true" 
  android:apiKey
="0jFDHBPUJ8bRtUCMX-R9jSPzRj2Gz1Kh879BonA"/>
</RelativeLayout>

第二步,创建一个用来显示气泡的布局View。

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"  
android:background
="@drawable/pop"   
android:layout_width
="wrap_content"   
android:layout_height
="wrap_content"  
android:paddingLeft
="5px"  
android:paddingTop
="5px"  
android:paddingRight
="5px"  
android:paddingBottom
="20px"      
   
>  
    
<TextView android:id="@+id/map_bubbleTitle"   
       android:ellipsize
="marquee"   
       android:layout_width
="120px"   
       android:layout_height
="wrap_content"  
       android:gravity
="center_horizontal"  
       android:textColor
="#000000"
       android:textSize
="16dip"
       android:singleLine
="true"/>   
    
<ImageView android:id="@+id/map_bubbleImage"   
       android:background
="@drawable/narrow_select"   
       android:layout_width
="30px"   
       android:layout_toRightOf
="@id/map_bubbleTitle"  
       android:layout_height
="wrap_content"/>  
 <TextView  android:id="@+id/map_bubbleText"   
       android:layout_width
="150px"   
       android:layout_below
="@id/map_bubbleTitle"  
       android:layout_height
="wrap_content"   
       android:singleLine
="false"/>  
</RelativeLayout>

  第三步,自定义一个ItemizedOverlay用来标识景点的图标和文字的图层。主要对该图层进行重新绘制,来达到想要的效果。

public class MyItemizedOverlay extends ItemizedOverlay<OverlayItem>{
     
private ArrayList<OverlayItem> overlayItemList = new ArrayList<OverlayItem>();  
        
private Context context;  
    
public MyItemizedOverlay(Context context,Drawable defaultMarker) {
        super(defaultMarker);
        this.context
=context;
        
    }

    @Override
    
public void draw(Canvas canvas, MapView mapView, boolean shadow) {
        super.draw(canvas, mapView, shadow);
        
// Projection接口用于屏幕像素点坐标系统和地球表面经纬度点坐标系统之间的变换  
        Projection projection 
= mapView.getProjection();  
        
// 遍历所有的OverlayItem  
        
for (int index = this.size() - 1; index >= 0; index--) {  
            
// 得到给定索引的item  
            OverlayItem overLayItem 
= getItem(index);  
  
            
// 把经纬度变换到相对于MapView左上角的屏幕像素坐标  
            Point point 
= projection.toPixels(overLayItem.getPoint(), null);  
  
            Paint paintText 
= new Paint();  
            paintText.setColor(Color.RED);  
            paintText.setTextSize(
13);  
            
// 绘制文本  

canvas.drawText(overLayItem.getTitle(), point.x + 10, point.y - 15, paintText);  
        }
        
    }

    @Override
    protected 
boolean onTap(int index) {
        
// TODO Auto-generated method stub
        setFocus(overlayItemList.get(index)); 
        return super.onTap(index);
    }

    @Override  
    protected OverlayItem createItem(
int i) {  
        return overlayItemList.get(i);  
    }  
  
    @Override  
    
public int size() {  
        return overlayItemList.size();  
    }  
  

 

public void addOverlay(OverlayItem overlayItem) {  
        overlayItemList.add(overlayItem);  
        this.populate();  
    }

}

  第四步,实现自己的PopMapActivity,先在地图上根据两景点经纬度创建位置,并以自定义的图标和文字进行标识,给自定义的ItemizedOverlay添加焦点改变事件监听,来完成气泡View的显示和隐藏效果。

public class PopMapActivity extends MapActivity {
    
/**
     
* 地图View
     
*/
    protected MapView mapView;
    
/**
     
* 弹出的气泡View
     
*/
    
private View popView;
public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        
// 初始化气泡,并设置为不可见
        popView 
= View.inflate(this, R.layout.popview, null);
        setContentView(R.layout.mymapview);
        mapView 
= (MapView) findViewById(R.id.map_view);
        mapView.addView(popView, 
new MapView.LayoutParams(
                MapView.LayoutParams.WRAP_CONTENT,
                MapView.LayoutParams.WRAP_CONTENT, 
null,
                MapView.LayoutParams.BOTTOM_CENTER));
        
// 由于气泡的尾巴是在下边居中的,因此要设置成
MapView.LayoutParams.BOTTOM_CENTER.
        
// 这里没有给GeoPoint,在onFocusChangeListener中设置
        popView.setVisibility(View.GONE);
        
/**
         
* 创建图标资源(用于显示在overlayItem所标记的位置)
         
*/
        Drawable drawable 
= this.getResources().getDrawable(
                R.drawable.mis_usemobile);
        
// 为maker定义位置和边界
        drawable.setBounds(
00, drawable.getIntrinsicWidth(),
                drawable.getIntrinsicHeight());
        MyItemizedOverlay overlay 
= new MyItemizedOverlay(this, drawable);
        
// 设置显示/隐藏气泡的监听器
        overlay.setOnFocusChangeListener(onFocusChangeListener);
        
/**
         
* 创建并添加第一个标记:深圳 世界之窗(经度:22.5348 纬度:113.97246
         
*/
// 构造一个经纬度点
        GeoPoint point 
= new GeoPoint((int) (22.5348 * 1E6),
                (
int) (113.97246 * 1E6));
        
// 创建标记(世界之窗)
        OverlayItem overlayItem 
= new OverlayItem(point, "世界之窗",
                
"位于中国广东省深圳市南山区华侨城的大型文化旅游景区,是深圳最为著名的旅游景点之一。");
        
// 将标记添加到图层中(可添加多个OverlayItem)
        overlay.addOverlay(overlayItem);

        
/**
         
* 创建并添加第二个标记:锦绣中华(经度:22.53108 纬度:113.99151
         
*/
        point 
= new GeoPoint((int) (22.53108 * 1E6), (int) (113.99151 * 1E6));
        
// 创建标记(锦绣中华)
        overlayItem 
= new OverlayItem(point, "锦绣中华",
"中国旅游胜地四十佳之一,是目前世界上最大的实景微缩景区,已入选中国世界纪录协会世界最大实景微缩景区候选世界纪录。 ");
        
// 将标记添加到图层中(可添加多个OverlayItem)
        overlay.addOverlay(overlayItem);

        
/**
         
* 往地图上添加自定义的ItemizedOverlay
         
*/
        List
<Overlay> mapOverlays = mapView.getOverlays();
        mapOverlays.add(overlay);
// 设置地图模式为交通地图
        mapView.setStreetView(
true);
        
// 设置启用内置的缩放控件
        mapView.setBuiltInZoomControls(
true);
        
/**
         
* 取得地图控制器对象,用于控制MapView
         
*/
        
// 设置地图的中心
        mapView.getController().setCenter(point);
        
// 设置地图默认的缩放级别
        mapView.getController().setZoom(
13);

    }

    @Override
    protected 
boolean isRouteDisplayed() {
        
// TODO Auto-generated method stub
        return 
false;
    }

    
/**
     
* 监听器 当一个Overlay焦点改变时触发
     
*/
    
private final ItemizedOverlay.OnFocusChangeListener onFocusChangeListener = newItemizedOverlay.OnFocusChangeListener() {

@Override
        
public void onFocusChanged(ItemizedOverlay overlay, OverlayItem newFocus) 
{
            
// 创建气泡窗口
            
if (popView != null) {
                popView.setVisibility(View.GONE);
            }
            
if (newFocus != null) {

                MapView.LayoutParams geoLP 
= (MapView.LayoutParams) popView
                        .getLayoutParams();
                geoLP.point 
= newFocus.getPoint();// 这行用于popView的定位
                TextView title 
= (TextView) popView
                        .findViewById(R.id.map_bubbleTitle);
                title.setText(newFocus.getTitle());

                TextView desc 
= (TextView) popView
                        .findViewById(R.id.map_bubbleText);
                
if (newFocus.getSnippet() == null
                        || newFocus.getSnippet().length() 
== 0) {
                    desc.setVisibility(View.GONE);
                } 
else {
                    desc.setVisibility(View.VISIBLE);
                    desc.setText(newFocus.getSnippet());
                }
 mapView.updateViewLayout(popView, geoLP);
                popView.setVisibility(View.VISIBLE);
            }
        }
    };

}
分享到:
评论

相关推荐

    android应用开发范例精解

    第2篇为应用开发篇,通过实例介绍了Android UI布局、Android人机界面、手机硬件设备的使用、Android本地存储系统、Android中的数据库、多线程设计、Android传感器、Android游戏开发基础、Android与Internet,以及...

    android_应用开发_Google地图应用开发

    基于android的应用开发 Google地图应用开发

    android应用之Google地图应用开发.pdf

    android应用之Google地图应用开发.pdf

    android应用之Google地图应用开发[归类].pdf

    android应用之Google地图应用开发[归类].pdf

    android开发揭秘PDF

    第10章 Android应用开发 实例 10.1 情境模式 10.2 文件管理器 10.3 通讯录 10.4 音乐播放器 10.5 天气预报 10.6 个人地图 10.7 Widget日历 10.8 小结 第11 章Android游戏开发实例 11.1 手机游戏开发简介 11.2 游戏...

    《Android应用开发揭秘》源码

     杨丰盛,Android应用开发先驱,对Android有深入研究,实战经验极其丰富。精通Java、C、C++等语言,专注于移动通信软件开发,在机顶盒软件开发和MTK平台软件开发方面有非常深厚的积累。2007年获得中国软件行业协会...

    老罗android开发视频教程全集百度网盘下载

    Android 是Google开发的基于Linux平台的开源手机操作系统。它包括操作系统、用户界面和应用程序—— 移动电话工作所需的全部软件,而且不存在任何...【第一版第十五章】老罗Android开发视频--百度地图实战开发(10集)

    《Android应用开发揭秘》附带光盘代码.

    《Android应用开发揭秘》全部实例源代码,配合《Android应用开发揭秘》使用 前言  第一部分 准备篇  第1章 Android开发简介  1.1 Android基本概念  1.1.1 Android简介  1.1.2 Android的系统构架  1.1.3 ...

    Android高薪之路:Android程序员面试宝典 李宁

    14 4 Google地图与GPS 14 5 桌面插件 14 6 输入法开发 14 7 测试驱动开发 14 8 性能优化"&gt;下载一个cebx阅读器即可 《Android高薪之路:Android程序员面试宝典》目录: 第1章 Android入门 1 1 关于Android的非技术...

    C#开发Android应用实战

    前三章主要介绍Mono for Android开发的相关发展历程,环境搭配,开发流程,系统架构。 第四章开始介绍页面控件资料,看着很类似NET中的相关控件,让人特别的亲切和熟悉。 第五六章介绍的是开发中如何使用SQLite...

    Android应用开发详解pdf.pdf

     第2章 Android开发基础Android开发基础,讲述了Android开发环境的搭建、Android常用工具的使用和第一个Android应用程序的开发  第二篇 技术篇第3章 Android中的资源访问Android 中的资源访问,讲述了如何定义和...

    Android下GoogleMap地图类应用程序的开发.pdf

    Android下GoogleMap地图类应用程序的开发.pdf

    《Google Android开发入门与实战》.pdf

    11.2 应用开发步骤 202 11.2.1 界面设计始终是第一位——实现ui 203 11.2.2 必备的动力源泉——数据操作和存储 203 11.2.3 华丽转身——实现多页面跳转 203 11.2.4 始终为用户做好服务——增加service...

    android开发实例大全_王东华

    本书以Android应用程序的开发为主题,并结合真实的案例向读者详细介绍了Android的基本组件的使用及应用程序开发的整个流程。本书的讲述由浅入深,实例全面并典型,几乎囊括了所有和Android应用相关的项目。全书分为...

    android开发资料大全

    Android开发开发技巧之 EditText 属性、 ProgressBar 各种样式大全 android用户界面之EditText教程实例汇 android用户界面之ListView教程实例汇 android用户界面之Toast教程实例汇 android用户界面之AlarmManager...

    Android应用开发揭秘pdf高清版

    《Android应用开发揭秘》内容全面,不仅详细讲解了Android框架、Android组件、用户界面开发、游戏开发、数据存储、多媒体开发和网络开发等基础知识,而且还深入阐述了传感器、语音识别、桌面组件开发、Android游戏...

    《Java和Android开发实战详解》第18章 Google地图与定位服务代码-by 南邮-陈杨

    第12章~第13章讲解了建立第1个Android应用程序及和Android开发有关的核心技术;第14章讲解了建立多活动的Android应用程序;第15章讲解了高级应用接口的菜单、对话框与列表接口;第16章讲解了存储数据、文件和SQLite...

    新版Android开发教程.rar

    的 Android SDK 提供了在 Android 平台上使用 JaVa 语言进行 Android 应用开发必须的工具和 API 接口。 特性 • 应用程序框架 支持组件的重用与替换 • Dalvik Dalvik Dalvik Dalvik 虚拟机 专为移动设备优化 • ...

    android开发入门与实战(下)

    11.2 应用开发步骤 11.2.1 界面设计始终是第一位——实现UI 11.2.2 必备的动力源泉——数据操作和存储 11.2.3 华丽转身——实现多页面跳转 11.2.4 始终为用户做好服务——增加Service 11.2.5 细节决定成败——完善...

    android 应用 源代码——谷歌地图

    还有几十个电子书和源代码 请点击我的名字 通通免费 希望大家给个好评 都是最近半年收集的android 开发资料和源代码,挑选出好的给大家

Global site tag (gtag.js) - Google Analytics