地图的显示
添加依赖:
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
compile 'com.amap.api:3dmap:5.0.0'
compile 'com.amap.api:location:3.3.0'
compile 'com.amap.api:search:5.0.0'
}
1.在布局文件中添加如下代码,并在onCreate() 中findViewById()
<com.amap.api.maps.MapView
android:id="@+id/map"
android:layout_width="wrap_content"
android:layout_height="match_parent" />
2.在onCreate() ,onRume(),onPause(),onSaveInstanceState(Bundle outState),onDestroy() 分别添加如下代码:
mapView.onCreate(savedInstanceState);// 此方法必须重写
mapView.onResume();
mapView.onPause();
mapView.onSaveInstanceState(outState);
mapView.onDestroy();
3.在onCreate()中初始化 并设置格式
(1)初始化Amap
if(aMap==null){
aMap=mapView.getMap();
}
(2)设置自定义样式,这个是在开发平台设置的,然后把文件导入项目而已
private void setMapCustomStyleFile(Context context) {
String styleName = "style_new.data";
InputStream inputStream = null;
try {
inputStream = context.getAssets().open(styleName);
byte[] b = new byte[inputStream.available()];
inputStream.read(b);
if(mapStyleOptions != null) {
// 设置自定义样式
mapStyleOptions.setStyleData(b);
}
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if (inputStream != null) {
inputStream.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
设置地图模式:
标准模式:
aMap.setMapType(AMap.MAP_TYPE_NORMAL);
卫星地图模式:
aMap.setMapType(AMap.MAP_TYPE_SATELLITE);
夜景地图模式:
aMap.setMapType(AMap.MAP_TYPE_NIGHT);
导航地图模式:
aMap.setMapType(AMap.MAP_TYPE_NAVI);
列表显示地图
(1)布局使用的是
<com.amap.api.maps.TextureMapView/>
也建议大家使用这个而不是MapView。
(2)初始化
getView() 中findViewById()并执行
mapHolder.mapView.onCreate(null);
mapView.onCreate(null);
没有添加marker前得清除掉
aAap.clear();
用集合存储地图对象,在某一时刻清除掉
列表里面缓存了很多地图对象,所以一定要调用销毁方法
public void onDestroy() {
for (TextureMapView mapView : mapViews) {
mapView.onDestroy();
}
}
(3)添加标记Marker
Marker marker1 = aMap.addMarker(new MarkerOptions().position(new LatLng(LatLng.latitude + 0.00015,
LatLng.longitude)).icon(BitmapDescriptorFactory.fromResource(R.drawable.car)));
aMap.moveCamera(CameraUpdateFactory.newLatLngZoom(LatLng, 18));
将地图移动到定位点,18 是缩放程度
aMap.addMarker这是关键
(4)添加线条
线由一组经纬度(LatLng对象)点连接而成
aMap.addPolyline((new PolylineOptions())
.addAll(new List<LatLng> polylinePoints)
.width(10));
(5)设置成室内地图
amap.showIndoorMap(true);
(6)移动地图 最后一个数字为缩放级别
aMap.moveCamera(CameraUpdateFactory.newLatLngZoom(new LatLng(36,56.565),19);
(7)关闭SDK自带的室内地图控件
aMap.getUiSettings().setIndoorSwitchEnabled(false);
(8) logo位置的设置 :左下,底部居中,右下
mUiSettings.setZoomPosition(AMapOptions.ZOOM_POSITION_RIGHT_BUTTOM);
设置地图默认的比例尺是否显示
mUiSettings.setScaleControlsEnabled(true)
设置地图默认的缩放按钮是否显示
mUiSettings.setZoomControlsEnabled(false)
设置地图默认的指南针是否显示
mUiSettings.setCompassEnabled(false)
设置地图默认的定位按钮是否显示
mUiSettings.setMyLocationButtonEnabled(false);
是否可触发定位并显示定位层
aMap.setMyLocationEnabled(false);
设置logo位置
mUiSettings.setLogoPosition(AMapOptions.LOGO_POSITION_BOTTOM_LEFT);
显示实时交通状况
aMap.setTrafficEnabled(false)
显示3D 楼块
aMap.showBuildings(false)
显示底图文字
aMap.showMapText()
自定义实时交通信息的颜色样式
MyTrafficStyle myTrafficStyle = new MyTrafficStyle();
myTrafficStyle.setSeriousCongestedColor(0xff92000a);
myTrafficStyle.setCongestedColor(0xffea0312);
myTrafficStyle.setSlowColor(0xffff7508);
myTrafficStyle.setSmoothColor(0xff00a209);
aMap.setMyTrafficStyle(myTrafficStyle);
设置地图是否可以手势滑动
mUiSettings.setScrollGesturesEnabled(true)
设置地图是否可以手势缩放大小
mUiSettings.setZoomGesturesEnabled(true)
设置地图是否可以倾斜
mUiSettings.setTiltGesturesEnabled(true)
设置地图是否可以旋转
mUiSettings.setRotateGesturesEnabled(true)
对amap添加单击地图事件监听器
aMap.setOnMapClickListener(this)
对amap添加长按地图事件监听器
aMap.setOnMapLongClickListener(this)
对amap添加移动地图事件监听器
aMap.setOnCameraChangeListener(this)
对amap添加触摸地图事件监听器
aMap.setOnMapTouchListener(this)
获取可视区域
VisibleRegion visibleRegion = aMap.getProjection().getVisibleRegion(); // 获取可视区域
LatLngBounds latLngBounds = visibleRegion.latLngBounds;// 获取可视区域的Bounds
boolean isContain = latLngBounds.contains(Constants.SHANGHAI);// 判断上海经纬度是否包括在当前地图可见区域
(9)底图poi点击事件
底图poi点击回调
mAMap.setOnPOIClickListener(this);
回调方法
public void onPOIClick(Poi poi)
Marker 点击回调
mAMap.setOnMarkerClickListener(this);
回调方法
public boolean onMarkerClick(Marker marker)
构造导航参数
NaviPara naviPara = new NaviPara();
设置终点位置
naviPara.setTargetPoint(marker.getPosition());
缩放移动地图,保证所有自定义marker在可视范围中 50为四周留空宽度 aMap.moveCamera(CameraUpdateFactory.newLatLngBounds(bounds, 50));
aMap.moveCamera(CameraUpdateFactory.newCameraPosition(new CameraPosition(new LatLng(), 18, 30, 30))))
带动画效果
aMap.animateCamera()
移动地图
aMap.moveCamera(CameraUpdateFactory.scrollBy(0, SCROLL_BY_PX))
缩小地图
aMap.moveCamera(CameraUpdateFactory.zoomOut(), null);
放大地图
CameraUpdateFactory.zoomIn()
对地图进行截图
aMap.getMapScreenShot(this)
设置最大最小缩放级别
aMap.setMinZoomLevel(Float.valueOf(minZoomLevel));
aMap.setMaxZoomLevel(Float.valueOf(maxZoomLevel));
aMap.moveCamera(CameraUpdateFactory.zoomTo(Float.valueOf(minZoomLevel)));
重置最大最小缩放级别
aMap.resetMinMaxZoomPreference();
在地图上添加marker
markerOption = new MarkerOptions().icon(BitmapDescriptorFactory.fromResource(R.drawable.icon_car))
.position(latlng)
.draggable(true);
marker = aMap.addMarker(markerOption);
加一个箭头对象(NavigateArrow)对象在地图上
aMap.addNavigateArrow(new NavigateArrowOptions().add(latlng1,
latlng2, latlng3, latlng4).width(20));
多边形的构造
Constants.SHANGHAI=new LatLng(31.238068, 121.501654);
/**
* 生成一个长方形的四个坐标点
*/
private List<LatLng> createRectangle(LatLng center, double halfWidth,
double halfHeight) {
List<LatLng> latLngs = new ArrayList<LatLng>();
latLngs.add(new LatLng(center.latitude - halfHeight, center.longitude - halfWidth));
latLngs.add(new LatLng(center.latitude - halfHeight, center.longitude + halfWidth));
latLngs.add(new LatLng(center.latitude + halfHeight, center.longitude + halfWidth));
latLngs.add(new LatLng(center.latitude + halfHeight, center.longitude - halfWidth));
return latLngs;
}
//第二步 多边形的绘制
注意了 这个得三个点以上才能绘制的
PolygonOptions polygonOptions = new PolygonOptions()
.addAll(createRectangle(Constants.SHANGHAI, 1, 1))
.fillColor(Color.LTGRAY).strokeColor(Color.RED).strokeWidth(10);
polygon = aMap.addPolygon(polygonOptions);
//第三步 空洞
aMap.moveCamera(CameraUpdateFactory.changeLatLng(Constants.SHANGHAI));
// 清除多边形的空心洞
if (polygon!=null)
polygon.setHoleOptions(null);
// 构建多边形空心配置项
注意了,这个也是三个点以上才能构建的
PolygonHoleOptions polygonOptions = new PolygonHoleOptions();
polygonOptions.addAll(createRectangle(new LatLng(31.238068, 121.501654), 0.25, 0.25));
// 构建圆形空心配置项
LatLng latLng = new LatLng(30.746626, 120.756966);
CircleHoleOptions circleOptions = new CircleHoleOptions();
circleOptions.center(latLng).radius(15000f);
List<BaseHoleOptions> list = new ArrayList<>();
list.add(polygonOptions);
list.add(circleOptions);
// 添加空心洞
polygon.setHoleOptions(list);
显示定位
/**
* 获取定位坐标
*/
public void initLocation() {
mlocationClient = new AMapLocationClient(this);
//初始化定位参数
mLocationOption = new AMapLocationClientOption();
//设置定位监听
mlocationClient.setLocationListener(this);
//设置定位模式为高精度模式,Battery_Saving为低功耗模式,Device_Sensors是仅设备模式
mLocationOption.setLocationMode(AMapLocationMode.Hight_Accuracy);
//设置定位间隔,单位毫秒,默认为2000ms
mLocationOption.setInterval(2000);
//设置是否只定位一次,默认为false
mLocationOption.setOnceLocation(true);
//设置setOnceLocationLatest(boolean b)接口为true,启动定位时SDK会返回最近3s内精度最高的一次定位结果。
//如果设置其为true,setOnceLocation(boolean b)接口也会被设置为true,反之不会。
mLocationOption.setOnceLocationLatest(true);
//设置定位参数
mlocationClient.setLocationOption(mLocationOption);
// 此方法为每隔固定时间会发起一次定位请求,为了减少电量消耗或网络流量消耗,
// 注意设置合适的定位时间的间隔(最小间隔支持为2000ms),并且在合适时间调用stopLocation()方法来取消定位请求
// 在定位结束后,在合适的生命周期调用onDestroy()方法
// 在单次定位情况下,定位无论成功与否,都无需调用stopLocation()方法移除请求,定位sdk内部会移除
//启动定位
mlocationClient.startLocation();
}
/**
* 高德定位回调
*/
@Override
public void onLocationChanged(AMapLocation amapLocation) {
if (amapLocation != null) {
Double latitude = amapLocation.getLatitude();
Double longitude = amapLocation.getLongitude();
}