准备工作
在正式进行2D 地图开发前请先参考AndroidStudio配置配置您的工程,并在这里获取开发包,开发中可以参考2D地图SDK参考手册使用相关接口
显示地图
首先,修改布局文件activity_main.xml,添加MapView,如下所示:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity" >
<com.tencent.tencentmap.mapsdk.map.MapView
android:id="@+id/mapview"
android:layout_width="fill_parent"
android:layout_height="fill_parent" />
</RelativeLayout>
然后,MainActivity代码如下所示:
public class MainActivity extends MapActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
}
运行程序,则可以显示地图了,如下图所示。
如果地图上有"鉴权失败"的红色水印,请按照这里添加开发者密钥。
地图生命周期
为了保证程序的安全性,确保程序退出后,清空地图占用的内存资源,开发者需要管理地图的生命周期。
如果用户使用继承自MapActivity的组件装载地图,则Map SDK会自动监听MapActivity的生命周期,实现对MapView的生命周期进行自动管理,开发者不需要对MapView的生命周期进行管理,如下所示:
public class MainActivity extends MapActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
}
如果用户没有使用继承自MapActivity的组件装载地图,比如使用继承自Activity、Fragment等组件,则需要开发者实现对MapView的生命周期进行管理。如果用户使用继承自Activity的组件装载地图,则需要在Activity的onPause()里,调用MapView的onPause(),在Activity的onDestroy()里,调用MapView的onDestroy(),如下代码所示:
public class MainActivity extends Activity {
MapView mapview=null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mapview=(MapView)findViewById(R.id.mapview);
mapview.onCreate(savedInstanceState);
}
@Override
protected void onDestroy() {
mapview.onDestroy();
super.onDestroy();
}
@Override
protected void onPause() {
mapview.onPause();
super.onPause();
}
@Override
protected void onResume() {
mapview.onResume();
super.onResume();
}
@Override
protected void onStop() {
mapview.onStop();
super.onStop();
}
}
地图设置
1. TencentMap类
腾讯地图的设置是通过TencentMap类进行设置,可以控制地图的底图类型、显示范围、缩放级别、添加/删除marker和图形,此外对于地图的各种回调监听也是绑定到TencentMap。下面是TencentMap类的使用示例:
//获取TencentMap实例
TencentMap tencentMap = mapView.getMap();
//设置卫星底图
tencentMap.setSatelliteEnabled(true);
//设置实时路况开启
tencentMap.setTrafficEnabled(true);
//设置地图中心点
tencentMap.setCenter(new LatLng(39, 116));
//设置缩放级别
tencentMap.setZoom(11);
2. UiSettings类
UiSettings类用于设置地图的视图状态,如Logo位置设置、比例尺位置设置、地图手势开关等。下面是UiSettings类的使用示例:
//获取UiSettings实例
UiSettings uiSettings = mapView.getUiSettings();
//设置logo到屏幕底部中心
uiSettings.setLogoPosition(UiSettings.LOGO_POSITION_CENTER_BOTTOM);
//设置比例尺到屏幕右下角
uiSettings.setScaleViewPosition(UiSettings.SCALEVIEW_POSITION_RIGHT_BOTTOM);
//启用缩放手势(更多的手势控制请参考开发手册)
uiSettings.setZoomGesturesEnabled(true);
标记
标记Marker指的是地图上由图标和信息窗标识的单个地点,不同的标记可以根据图标和改变信息窗的样式和内容加以区分。
1. 使用Marker
用户也可以使用Marker进行标注,Marker也提供了更丰富的属性和图标添加方式以满足用户的多种需求。具体代码如下所示:
Marker marker = tencentMap.addMarker(new MarkerOptions()
.position(SHANGHAI)
.title("上海")
.anchor(0.5f, 0.5f)
.icon(BitmapDescriptorFactory
.defaultMarker())
.draggable(true));
marker.showInfoWindow();// 设置默认显示一个infoWindow
运行,则标注添加成功,如下图所示。
2. 标记事件
标记支持点击监听、点击信息窗监听、拖动监听,示例代码如下:
//Marker点击事件
tencentMap.setOnMarkerClickListener(new OnMarkerClickListener() {
@Override
public boolean onMarkerClick(Marker arg0) {
// TODO Auto-generated method stub
return false;
}
});
//infoWindow点击事件
tencentMap.setOnInfoWindowClickListener(new OnInfoWindowClickListener() {
@Override
public void onInfoWindowClick(Marker arg0) {
// TODO Auto-generated method stub
}
});
//Marker拖拽事件
tencentMap.setOnMarkerDraggedListener(new OnMarkerDraggedListener() {
//拖拽开始时调用
@Override
public void onMarkerDragStart(Marker arg0) {
// TODO Auto-generated method stub
}
//拖拽结束后调用
@Override
public void onMarkerDragEnd(Marker arg0) {
// TODO Auto-generated method stub
}
//拖拽时调用
@Override
public void onMarkerDrag(Marker arg0) {
// TODO Auto-generated method stub
}
});
3. 自定义infoWindow
腾讯地图还提供了自定义infoWindow的设置接口,下面是简单示例:
tencentMap.setInfoWindowAdapter(new InfoWindowAdapter() {
//infoWindow关闭后调用,用户回收View
@Override
public void onInfoWindowDettached(Marker arg0, View arg1) {
// TODO Auto-generated method stub
}
//infoWindow弹出前调用,返回的view将作为弹出的infoWindow
@Override
public View getInfoWindow(Marker arg0) {
// TODO Auto-generated method stub
return null;
}
});
4. 使用OverlayItem
这个类作为兼容旧版本的标记功能,建议新用户不要使用。这里也给出了示例,具体代码如下所示:
GeoPoint p1 = new GeoPoint((int)(39.90403 * 1E6), (int)(116.407525 * 1E6));
GeoPoint p2 = new GeoPoint((int)(38.5 * 1E6), (int)(114.955 * 1E6));
LatLng SHANGHAI = new LatLng(31.238068, 121.501654);// 上海市经纬度
Drawable marker = getResources().getDrawable(R.drawable.route_start);
OverlayItem oiFixed = new OverlayItem(p1, "标注1", "不可拖拽");
oiFixed.setDragable(false);
OverlayItem oiDrag = new OverlayItem(p2, "标注2", "可拖拽,自定义图标", marker);
mapView.add(oiFixed);
mapView.add(oiDrag);
图形绘制
用户可以在地图上画出圆形、矩形、线段等几何图形标注关注的区域。用户也可以修改这些几何图形的颜色、边界、透明度等属性,绘制出合适的标注。
1. 折线
折线是由Polyline类定义的一组在地图上相连的线段,它由一组LatLng点按照一定顺序连接而成。
折线的实例化需要一个PolylienOptions对象,并向其中添加坐标点,添加坐标点的方式可以是每次添加一个点,也可以直接添加一个坐标点集合。添加折线的示例如下:
LList<LatLng> latLngs = new ArrayList<LatLng>();
latLngs.add(new LatLng(39.999391,116.135972));
latLngs.add(new LatLng(39.898323,116.057694));
latLngs.add(new LatLng(39.900430,116.265061));
latLngs.add(new LatLng(39.955192,116.140092));
Polyline polyline = tencentMap.addPolyline(new PolylineOptions().
addAll(latLngs).
color(0xff0066cc).
width(10f).
//为 polyline 添加纹理, 通常用于标记路线
arrowTexture(BitmapDescriptorFactory.fromAsset("texture_arrow.png")).
arrowGap(30).
edgeColor(0xff0072E3).
edgeWidth(5));
最终效果图如下:
2.多边形
多边形是由Polygon类定义的一组在地图上的封闭线段组成的图形,它由一组LatLng点按顺序连接而成的封闭图形。下面的代码展示了腾讯地图添加多边形的方法:
LatLng[] latLngs = {
new LatLng(39.873911,116.379548),
new LatLng(39.985538,116.448212),
new LatLng(39.946595,116.387788),
new LatLng(39.980277,116.305390)};
Polygon polygon = tencentMap.addPolygon(new PolygonOptions().
add(latLngs).
fillColor(0x99ff0000).
strokeColor(0xff2200ee).
strokeWidth(5));
3.圆
圆形是由Circle类定义的封闭曲线,在腾讯地图构造一个圆形需要确定它的圆心和半径,具体的示例代码如下:
LatLng latLng = new LatLng(39.984059,116.307771);
Circle circle = tencentMap.addCircle(new CircleOptions().
center(latLng).
radius(1000d).
fillColor(0x990000ff).
strokeColor(0xff33ee00).
strokeWidth(5));
运行程序,则标注显示如下图所示。
当程序退出或用户不再需要标注时,可以通过tencentMap.clearAllOverlays()删除标注。
地图事件
腾讯地图提供了丰富的回调事件,下面列出了腾讯地图2D SDK 支持的回调:
接口名 | 说明 |
---|---|
地图视图变化回调 | TencentMap.OnMapCameraChangeListener |
地图点击回调 | TencentMap.OnMapClickListener |
地图加载完成回调 | TencentMap.OnMapLoadedListener |
地图长按回调 | TencentMap.OnMapLongClickListener |
地图截图成功回调 | TencentMap.OnScreenShotListener |
下面只是TencentMap.OnMapLoadedListener 的简单示例,其余回调的使用都是类似的:
//地图加载完成回调
//地图显示范围等涉及到地图初始化问题的状态需要在地图加载完成后才能正常获取
tencentMap.setOnMapLoadedListener(new OnMapLoadedListener() {
@Override
public void onMapLoaded() {
// TODO Auto-generated method stub
}
});
投影工具
投影工具包含地图坐标与屏幕坐标的转换、地理坐标的直线距离计算、获取地图视图范围、获取比例尺等功能。下面是部分功能示例代码,更多接口描述请参考开发文档:
//获取projection实例
Projection projection = mapView.getProjection();
//计算两坐标见的直线距离
projection.distanceBetween(new LatLng(39, 116),new LatLng(38, 117));
//返回对应屏幕坐标的地理坐标
projection.fromScreenLocation(new Point(100, 100));
//返回对应地理坐标的屏幕坐标
projection.toScreenLocation(new LatLng(39, 116));
为IOVerlay 添加动画
在某些场景下,用户需要动画移动Marker、旋转Marker等操作时,可以下载 腾讯2D地图工具包 可以方便的为继承自 IOVerlay 的Marker等其他类添加动画。下面是为Marker添加动画的示例,更多配置可以参考Demo及压缩包中提供的Javadoc。
//Marker 将沿这条线移动
List<LatLng> line = new ArrayList<LatLng>();
line.add(new LatLng(39.98409,116.30804));
line.add(new LatLng(39.98409,116.3082));
line.add(new LatLng(39.98397,116.3081));
line.add(new LatLng(39.9823,116.30801));
line.add(new LatLng(39.9811,116.3083));
line.add(new LatLng(39.9821,116.3085));
Marker mMarker = mTencentMap.addMarker(
new MarkerOptions().
position(new LatLng(39.98409,116.30804)).
anchor(0.5f, 0.5f));
mTencentMap.setCenter(new LatLng(39.98409,116.30804));
mTencentMap.setZoom(16);
//设置动画
MarkerTranslateAnimator mTranslateAnimator =
new MarkerTranslateAnimator(mMarker, mMapView, 10 * 1000, line, true);
//开始执行动画
mTranslateAnimator.startAnimation();