如何在使用 GoogleMap 的活动完全加载之前显示进度条

Posted

技术标签:

【中文标题】如何在使用 GoogleMap 的活动完全加载之前显示进度条【英文标题】:How to display progressbar before activity with GoogleMap is fully loaded 【发布时间】:2017-10-24 01:32:28 【问题描述】:

我的一项活动中有一个 Mapview。每当单击按钮并打开包含 Mapview 的 Activity 时,它会冻结当前的 Activity UI,直到具有 MapView 的 Activity 完全加载。我的 onCreate() 方法中有以下代码:

mMapView = (MapView) findViewById(R.id.map);
    if(mMapView != null)
        mMapView.onCreate(null);
        mMapView.onResume();
       mMapView.getMapAsync(JobDetail.this);
    

并且活动本身实现了 OnMapReadyCallback:

@Override
public void onMapReady(GoogleMap googleMap) 

    MapsInitializer.initialize(JobDetail.this);

    mGoogleMap = googleMap;
    googleMap.setMapType(GoogleMap.MAP_TYPE_NORMAL);

    if(latitude!= null && longitude!= null)
        googleMap.addMarker(new MarkerOptions().position(new LatLng(latitude,longitude)).title(post_location));
        CameraPosition markposition = CameraPosition.builder().target(new LatLng(latitude,longitude)).zoom(16).bearing(0).tilt(45).build();
        googleMap.moveCamera(CameraUpdateFactory.newCameraPosition(markposition));
    

如何使屏幕变暗并显示进度条,直到使用 googlemapview 的活动完全加载并准备好显示?我已经阅读了一些建议使用 Asynctask 的答案,但是如何使用 GoogleMapView 做到这一点?

【问题讨论】:

【参考方案1】:

您可以做的是:在调用活动时显示进度,在 onMapReady() 中关闭或隐藏进度并将可见性属性更改为可见。 类似的东西:

@Override
protected void onCreate(Bundle savedInstanceState) 
    super.onCreate(savedInstanceState);
    mProgressBar = (ProgressBar) findViewById(R.id.progressbar);
    mMapView = (MapView) findViewById(R.id.map);
    mMapView.setVisibility(View.INVISIBLE);
    progressBar.setVisibility(View.VISIBLE);


@Override
public void onMapReady(GoogleMap googleMap) 
    MapsInitializer.initialize(JobDetail.this);

    mGoogleMap = googleMap;
    googleMap.setMapType(GoogleMap.MAP_TYPE_NORMAL);

    if(latitude!= null && longitude!= null)
        googleMap.addMarker(new MarkerOptions().position(new LatLng(latitude,longitude)).title(post_location));
        CameraPosition markposition = CameraPosition.builder().target(new LatLng(latitude,longitude)).zoom(16).bearing(0).tilt(45).build();
        googleMap.moveCamera(CameraUpdateFactory.newCameraPosition(markposition));
    

    mMapView.setVisibility(View.VISIBLE);
    progressBar.setVisibility(View.INVISIBLE);

【讨论】:

【参考方案2】:

它会冻结 UI,直到 Activity 完全加载

我不认为加载地图首先应该冻结 UI。我有一个应用程序,在一个活动中,地图占据了整个房地产,而在另一个活动中,地图占据了屏幕的一半以及一些图像和文本视图。在这两种情况下,我都没有在 UI 中看到任何冻结。请参阅下面我的代码 sn-p。

mMapView = (MapView) rootView.findViewById(R.id.mapView);
mMapView.onCreate(savedInstanceState);
mMapView.onResume(); // needed to get the map to display immediately

try 
    Log.i(TAG, "initializing map");
    MapsInitializer.initialize(mContext);
 catch (Exception e) 
    Log.e(TAG, "error while initializing map screen" + e);
    e.printStackTrace();


mMapView.getMapAsync(new OnMapReadyCallback() 
    @Override
    public void onMapReady(GoogleMap mMap) 
        googleMap = mMap;
        googleMap.setOnCameraIdleListener(new GoogleMap.OnCameraIdleListener() 
            @Override
            public void onCameraIdle() 
                mCameraReady = true;
                if(latitude!= null && longitude!= null)
                    googleMap.addMarker(new MarkerOptions().position(new LatLng(latitude,longitude)).title(post_location));
                    CameraPosition markposition = CameraPosition.builder().target(new LatLng(latitude,longitude)).zoom(16).bearing(0).tilt(45).build();
                    googleMap.moveCamera(CameraUpdateFactory.newCameraPosition(markposition));
                
                googleMap.setOnCameraIdleListener(null);
            
        );
    
);

除了

之外,它与您的相似
    MapsInitializer.initialize() 的调用点。 我在绘制标记和缩放之前等待相机准备好。

我认为 #1 并不重要,根据 android documentation,调用本身是不必要的。所以试试#2吧。

希望这会有所帮助。

【讨论】:

感谢您的回答。请参阅我编辑的问题。我的意思是在进入包含 MapView 的活动之前,它会冻结当前的活动 UI。我怀疑它在准备好显示之前正在加载 googlemap 我也看不到地图视图如何冻结当前活动。我认为冻结根本不是因为地图组件。您是否尝试从活动中删除地图组件并检查冻结问题是否消失?

以上是关于如何在使用 GoogleMap 的活动完全加载之前显示进度条的主要内容,如果未能解决你的问题,请参考以下文章

如何在使用数据加载列表视图之前在具有列表视图的活动中显示进度条(圆圈)

AngularJS:如何在页面完全加载之前显示预加载或加载?

如何在不清除 GoogleMap 的情况下更新多个位置

如何在继续使用 Javascript 之前完全加载页面?

Android animateCamera GoogleMap.CancelableCallback 用法

显示加载图标,直到Firebase firestore将数据完全加载到textview中