Azure Maps在Android屏幕旋转时重置的解决方法咨询
解决Azure Maps屏幕旋转重置问题(Java)
方法一:通过OnReady回调恢复地图状态
Android屏幕旋转时默认会重建Activity,Azure Maps控件会随之重新初始化,导致地图视角重置。可以通过保存地图相机状态,再在地图加载完成后(OnReady回调)恢复状态来解决:
1. 保存地图状态
在Activity的onSaveInstanceState方法中,捕获当前地图的相机参数并保存到Bundle:
@Override protected void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); AzureMapControl mapControl = findViewById(R.id.map_control); if (mapControl != null && mapControl.isMapLoaded()) { CameraPosition camera = mapControl.getMap().getCameraPosition(); outState.putDouble("center_lat", camera.getCenter().getLatitude()); outState.putDouble("center_lon", camera.getCenter().getLongitude()); outState.putDouble("zoom", camera.getZoom()); outState.putDouble("pitch", camera.getPitch()); outState.putDouble("heading", camera.getHeading()); } }
2. 利用OnReady恢复状态
在Activity的onCreate方法中,设置地图的OnReady回调,待地图加载完成后读取保存的参数并恢复视角:
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); AzureMapControl mapControl = findViewById(R.id.map_control); mapControl.setAzureMapsSubscriptionKey("你的Azure Maps密钥"); mapControl.onReady(map -> { if (savedInstanceState != null) { double lat = savedInstanceState.getDouble("center_lat"); double lon = savedInstanceState.getDouble("center_lon"); double zoom = savedInstanceState.getDouble("zoom"); double pitch = savedInstanceState.getDouble("pitch"); double heading = savedInstanceState.getDouble("heading"); CameraPosition restoredPos = new CameraPosition( new LatLng(lat, lon), zoom, pitch, heading ); map.moveCamera(CameraUpdateFactory.newCameraPosition(restoredPos)); } }); }
方法二:阻止Activity重建(可选)
如果不想处理状态保存,可在AndroidManifest.xml中给目标Activity添加配置,让系统屏幕旋转时不重建Activity:
<activity android:name=".MainActivity" android:configChanges="orientation|screenSize"> <!-- 其他配置项 --> </activity>
注意:这种方式会跳过Activity的重建生命周期,若有依赖屏幕方向的逻辑,需在
onConfigurationChanged方法中手动处理。
内容的提问来源于stack exchange,提问作者Francisco Torres
相关产品推荐
相关产品推荐

