1、自定义InfoWindow
重写InfoWindow的getInfoWindow()方法,返回一个View,如果这个View的根布局没有设置background,那么高德会给你外面套一层框框:
如果设置了background,哪怕是一个透明的颜色,就能达到我们想要的效果:
由于图片是拿另一个手机拍的,有点歪歪的。
2、设置地图缩放等级
高德地图默认显示的区域是很大的,比如我要显示比较详细的街道信息,就要设置一个较大的缩放等级:
aMap.moveCamera(CameraUpdateFactory.zoomTo(15));
但是,问题来了,有时候设置了没有起作用
好吧,那我设置一个监听,设置没有成功就重新设置:
private float zoom = 16;
aMap.moveCamera(CameraUpdateFactory.zoomTo(zoom));
aMap.setOnCameraChangeListener(new AMap.OnCameraChangeListener() {
@Override
public void onCameraChange(CameraPosition cameraPosition) {
}
@Override
public void onCameraChangeFinish(CameraPosition cameraPosition) {
if (cameraPosition.zoom != zoom) {
aMap.moveCamera(CameraUpdateFactory.zoomTo(zoom));
}
}
});
现在另外一个问题来了,这样设置之后,地图就不能缩放了,因为每次手动缩放之后,就会重新设置到zoom这个等级,好吧,那我们加一个标志,只对第一次加载的时候重新设置zoom:
private float zoom = 16;
private boolean isLoaded;
aMap.moveCamera(CameraUpdateFactory.zoomTo(zoom));
aMap.setOnCameraChangeListener(new AMap.OnCameraChangeListener() {
@Override
public void onCameraChange(CameraPosition cameraPosition) {
}
@Override
public void onCameraChangeFinish(CameraPosition cameraPosition) {
if (!isLoaded && cameraPosition.zoom != zoom) {
aMap.moveCamera(CameraUpdateFactory.zoomTo(zoom));
}
isLoaded = true;
}
});
但是。。。。。。。理论上来说,没得问题了,实际上你会发现有时候还是没有作用
分析原因,发现地图会加载两次,第一次加载的是默认地图(可能并不是你指定的经纬度),经过了一次回调,然后第二次加载的时候,不会再进入回调里面的设置代码了,因为isLoaded已经置true了,知道了原因修改就简单了,把isLoaded置true的代码放在括号里面就行了:
@Override
public void onCameraChangeFinish(CameraPosition cameraPosition) {
if (!isLoaded && cameraPosition.zoom != zoom) {
aMap.moveCamera(CameraUpdateFactory.zoomTo(zoom));
isLoaded = true;
}
}
3、不能正常定位
自动定位到非洲的海洋里面去了
看log日志也没有异常,增加一个定位监听:
aMap.setOnMyLocationChangeListener(new AMap.OnMyLocationChangeListener() {
@Override
public void onMyLocationChange(Location location) {
Log.e("map", location.toString());
}
});
然后在log中发现异常:
10-10 09:41:47.290 27722-27722/com.ht.test E/map: latitude=0.0#longitude=0.0#province=#city=#district=#cityCode=#adCode=#address=#country=#road=#poiName=#street=#streetNum=#aoiName=#poiid=#floor=#errorCode=12#errorInfo=缺少定位权限 请到http://lbs.amap.com/api/android-location-sdk/guide/utilities/errorcode/查看错误码说明,错误详细信息:定位权限被禁用,请授予应用定位权限#1201 请到http://lbs.amap.com/api/android-location-sdk/guide/utilities/errorcode/查看错误码说明,错误详细信息:定位权限被禁用,请授予应用定位权限#1201#locationDetail=定位权限被禁用,请授予应用定位权限#1201#locationType=0
原来是没有定位权限,Android 6.0以后,定位权限需要动态申请,java代码申请权限即可。
然后,还是不行,看log:
10-10 09:37:02.020 22915-22915/com.ht.test E/map: latitude=0.0#longitude=0.0#province=#city=#district=#cityCode=#adCode=#address=#country=#road=#poiName=#street=#streetNum=#aoiName=#poiid=#floor=#errorCode=7#errorInfo=KEY错误 请到http://lbs.amap.com/api/android-location-sdk/guide/utilities/errorcode/查看错误码说明,错误详细信息:auth fail:INVALID_USER_SCODE#SHA1AndPackage#C4:2B:3E:6E:3C:CE:83:63:6A:30:5A:B7:BD:70:65:34:13:04:74:78:com.ht.test#gsid#3ce427c57a5fd872c4cb4ef864a9c4d7#csid#e2fb592fe470496487546e65bc51eaf6#0701 请到http://lbs.amap.com/api/android-location-sdk/guide/utilities/errorcode/查看错误码说明,错误详细信息:auth fail:INVALID_USER_SCODE#SHA1AndPackage#C4:2B:3E:6E:3C:CE:83:63:6A:30:5A:B7:BD:70:65:34:13:04:74:78:com.ht.test#gsid#3ce427c57a5fd872c4cb4ef864a9c4d7#csid#e2fb592fe470496487546e65bc51eaf6#0701#locationDetail=auth fail:INVALID_USER_SCODE#SHA1AndPackage#C4:2B:3E:6E:3C:CE:83:63:6A:30:5A:B7:BD:70:65:34:13:04:74:78:com.ht.test#gsid#3ce427c57a5fd872c4cb4ef864a9c4d7#csid#e2fb592fe470496487546e65bc51eaf6#0701#locationType=0
额,key错误,把高德后台申请到的key填到manifest中即可。
4、显示多点,并且视图刚好把所有点包起来
MultiPointOverlayOptions overlayOptions = new MultiPointOverlayOptions();
overlayOptions.icon(BitmapDescriptorFactory.fromResource(R.drawable.map_light));//点的图片
overlayOptions.anchor(0.5f,0.5f); //设置锚点
MultiPointOverlay multiPointOverlay = mBinding.mapView.getMap().addMultiPointOverlay(overlayOptions);
List<MultiPointItem> list = new ArrayList<MultiPointItem>();
LatLngBounds.Builder latLngBounds = LatLngBounds.builder();
for(BeanLight bean : beanLights) {
//创建MultiPointItem存放,海量点中某单个点的位置及其他信息
MultiPointItem multiPointItem = new MultiPointItem(new LatLng(Double.valueOf(bean
.latitude), Double.valueOf(bean.longitude)));
multiPointItem.setCustomerId(bean.lightCode);
list.add(multiPointItem);
latLngBounds.include(new LatLng(Double.valueOf(bean
.latitude), Double.valueOf(bean.longitude)));
}
multiPointOverlay.setItems(list);//将规范化的点集交给海量点管理对象设置,待加载完毕即可看到海量点信息
mBinding.mapView.getMap().moveCamera(CameraUpdateFactory.newLatLngBounds
(latLngBounds.build(), 50));
BeanLight代码:
public class BeanLight extends BeanBase {
public String lightCode;
public String longitude;
public String latitude;
}
5、通过屏幕某点坐标获取该点定位
通过aMap.getProjection().fromScreenLocation(x, y)方法可以通过屏幕某点坐标获取该点的经纬度,高德解释如下:
根据转入的屏幕位置返回一个地图位置(经纬度)。
但是他这里所说的屏幕并不包括系统状态栏的高度,所以和view.getLocationOnScreen()方法配合使用时,会有一个高度差。比如:
public LatLng getMapCenterPoint(View view) {
Projection projection = aMap.getProjection();
int[] location = new int[2];
view.getLocationOnScreen(location);
LatLng pt = projection.fromScreenLocation(new Point(location[0],
location[1]));
return pt;
}
通过这个方法获取该view在地图上的经纬度,结果老是有误差,通过根view在屏幕上的坐标可以消除该误差:
public LatLng getMapCenterPoint(View rootView, View view) {
Projection projection = aMap.getProjection();
int[] rootLocation = new int[2];
rootView.getLocationOnScreen(rootLocation);
int[] location = new int[2];
view.getLocationOnScreen(location);
LatLng pt = projection.fromScreenLocation(new Point(location[0],
location[1] - rootLocation[1]));
return pt;
}