文档章节

Android Map Api 使用和开发(1) 添加地图和界面

AK_47
 AK_47
发布于 2014/07/09 17:03
字数 1397
阅读 48
收藏 1

(全部源码地址:http://download.csdn.net/detail/totogo2010/4335701  ) 

 最近正在做和地图相关的项目,想记录和整理一下的这方面的内容发出来,既是自己整理总结,也是和别人分享经验。 

做过android 地图相关项目的同学估计都会有一些相同的需求,这些需求在android 上谷歌自己做的地图软件都做得很好,很多人想模仿参考来做,比如:

1、弹出浮动的搜索框,并能搜索地址并定位

2、长按地图出现当前位置的泡泡(popup),泡泡里有标题和内容,有详细地址和详细信息 

3、自动定位到当前位置

4、显示各种图层

这么多需求不是一下子都能做出来的,而且做好了也不容易。

那这篇先写一些怎么把google地图添加到android程序中,还有把主界面显示做一下。

先看下主界面出来的效果:

这张图怎么样? 是不是长得和Google自己的地图软件一样啊,这个其实是我模仿做出来的,咱们山寨有力量,这点模仿算不了什么。 

那开始进入代码阶段吧 。

一、申请key

网上有不少教你怎么添加地图的教程,我这里就不啰嗦太多了 ,简单的说一下

首先需要申请Android Map API Key,因为我们现在只要是进行测试熟悉Google map api的应用,所以可以使用Debug版的证明书即可

在不同的操作系统中,keystore位于如下位置: 

  · Windows Vista: C:/Users//.android/debug.keystore

  · Windows XP: C:/Documents and Settings//.android/debug.keystore

  · OS X and Linux: ~/.android/debug.keystore

最后打开申请Key的网站:申请链接

也可以参考这篇文章去申请Key :http://hb.qq.com/a/20110221/000009.htm

那到这里就假设拿到了Key了。

二、main.xml   layout 

我直接把mail.xml全贴出来,上面加注释就好了

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
	android:layout_width="fill_parent" android:layout_height="fill_parent"
	android:orientation="vertical">
    <LinearLayout
         android:layout_width="fill_parent" android:layout_height="wrap_content"
         android:orientation="horizontal" android:background="@drawable/searchbg">
         
           <!-- 这个就是搜索按钮了,你别看它想个输入框,其实是个button -->
         <Button android:id="@+id/search" android:background="@drawable/searchbtn"
         		   android:layout_marginLeft="12dp"
         		   android:layout_marginTop="5dp"
                   android:layout_width="150dp"
                   android:layout_height="35dp"
                   android:hint="搜索地图"
                   android:textSize="17sp"
				   android:singleLine="true"
				   android:gravity="center_vertical"
                   android:textColor="#000000"/>
                   
                 
                 <!-- 下面是三个图片按钮了,看效果图就知道是哪三个按钮了 -->
         <ImageButton  android:background="@drawable/maptitlebtn"  android:layout_marginLeft="15dp"
			 android:id="@+id/pointwhat"  android:src="@drawable/pointwhat"
			 android:layout_width="wrap_content"
			 android:layout_height="wrap_content"
			/>
			
			<ImageButton  android:background="@drawable/maptitlebtn"  android:layout_marginLeft="5dp"
			 android:id="@+id/layer"  android:src="@drawable/layer"
			 android:layout_width="wrap_content"
			 android:layout_height="wrap_content"
			/>
			
			 <ImageButton  android:background="@drawable/maptitlebtn" android:layout_marginLeft="5dp"
			 android:id="@+id/loction"  android:src="@drawable/loction"
			 android:layout_width="wrap_content"
			 android:layout_height="wrap_content"
			/>
                   
    </LinearLayout>
<TableLayout android:layout_width="fill_parent" android:layout_height="fill_parent"
			android:orientation="vertical"
		>
		<TableRow  android:layout_weight="1">
		
		<!-- 这里才是重点,放置map的地方 -->
			<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="0yRjCrET3v9ZkAhfn3wkRNzBPI_gHpkvx1iWT7g" />
		</TableRow>
		
		<TableRow>
		</TableRow>
	</TableLayout> 
</LinearLayout>
 

里面的key要替换成你自己申请到的Key,要不然map在软件里出不来。 

三 ,AndroidManifest.xml 文件怎么写?

最重要的是加上权限

<uses-permission android:name="android.permission.INTERNET" />

<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>

<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>

<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>

还有这句话,加上android  map的库。

    <uses-library android:name="com.google.android.maps" /> 

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
      package="com.android.fzmap"
      android:versionCode="1"
      android:versionName="1.0">
    <uses-sdk android:minSdkVersion="7" />
	<uses-permission android:name="android.permission.INTERNET" />
	<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
	<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
	<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
    <application android:icon="@drawable/icon" android:label="@string/app_name">
    <uses-library android:name="com.google.android.maps" /> 
        <activity android:name="FzMapActivity"  android:screenOrientation="portrait" 
                  android:label="@string/app_name">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>
</manifest>
 

四、FzMapActivity 

到这里就剩下 Activity的显示了。  这个Activity要继承MapActivity,不然你会死的很难看的。

不啰嗦,直接上代码

package com.android.fzmap;
import java.util.List;
import android.graphics.Point;
import android.graphics.drawable.Drawable;
import android.location.Location;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.Window;
import android.widget.ImageButton;
import android.widget.TextView;
import com.android.fzmap.map.FzLocationManager;
import com.android.fzmap.map.FzLocationManager.LocationCallBack;
import com.android.fzmap.map.MyItemizedOverlay;
import com.google.android.maps.GeoPoint;
import com.google.android.maps.MapActivity;
import com.google.android.maps.MapController;
import com.google.android.maps.MapView;
import com.google.android.maps.Overlay;
import com.google.android.maps.OverlayItem;

public class FzMapActivity  extends MapActivity implements LocationCallBack ,OnClickListener{
    /** Called when the activity is first created. */
	private final String TAG = "FzMapActivity";
	public MapView mapView;
	public MapController mMapCtrl;
	public View popView;
	private Drawable myLocationDrawable;
	private FzLocationManager fzLocation;
	private MyItemizedOverlay myLocationOverlay;
	private List<Overlay> mapOverlays;
	private OverlayItem overlayitem = null;
	
	ImageButton loction_Btn;
	ImageButton layer_Btn;
	ImageButton pointwhat_Btn;
	
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        setContentView(R.layout.main);
        
        loction_Btn = (ImageButton)findViewById(R.id.loction);
    	layer_Btn = (ImageButton)findViewById(R.id.layer);
    	pointwhat_Btn = (ImageButton)findViewById(R.id.pointwhat);
        
    	loction_Btn.setOnClickListener(this);
    	layer_Btn.setOnClickListener(this);
    	pointwhat_Btn.setOnClickListener(this);
    	
        myLocationDrawable = getResources().getDrawable(R.drawable.point_where);
        myLocationOverlay = new MyItemizedOverlay(myLocationDrawable,this);
        
        mapView = (MapView) findViewById(R.id.map_view);
		mapView.setBuiltInZoomControls(true);
		mapView.setClickable(true);
		mMapCtrl = mapView.getController();
		mapOverlays = mapView.getOverlays();
		//以北京市中心为中心
		GeoPoint cityLocPoint = new GeoPoint(39909230, 116397428);
		mMapCtrl.animateTo(cityLocPoint);
		mMapCtrl.setZoom(12);
		FzLocationManager.init(FzMapActivity.this.getApplicationContext() , FzMapActivity.this);
		fzLocation = FzLocationManager.getInstance();
		initPopView();
    }
    
    
    private void initPopView(){
    	if(null == popView){
			popView = getLayoutInflater().inflate(R.layout.overlay_popup, null);
			mapView.addView(popView, new MapView.LayoutParams(
					MapView.LayoutParams.WRAP_CONTENT,
					MapView.LayoutParams.WRAP_CONTENT, null,
					MapView.LayoutParams.BOTTOM_CENTER));
			popView.setVisibility(View.GONE);
    	}
       
    }
    
    
    
	@Override
	protected boolean isRouteDisplayed() {
		// TODO Auto-generated method stub
		return false;
	}
	
	@Override
	public void onCurrentLocation(Location location) {
		Log.d(TAG, "onCurrentLocationy");
		GeoPoint point = new GeoPoint(
				(int) (location.getLatitude() * 1E6),
				(int) (location.getLongitude() * 1E6));
		overlayitem = new OverlayItem(point, "当前位置", "");
		mMapCtrl.setZoom(16);
		myLocationOverlay.addOverlay(overlayitem);
		mapOverlays.add(myLocationOverlay);
		mMapCtrl.animateTo(point);
	}
	@Override
	public void onClick(View v) {
		switch (v.getId()) {
		case R.id.loction:
		{
			Location  location = fzLocation.getMyLocation();
			GeoPoint point = new GeoPoint(
					(int) (location.getLatitude() * 1E6),
					(int) (location.getLongitude() * 1E6));
			overlayitem = new OverlayItem(point, "当前位置", "");
			mMapCtrl.setZoom(16);
			myLocationOverlay.addOverlay(overlayitem);
			mapOverlays.add(myLocationOverlay);
			mMapCtrl.animateTo(point);
		}
			break;
		
		default:
			break;
		}
	}
}
 

重点说一下的是这几行

 mapView = (MapView) findViewById(R.id.map_view);

mapView.setBuiltInZoomControls(true);  //这个把地图设置成可缩放

mapView.setClickable(true);、//地图可点

mMapCtrl = mapView.getController();//获得控制器

mapOverlays = mapView.getOverlays();

//以北京市中心为中心

GeoPoint cityLocPoint = new GeoPoint(39909230, 116397428);

mMapCtrl.animateTo(cityLocPoint);//移动这个点为中心的地图区域

mMapCtrl.setZoom(12);//设置地图当前等级大小

这里面有写代码可能是重复,可能是废弃的,还没做整理,也有的是后面要用到的。

五、图片资源

 这个先给个截图吧

 

 

这些是最上面看到的截图用到的资源,自己可以用PS抠图。 我都这么干的。

这篇就先写到这吧。

© 著作权归作者所有

AK_47
粉丝 16
博文 533
码字总数 569998
作品 0
嘉定
程序员
私信 提问
Android特色开发之Google Map和桌面组件

本文节选于机械工业出版社推出的《Android应用开发揭秘》一书,作者为杨丰盛。本书内容全面,详细讲解了Android框架、Android组件、用户界面开发、游戏开发、数据存储、多媒体开发和网络开发...

鉴客
2011/12/01
2K
0
Android 百度地图开发(一)--- 申请API Key和在项目中显示百度地图

最近自己想研究下地图,本来想研究google Map,但是申请API key比较坑爹,于是从百度地图入手,其实他们的用法都差不多,本篇文章就带领大家在自己的Android项目中加入百度地图的功能,接下来...

等待流星
2013/12/10
4.5K
1
【android学习之十六】——特色功能1:GoogleMap手机地图

声明:学习的书籍《Android应用开发揭秘》,这里记录学习该书籍的日志,引用的相关代码与总结描述,没有商业的用途,完全是自我学习的一个记录,刚刚学习不可避免会出现很多问题,若是有错误...

晨曦之光
2012/03/08
911
0
Android的位置和地图

本文译自:http://developer.android.com/guide/topics/location/index.html 位置和基于地图的应用程序,对于移动设备用户来说是最具吸引力的。你能够使用android.location包和Google Map的外...

长平狐
2012/10/16
98
0
google play Service导入

Google Maps API v2 android版本开发 国内手机不支持google play Service相关问题解决--图文教程 google 地图在国内的使用让人很头痛,麻烦得要死,真搞不明白google为什么不能搞成跟百度地图...

mutouzhang
2014/03/10
637
0

没有更多内容

加载失败,请刷新页面

加载更多

linux 磁盘不足异常

linux 报 No space left on device 异常 ,则是磁盘不足 ,导致异常 运行 df -h 命令查询磁盘使用率,如果有100%,则查找目录大日志文件删除 1.磁盘不足导致系统应用写入文件失败,如系统日志...

zaolonglei
22分钟前
2
0
即学即用的 30 段 Python 实用代码

☞ 分享:最全最新的Python学习大礼包 ☜ 点击查看 编译:Pita & AI开发者,作者:Fatos Morina Python是目前最流行的语言之一,它在数据科学、机器学习、web开发、脚本编写、自动化方面被许...

Object_Man
22分钟前
3
0
The server time zone value 'EDT' is unrecognized or represents more than one time zone.

2019-10-14 18:07:43.714 ERROR 74363 --- [Druid-ConnectionPool-Create-1855026648] com.alibaba.druid.pool.DruidDataSource : create connection SQLException, url: jdbc:mysql://10.30......

yizhichao
36分钟前
8
0
html加载顺序以及影响页面二次渲染额的因素

本文转载于:专业的前端网站➱html加载顺序以及影响页面二次渲染额的因素 浏览器请求发往服务器以后,返回HTML页面,页面内容开始渲染,具体的执行顺序为: 1. 浏览器开始载入html代码,发现<...

前端老手
38分钟前
9
0
BeginnersBook JSP、JSTL、Servlet 教程

来源:ApacheCN BeginnersBook 翻译项目 译者:飞龙 协议:CC BY-NC-SA 4.0 贡献指南 本项目需要校对,欢迎大家提交 Pull Request。 请您勇敢地去翻译和改进翻译。虽然我们追求卓越,但我们并...

ApacheCN_飞龙
50分钟前
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部