Google Map API标记距离过远无法全部显示,如何让标记适配手机屏幕?
解决方案
你需要通过LatLngBounds计算所有标记的坐标范围,控制地图相机缩放到该范围即可实现所有标记适配屏幕显示,同时可自定义内边距避免标记被屏幕边缘截断。
核心修改逻辑
- 构建包含所有标记坐标的
LatLngBounds对象 - 在地图加载完成的回调中调用相机更新方法,将视图移动到刚好覆盖所有标记的范围
修改后的完整代码
static final LatLng HAMBURG = new LatLng(46.227638, 2.213749); // 示例坐标 static final LatLng HAMBURG_2 = new LatLng(-44.339565,147.637862); // 示例坐标 MapView map; map = findViewById(R.id.mapView); map.onCreate(null); map.getMapAsync(new OnMapReadyCallback() { @Override public void onMapReady(final GoogleMap googleMap) { // 添加两个标记 googleMap.addMarker(new MarkerOptions() .position(HAMBURG) .title("First Pit Stop") .icon(BitmapDescriptorFactory .defaultMarker(BitmapDescriptorFactory.HUE_RED))); googleMap.addMarker(new MarkerOptions() .position(HAMBURG_2) .title("Wrong Turn!") .icon(BitmapDescriptorFactory .defaultMarker(BitmapDescriptorFactory.HUE_RED))); googleMap.setOnMapLoadedCallback(new GoogleMap.OnMapLoadedCallback() { @Override public void onMapLoaded() { // 添加折线 PolylineOptions options = new PolylineOptions().width(5).color(Color.BLACK); options.add(HAMBURG, HAMBURG_2); googleMap.addPolyline(options); // 构建包含所有标记的坐标边界 LatLngBounds.Builder boundsBuilder = new LatLngBounds.Builder(); boundsBuilder.include(HAMBURG); boundsBuilder.include(HAMBURG_2); LatLngBounds bounds = boundsBuilder.build(); // 第二个参数是屏幕内边距,单位为像素,可根据需求调整 CameraUpdate cameraUpdate = CameraUpdateFactory.newLatLngBounds(bounds, 100); // 若需要缩放动画可替换为googleMap.animateCamera(cameraUpdate) googleMap.moveCamera(cameraUpdate); } }); map.onResume(); } });
注意事项
- 内边距数值可根据你的页面布局灵活调整,若地图区域顶部有悬浮标题栏,可使用重载方法
newLatLngBounds(bounds, paddingLeft, paddingTop, paddingRight, paddingBottom)单独设置四个方向的内边距 - 后续新增标记时,只需将新标记的
LatLng加入boundsBuilder即可自动适配所有标记的显示范围 - 必须在地图加载完成的回调中执行边界适配逻辑,避免地图尺寸未初始化导致的适配错误
内容的提问来源于stack exchange,提问作者kam
相关产品推荐
相关产品推荐

