`

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开发实例:gogol地图 源码

    在Android开发领域,集成地图服务是一项常见的需求,Google Maps(通常写作Gogol Maps,可能是误拼)是其中最常用的服务之一。这个实例是关于如何在Android应用中整合Google Maps API,提供地图显示、定位、路线规划...

    Android Studio开发实战:从零基础到App上线

    总而言之,《Android Studio开发实战:从零基础到App上线》提供了一个全面的学习路径,让初学者能够系统地掌握Android应用开发,最终实现从理论到实践的飞跃,成功将App上线发布到Google Play或其他应用市场。

    天地图开发之Android-显示天地图

    总的来说,"天地图开发之Android-显示天地图"是一个涉及到Android SDK集成、地图API使用、地理位置服务、UI设计和性能优化等多个方面的问题。通过博客实例代码的学习和实践,可以深入了解如何在Android应用中实现天...

    android应用开发范例精解

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

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

    ### Android应用开发中的Google地图应用开发 在当前的移动应用市场中,地图和地理定位服务已成为许多应用程序不可或缺的一部分。Google地图作为全球范围内广泛使用的地图服务之一,为开发者提供了丰富的API,使得...

    老罗android 百度地图开发源码

    在Android开发中,百度地图API是一个非常常用的工具,它提供了丰富的地图展示、定位、路径规划等功能,极大地便利了开发者在构建地理位置相关应用时的工作。"老罗android 百度地图开发源码"是一个示例项目,它展示了...

    Android地图定位googleSDK使用

    在Android开发中,集成Google Maps SDK和Google Location SDK是实现地图展示、定位功能的重要环节。本文将详细讲解如何使用这两个SDK来实现相应的功能,并提供一些关键知识点。 首先,我们需要在项目中添加Google ...

    基于Android的百度API旅游地图应用开发参赛作品完整版

    通过这个项目,开发者不仅展示了其在Android开发和百度地图API集成方面的技能,也为其他开发者提供了一个学习和实践的实例,有助于推动Android地图应用的发展。对于想要从事相关开发的人来说,这是一个很好的学习...

    Android开发应用从入门到精通.pdf

    4. Activity与Fragment:这是Android应用开发中最基础的两个概念,Activity是应用中单一屏幕的展示,而Fragment代表了Activity中的一个片段,用于更灵活的界面设计。 5. Android界面布局:包括XML布局文件的编写,...

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

    本篇将详细讲解如何进行Google地图应用开发,主要包括以下几个关键知识点: 1. **Google Map API的安装与配置** - 首先,你需要在Android Studio中创建一个项目,确保选择的SDK是`Google APIs`,因为Google地图API...

    Android应用开发揭秘-pdf(全)

    根据提供的信息,我们可以推断出《Android应用开发揭秘》这本书主要涵盖了Android应用程序的开发流程及相关技术,适合初学者作为入门指南。尽管具体内容未给出详细章节或摘要,但基于标题、描述及常见Android开发...

    《Android应用开发揭秘》读书笔记

    《Android应用开发揭秘》读书笔记不仅是一份个人学习历程的记录,更是一部深入浅出的Android开发指南。本书籍及笔记覆盖了从基础知识到高级应用的广泛内容,为初学者和有经验的开发者提供了宝贵的资源。 ### ...

    C#开发Android 谷歌地图完整源码(使用Mono技术基于vs2010开发)

    标题中的"C#开发Android 谷歌地图完整源码(使用Mono技术基于vs2010开发)"指的是一项利用C#编程语言,通过Mono框架,并在Visual Studio 2010环境下,实现对Android应用的开发,特别是集成并展示了谷歌地图功能的项目...

    基于AndroidStudio的Baidu地图开发源码

    在Android应用开发中,集成地图服务是常见的需求之一,而百度地图API则为开发者提供了强大的地图功能支持。本文将深入探讨如何在Android Studio环境中利用百度地图API进行开发,结合提供的"基于AndroidStudio的Baidu...

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

    在Android应用开发中,谷歌地图(Google Maps)是不可或缺的一部分,它允许开发者集成地图功能到自己的应用程序中,为用户提供地理位置信息、导航等服务。本文将深入探讨如何在Android应用中集成和利用谷歌地图API,...

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

    在Android应用开发中,集成Google地图服务是一项常见的需求。这篇文档详细介绍了如何在Android应用中实现Google地图功能,包括定位、地图标记以及获取周边信息。以下是对这些知识点的深入解析: 1. **集成Google ...

    基于Android手机的地图应用设计与开发.pdf

    基于Android手机的地图应用开发,不仅可以充分利用Android平台的优势,还能满足用户在户外旅行等场景下的地图服务需求。通过合理设计和实现各项功能,可以大大提高用户体验,推动地图服务在移动领域的广泛应用。

    基于Android开发的百度地图

    以上是基于Android开发的百度地图应用的主要知识点,涵盖了从基础的Android开发环境到具体的百度地图SDK的使用,以及与地图相关的各种功能实现。理解并熟练掌握这些内容,将有助于你构建出功能丰富的地图应用。

    android小应用之手机地图源码

    在Android平台上,开发一款手机地图应用是一个常见的任务,它涉及到许多关键技术和组件。"android小应用之手机地图源码"的标题和描述虽然简洁,但我们可以从中推断出一系列相关的技术点。以下是对这些知识点的详细...

    Android6.0百度地图加载(Eclipse)

    3. Android 6.0的地图应用程序开发:Android 6.0 提供了多种地图应用程序开发的可能性,例如使用百度地图 SDK、Google Maps SDK 等,以便开发者快速构建地图应用程序。 4. 百度地图开发密钥(Key):百度地图开发...

Global site tag (gtag.js) - Google Analytics