如何在Mapbox的Android/iOS端获取Camera视口的像素尺寸?
解决方案
Android 端
Mapbox Camera的视口像素尺寸和MapView的实际绘制尺寸完全一致,直接获取MapView的宽高即可:
- 要在布局渲染完成后获取尺寸,避免拿到0值,可以通过
ViewTreeObserver.OnGlobalLayoutListener监听布局完成事件,或者在onWindowFocusChanged回调中取值 - 也可以直接调用Mapbox 10+版本
MapboxMap实例的getSize()方法直接获取视口尺寸
适配后的代码示例:
// 需在MapView完成布局后调用,否则拿到的height为0 int viewportHeight = mapView.getHeight(); // 按需调整比例,比如设置顶部padding为视口高度的40%,替代原硬编码数值 double topPadding = viewportHeight * 0.4; double[] padding = {0, topPadding, 0, 0}; return new CameraPosition.Builder() .padding(padding) .target(center) .bearing(getDirectionForUserLocationUpdate()) .tilt(mPitch) .zoom(zoomLevel) .build();
iOS 端
Mapbox 视口尺寸对应MGLMapView的bounds尺寸:
- 取
mapView.bounds.size即可拿到视口的点尺寸,需要像素值的话乘以UIScreen.main.scale即可 - 同样要在视图布局完成后取值,不要在
viewDidLoad中直接获取
适配后的代码示例(Swift):
// 需在viewDidLayoutSubviews或布局完成后调用 let viewportHeight = mapView.bounds.height // 按需调整比例,设置顶部padding为视口高度的40% let topPadding = viewportHeight * 0.4 mapView.setCamera( camera, withEdgeInsets: UIEdgeInsets(top: topPadding, left: 0, bottom: 0, right: 0), animated: true )
注意事项
- 如果
MapView本身设置了padding或者被其他视图遮挡,计算时要自行扣除对应区域的尺寸 - 用比例计算的方式可以适配所有屏幕尺寸,不需要写死固定像素值
内容的提问来源于stack exchange,提问作者user16967562
相关产品推荐
相关产品推荐

