Java Google Maps API 如何根据缩放值动态更新相机边界?
问题原因
while(true)死循环会直接阻塞Android主线程,所有UI渲染、用户交互逻辑都在主线程执行,阻塞后会直接触发应用无响应(ANR),完全不能用这种方式做持续监听。
解决方案
Google Maps Android SDK原生提供了相机状态变化监听器,你可以用OnCameraIdleListener(相机移动结束后触发,性能最优)或者OnCameraMoveListener(实时监听移动过程,回调更频繁)来检测缩放值变化。
实现步骤
- 把之前的局部缩放变量、初始边界变量改成类成员变量,避免每次回调被重置
// 类成员变量声明 private double mLastZoom; private LatLngBounds mParisBounds; // 记得初始化你的初始巴黎边界值
- 在
onMapReady回调中初始化参数,设置监听器
@Override public void onMapReady(GoogleMap googleMap) { mMap = googleMap; // 初始化初始缩放值 mLastZoom = mMap.getCameraPosition().zoom; // 初始化你的初始巴黎边界,这里是示例值,替换成你自己的初始边界 mParisBounds = LatLngBounds.builder() .include(new LatLng(48.815573, 2.224199)) .include(new LatLng(48.902157, 2.469921)) .build(); // 设置相机空闲监听器,缩放、平移结束后触发 mMap.setOnCameraIdleListener(() -> { double currentZoom = mMap.getCameraPosition().zoom; // 缩放值发生变化才执行逻辑 if (currentZoom != mLastZoom) { // 计算扩展边界用的坐标点 LatLng chgtBounds = new LatLng( mParisBounds.getCenter().latitude + (currentZoom - mLastZoom) * 0.001, mParisBounds.getCenter().longitude + (currentZoom - mLastZoom) * 0.001 ); // 更新边界和缓存的缩放值 mParisBounds = mParisBounds.including(chgtBounds); mLastZoom = currentZoom; // 应用新的边界到地图 mMap.setLatLngBoundsForCameraTarget(mParisBounds); } }); }
注意事项
- 调用
setLatLngBoundsForCameraTarget本身可能触发相机位置调整,进而再次触发OnCameraIdleListener,如果出现循环触发的情况,可以加一个布尔标志位,设置边界期间暂时跳过监听逻辑 - 建议给
mParisBounds加最大范围限制,避免多次缩放后边界无限制扩展,超出你需要的区域 - 如果需要缩放过程中实时更新边界,把
setOnCameraIdleListener换成setOnCameraMoveListener即可,不过要注意回调频率较高,不要做太耗时的操作
内容的提问来源于stack exchange,提问作者Blloopp
相关产品推荐
相关产品推荐

