`
chenxu_8456
  • 浏览: 40682 次
  • 性别: Icon_minigender_1
  • 来自: 上海
文章分类
社区版块
存档分类
最新评论

Android与位置相关的应用开发(2)-MapController与Overlay

阅读更多
在前一节中演示了MapView的简单应用,MapView从服务的提供方获取相关数据并且将地图显示出来,此外通过MapView还可以显示如卫星图,交通等信息;在本文中将介绍另外两个重要类MapController和Overlay,这两个类将丰富地图的功能和展示。
1)MapController:
如果要在地图中设置缩放等级、实现缩放功能和动态移动等功能需要使用另一个重要的类MapController,MapController的简单使用如下:
 @Override
	public void onCreate(Bundle icicle) {
		super.onCreate(icicle);
		setContentView(R.layout.mapview);
		mapView = (MapView) findViewById(R.id.mapview);
		mapView.setBuiltInZoomControls(true);
		Drawable marker = getResources().getDrawable(R.drawable.mapmarker);
		marker.setBounds(0, 0, marker.getIntrinsicWidth(),
				marker.getIntrinsicHeight());
		InterestingLocations interestPlaces = new InterestingLocations(marker);
		mapView.getOverlays().add(interestPlaces);
		GeoPoint pt = interestPlaces.getCenter();
		mapView.getController().setCenter(pt);
		mapView.getController().setZoom(15);
	}

通过setCenter(GeoPoint)设置当前地图显示的中心位置,setZoom(zoomLevel)设置当前地图的缩放等级,通过zoomIn()和zoomOut()实现地图的缩放;
2)Overlay:
在使用地图的时候我们希望将我们感兴趣的位置在地图上标示出来,这个时候我们将使用覆盖图,将我们感兴趣的位置用覆盖图在地图上标示出来,android提供了一些简单的Overlay的实现方式,在这里演示最简单ItemizedOverlay,代码如下:
 @SuppressWarnings("rawtypes")
	class InterestingLocations extends ItemizedOverlay {
		private Drawable marker;

		private List<OverlayItem> locations = new ArrayList<OverlayItem>();

		public InterestingLocations(Drawable defaultMarker) {
			super(defaultMarker);
			marker = defaultMarker;
			GeoPoint disneyMagicKingdom = new GeoPoint((int) (28.418971 * 1E6),
					(int) (-81.581436 * 1E6));
			GeoPoint disneySevenLagoon = new GeoPoint((int) (28.410067 * 1E6),
					(int) (-81.583699 * 1E6));
			locations.add(new OverlayItem(disneyMagicKingdom, "Magic Kingdom",
					"Magic Kingdom"));
			locations.add(new OverlayItem(disneySevenLagoon, "Seven Sea Lagoon",
					"Seven Sea Lagoon"));
			populate();
		}

		@Override
		protected OverlayItem createItem(int index) {
			return locations.get(index);
		}

		@Override
		public int size() {
			return locations.size();
		}

		@Override
		public void draw(Canvas canvas, MapView mapView, boolean shadow) {
			super.draw(canvas, mapView, shadow);
			boundCenterBottom(marker);
		}
	}
}

该类要求提供一个覆盖图id,然后将感兴趣的位置GeoPoint添加至位置列表中;
再通过MapView.getOverlays().Add(Overlay)将覆盖图列表添加至MapView上用于显示;
本节完整代码如下:
layout文件:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <com.google.android.maps.MapView
        android:id="@+id/mapview"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:apiKey="your api key"
        android:clickable="true" />

</LinearLayout>

Activity代码:
package com.local;

import java.util.ArrayList;
import java.util.List;

import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Point;
import android.graphics.drawable.Drawable;
import android.os.Bundle;

import com.google.android.maps.GeoPoint;
import com.google.android.maps.ItemizedOverlay;
import com.google.android.maps.MapActivity;
import com.google.android.maps.MapView;
import com.google.android.maps.OverlayItem;

public class MappingOverlayActivity extends MapActivity {

	private MapView mapView;

	@Override
	public void onCreate(Bundle icicle) {
		super.onCreate(icicle);
		setContentView(R.layout.mapview);
		mapView = (MapView) findViewById(R.id.mapview);
		mapView.setBuiltInZoomControls(true);
		Drawable marker = getResources().getDrawable(R.drawable.mapmarker);
		marker.setBounds(0, 0, marker.getIntrinsicWidth(),
				marker.getIntrinsicHeight());
		InterestingLocations interestPlaces = new InterestingLocations(marker);
		mapView.getOverlays().add(interestPlaces);
		GeoPoint pt = interestPlaces.getCenter();
		mapView.getController().setCenter(pt);
		mapView.getController().setZoom(14);
	}

	@Override
	protected boolean isRouteDisplayed() {
		return false;
	}

	@SuppressWarnings("rawtypes")
	class InterestingLocations extends ItemizedOverlay {
		private Drawable marker;

		private List<OverlayItem> locations = new ArrayList<OverlayItem>();

		public InterestingLocations(Drawable defaultMarker) {
			super(defaultMarker);
			marker = defaultMarker;
			GeoPoint hubin = new GeoPoint((int) (30.254618 * 1E6),
					(int) (120.163650 * 1E6));
			GeoPoint mateng = new GeoPoint((int) (30.278637 * 1E6),
					(int) (120.150260 * 1E6));
			locations.add(new OverlayItem(hubin, "外婆家湖滨店", "外婆家湖滨店"));
			locations.add(new OverlayItem(mateng, "外婆家马塍店", "外婆家马塍店"));
			populate();
		}

		@Override
		protected OverlayItem createItem(int index) {
			return locations.get(index);
		}

		@Override
		public int size() {
			return locations.size();
		}

		@Override
		public void draw(Canvas canvas, MapView mapView, boolean shadow) {
			Paint paint = new Paint();
			paint.setTextSize(12);
			paint.setColor(Color.BLUE);
			for (OverlayItem item : locations) {
				Point point = mapView.getProjection().toPixels(item.getPoint(),
						null);
				canvas.drawText(item.getTitle(), point.x, point.y-20, paint);
			}
			super.draw(canvas, mapView, shadow);
			boundCenterBottom(marker);
		}
	}
}

运行结果如下:
  • 大小: 86.8 KB
分享到:
评论

相关推荐

    九、位置服务与地图应用-Android开发与实践

    了解位置服务的概念 了解地图密钥的申请方法 掌握获取位置信息的方法 掌握MapView和MapController的使用方法 掌握Google地图覆盖层的使用方法 

    Android入门到精通源代码.

    第11章 Android的GPS应用开发 11.1 GPS在手机中的应用 11.2 Android Location-Based API简介 11.3 Android模拟器支持的GPS定位文件 11.3.1 KML 11.3.2 NMEA 11.4 应用实例详解:确定当前 位置的GPS程序 11.4.1 实例...

    《Android高级编程》

    1.9.3 Dalvik虚拟机 1.9.4 Android应用程序架构 1.9.5 Android库 1.9.6 高级Android库 1.10 小结 第2章 开始入手 2.1 Android开发 2.1.1 开始前的准备工作 2.1.2 创建第一个Android活动 2.1.3 Android应用程序的类型...

    Android高级编程.pdf

    1.4 自带的Android应用程序 1.5 Android SDK功能 1.5.1 对包括摄像头、GPS和加速计在内的硬件的访问 1.5.2 自带的Google地图、地理编码和基于位置的服务 1.5.3 后台服务 1.5.4 SQLite数据存储和检索数据库 1.5.5 ...

    Android 上应用Googlemap

    &lt;Button android:text="@+id/Button01" android:id="@+id/Button01" android:layout_width="wrap_content" android:layout_height="wrap_content"&gt; //--------------------- &lt;?xml version="1.0" encoding="utf-8"?...

    MapView的使用

    在论坛里看到一篇 "MapView和其它控件一起显示 " 的帖子, 那是很老的一篇帖子了, 很多朋友都说无法在android SDK 1.0上运行。既然那么多人关心,我在这里就把它重写一遍,顺便加入了一些新的功能 ,感兴趣的朋友可以...

    百度地图开发笔记

    详细介绍百度开发实例1.BMapManager 这个是地图引擎的管理类。要注意的地方:1、要在setContent()前使用;2、一个软件只需要一个BMapManager对象,我在主Activity把它定义为static类型的,然后在其他Activity共享...

    map_controller:Flutter Map的状态地图控制器

    地图控制器 Flutter Map的状态地图控制器。 管理标记,线和面。 用法 import 'dart:async' ;... MapController mapController; StatefulMapController statefulMapController; StreamSubscription &lt; State

    TreasureHunt:TreasureHunt是一个程序评估任务。 傍晚6-12-18分

    寻宝TreasureHunt是一个程序评估... 从这一点开始,它将使用Map和traveler的模型设置以及ReadFileTravelerController,MakeTravelerController和MapController的Controller部分。 它通过文件提供的数据输出宝藏的方向。

    THREE.MapControls:(不推荐)THREE.js相机控件适用于平坦场景-平移,缩放和有限旋转

    三个MapControls 注意:不建议使用该项目。 请改用THREE.OrbitControls ,它支持水平平移模式。 对THREE.TrackballControls的修改,提供适用于平坦场景的摄像机控件-平移,缩放和有限旋转。 快速开始 ...

    stimulus-mapbox-gl:mapbox-gl的刺激控制器

    例如controllers/mapController.js : import { MapboxController } from "stimulus-mapbox-gl" ; export default class extends MapboxController { // Optional defaultConfig ( ) { return { /* your ...

    百度地图文档1

    百度地图入门 三大核心 BMapManager:百度引擎的管理工具。 MapView:显示地图的类,它的父类是ViewGroup. MapView 的MKMapViewListener MapController:对当前地图进行控制:缩放、旋转、平移。

    第一个人工作:第一次个人编程作业

    |MapController // 处理请求的控制器 |resource |spring |applicationContext.xml //spring配置文件 |dispatch-servlet.xml // springmvc配置文件 |webapp |WEB-INF |web.xml // web的配置 |index.jsp ...

Global site tag (gtag.js) - Google Analytics