推荐给大家一篇比较好的博客:
https://blog.csdn.net/bit_kaki/article/details/77743332?locationNum=8&fps=1
一.public void addDrawStatusChangedListener (DrawStatusChangedListener listener)
整个地图的绘图状态更改
监听在MapView的DrawStatus更改时调用的DrawStatusChangedListener,例如,当地图最初完成加载时,或者在地图导航后完成加载切片和要素。
要了解有关查看特定图层的状态更改的信息,请改用该 addLayerViewStateChangedListener(LayerViewStateChangedListener)方法。
如果从UI线程添加该侦听器,则将在UI线程上调用此侦听器,否则无法保证在哪个线程上调用侦听器。
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<!-- MapView -->
<com.esri.arcgisruntime.mapping.view.MapView
android:id="@+id/mapView"
android:layout_width="match_parent"
android:layout_height="match_parent"></com.esri.arcgisruntime.mapping.view.MapView>
<ProgressBar
android:id="@+id/progressBar"
style="?android:attr/progressBarStyleLarge"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:indeterminate="true" />
</RelativeLayout>
public class DisplayDrawingStatusActivity extends AppCompatActivity {
private MapView mMapView;
private String service_feature_table_url = "http://sampleserver6.arcgisonline.com/arcgis/rest/services/DamageAssessment/FeatureServer/0";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_display_drawing_status);
final ProgressBar progressBar = (ProgressBar) findViewById(R.id.progressBar);
mMapView = (MapView) findViewById(R.id.mapView);
ArcGISMap map = new ArcGISMap(Basemap.createTopographic());
Envelope targetExtent = new Envelope(-13639984.0, 4537387.0, -13606734.0, 4558866.0,
SpatialReferences.getWebMercator());
Viewpoint initViewpoint = new Viewpoint(targetExtent);
map.setInitialViewpoint(initViewpoint);
ServiceFeatureTable svcFeaturetable = new ServiceFeatureTable(service_feature_table_url);
FeatureLayer featureLayer = new FeatureLayer(svcFeaturetable);
map.getOperationalLayers().add(featureLayer);
mMapView.setMap(map);
mMapView.addDrawStatusChangedListener(new DrawStatusChangedListener() {
@Override
public void drawStatusChanged(DrawStatusChangedEvent drawStatusChangedEvent) {
if (drawStatusChangedEvent.getDrawStatus() == DrawStatus.IN_PROGRESS) {
progressBar.setVisibility(View.VISIBLE);
Log.d("drawStatusChanged", "spinner visible");
} else if (drawStatusChangedEvent.getDrawStatus() == DrawStatus.COMPLETED) {
progressBar.setVisibility(View.INVISIBLE);
}
}
});
}
@Override
protected void onPause() {
super.onPause();
mMapView.pause();
}
@Override
protected void onResume() {
super.onResume();
mMapView.resume();
}
@Override
protected void onDestroy() {
super.onDestroy();
mMapView.dispose();
}
}
二.public void addLayerViewStateChangedListener (LayerViewStateChangedListener listener)
监听地图中任何图层的视图状态发生更改时调用的LayerViewStateChangedListener,例如,如果图层进入或超出可见比例范围,或者使其可见或不可见。
要了解整个地图的绘图状态更改,请改用该 addDrawStatusChangedListener(DrawStatusChangedListener)方法。
如果从UI线程添加该侦听器,则将在UI线程上调用此侦听器,否则无法保证在哪个线程上调用侦听器。
状态枚举类:
public enum LayerViewStatus {
ACTIVE,
NOT_VISIBLE,
OUT_OF_SCALE,
LOADING,
ERROR;
private LayerViewStatus() {
}
}
官方案例:
final ArcGISMap mMap = new ArcGISMap(Basemap.createTopographic());
mMap.getOperationalLayers().add(tiledLayer);
mMap.getOperationalLayers().add(imageLayer);
mMap.getOperationalLayers().add(featureLayer);
mMapView.setMap(mMap);
// zoom to custom ViewPoint
mMapView.setViewpoint(new Viewpoint(new Point(-11e6, 45e5, SpatialReferences.getWebMercator()), MIN_SCALE));
// 监听地图中任何图层的视图状态发生更改时调用的LayerViewStateChangedListener,
// 例如,如果图层进入或超出可见比例范围,或者使其可见或不可见。
mMapView.addLayerViewStateChangedListener(new LayerViewStateChangedListener() {
@Override
public void layerViewStateChanged(LayerViewStateChangedEvent layerViewStateChangedEvent) {
// get the layer which changed it's state
Layer layer = layerViewStateChangedEvent.getLayer();
// get the View Status of the layer
// View status will be either of ACTIVE, ERROR, LOADING, NOT_VISIBLE, OUT_OF_SCALE, UNKNOWN
String viewStatus = layerViewStateChangedEvent.getLayerViewStatus().iterator().next().toString();
final int layerIndex = mMap.getOperationalLayers().indexOf(layer);
// finding and updating status of the layer
switch (layerIndex) {
case TILED_LAYER:
timeZoneTextView.setText(viewStatusString(viewStatus));
break;
case IMAGE_LAYER:
worldCensusTextView.setText(viewStatusString(viewStatus));
break;
case FEATURE_LAYER:
recreationTextView.setText(viewStatusString(viewStatus));
break;
}
}
});
/**
* The method looks up the view status of the layer and returns a string which is displayed
*
* @param status View Status of the layer
* @return String equivalent of the status
*/
private String viewStatusString(String status) {
switch (status) {
case "ACTIVE":
return getApplication().getString(R.string.active);
case "ERROR":
return getApplication().getString(R.string.error);
case "LOADING":
return getApplication().getString(R.string.loading);
case "NOT_VISIBLE":
return getApplication().getString(R.string.notVisible);
case "OUT_OF_SCALE":
return getApplication().getString(R.string.outOfScale);
}
return getApplication().getString(R.string.unknown);
}