1.界面布局准备:
(1)res-->layout中:
activity_main.xml:
<android.support.v4.widget.DrawerLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/drawer_layout"
android:layout_width="match_parent"
android:layout_height="match_parent">
<!-- 主内容界面 -->
<FrameLayout
android:id="@+id/content_frame"
android:layout_width="match_parent"
android:layout_height="match_parent">
<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>
</FrameLayout>
<!-- 导航抽屉 -->
<ListView
android:id="@+id/left_drawer"
android:layout_width="240dp"
android:layout_height="match_parent"
android:layout_gravity="start"
android:choiceMode="singleChoice"
android:divider="@android:color/transparent"
android:dividerHeight="0dp"
android:background="#111"/>
</android.support.v4.widget.DrawerLayout>
drawer_list_item.xml:
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@android:id/text1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textAppearance="?android:attr/textAppearanceListItemSmall"
android:gravity="center_vertical"
android:paddingLeft="16dp"
android:paddingRight="16dp"
android:textColor="#fff"
android:background="?android:attr/activatedBackgroundIndicator"
android:minHeight="?android:attr/listPreferredItemHeightSmall"/>
(2)res-->values中:
strings.xml:
<resources>
<string name="app_name">vector-tiled-layer</string>
<string name="mid_century_url">https://www.arcgis.com/home/item.html?id=7675d44bb1e4428aa2c30a9b68f97822</string>
<string name="colored_pencil_url">https://www.arcgis.com/home/item.html?id=4cf7e1fb9f254dcda9c8fbadb15cf0f8</string>
<string name="newspaper_url">https://www.arcgis.com/home/item.html?id=dfb04de5f3144a80bc3f9f336228d24a</string>
<string name="nova_url">http://www.arcgis.com/home/item.html?id=75f4dfdff19e445395653121a95a85db</string>
<string name="world_street_night_url">https://www.arcgis.com/home/item.html?id=86f556a2d1fd468181855a35e344567f</string>
<string-array name="vector_tiled_types">
<item>Mid-Century</item>
<item>Colored Pencil</item>
<item>Newspaper</item>
<item>Nova</item>
<item>World Street Map (Night)</item>
</string-array>
<string name="vector_tiled_layer">%1$s</string>
<string name="drawer_open">Open navigation drawer</string>
<string name="drawer_close">Close navigation drawer</string>
</resources>
(3)res-->menu中:
menu_main.xml:
<menu
xmlns:tools="http://schemas.android.com/tools" tools:context=".MainActivity">
</menu>
2.Activity中:
(1)变量准备:
//MapView控件变量
private MapView mMapView;
//矢量切片图层变量
private ArcGISVectorTiledLayer mVectorTiledLayer;
//侧边栏项(矢量切片)的名称数组
private String[] mNavigationDrawerItemTitles;
//实现侧边栏的DrawLayout
private DrawerLayout mDrawerLayout;
//矢量切片图层列表
private ListView mDrawerList;
//ActionBar抽屉开关变量
private ActionBarDrawerToggle mDrawerToggle;
(2)onCreate()中:
// 通过布局文件初始化MapView
mMapView = findViewById(R.id.mapView);
// 通过URL加载并创建矢量切片图层对象
mVectorTiledLayer = new ArcGISVectorTiledLayer(getString(R.string.mid_century_url));
// 设置切片图层作为底图
Basemap basemap = new Basemap(mVectorTiledLayer);
// 创建一个底图对象并设置底图
ArcGISMap map = new ArcGISMap(basemap);
// 通过经度、纬度、比例尺创建视点
Viewpoint vp = new Viewpoint(47.606726, -122.335564, 72223.819286);
// 初始化底图范围
map.setInitialViewpoint(vp);
// 显示底图
mMapView.setMap(map);
//通过资源文件String.xml获取Drawlist的元素名称
mNavigationDrawerItemTitles = getResources().getStringArray(R.array.vector_tiled_types);
//获取实现侧滑菜单的DrawerLayout的变量
mDrawerLayout = findViewById(R.id.drawer_layout);
//获取用来显示侧滑菜单项的ListView对象
mDrawerList = findViewById(R.id.left_drawer);
//创建并绑定用来控制侧边栏ListView样式的Adapter
mDrawerList.setAdapter(new ArrayAdapter<>(this,
R.layout.drawer_list_item, mNavigationDrawerItemTitles));
// 绑定侧边栏的点击事件
mDrawerList.setOnItemClickListener(new DrawerItemClickListener());
// 设定侧边栏的首项(默认的矢量切片图层)被选中
mDrawerList.setItemChecked(0, true);
//设置侧边栏抽屉
setupDrawer();
//设置ActionBar
if (getSupportActionBar() != null) {
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
getSupportActionBar().setHomeButtonEnabled(true);
}
//设置界面标题为默认显示的矢量切片图层名称
setTitle(getString(R.string.vector_tiled_layer, mNavigationDrawerItemTitles[0]));
(3)支持方法:
//侧边栏点击事件,继承自ListView点击事件接口(前面设置过)
private class DrawerItemClickListener implements ListView.OnItemClickListener {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
selectItem(position);
}
}
//点击事件的方法实现
private void selectItem(int position) {
//更新被选中的项和界面标题,然后关闭侧边栏抽屉
mDrawerList.setItemChecked(position, true);
setTitle(getString(R.string.vector_tiled_layer, mNavigationDrawerItemTitles[position]));
mDrawerLayout.closeDrawer(mDrawerList);
//更新MapView为侧边栏选中的矢量切片图层类型
String vectorTiledLayerUrl = null;
//判断选择的矢量切片图层名称索引,赋予相应的URL
switch (position) {
case 0:
vectorTiledLayerUrl = getString(R.string.mid_century_url);
break;
case 1:
vectorTiledLayerUrl = getString(R.string.colored_pencil_url);
break;
case 2:
vectorTiledLayerUrl = getString(R.string.newspaper_url);
break;
case 3:
vectorTiledLayerUrl = getString(R.string.nova_url);
break;
case 4:
vectorTiledLayerUrl = getString(R.string.world_street_night_url);
break;
}
// 通过URL创建新的矢量切片图层
mVectorTiledLayer = new ArcGISVectorTiledLayer(vectorTiledLayerUrl);
// 将新的矢量切片图层设为底图
mMapView.getMap().setBasemap(new Basemap(mVectorTiledLayer));
}
//设置侧边抽屉的方法是实现
private void setupDrawer() {
mDrawerToggle = new ActionBarDrawerToggle(this, mDrawerLayout, R.string.drawer_open, R.string.drawer_close) {
//当侧边栏抽屉处于完全开启状态时调用
public void onDrawerOpened(View drawerView) {
super.onDrawerOpened(drawerView);
invalidateOptionsMenu();//创建onPrepareOptionsMenu()的调用
// creates call to onPrepareOptionsMenu()
}
//当侧边栏抽屉处于完全关闭状态时调用
public void onDrawerClosed(View view) {
super.onDrawerClosed(view);
invalidateOptionsMenu(); //创建onPrepareOptionsMenu()的调用
// creates call to onPrepareOptionsMenu()
}
};
//设置抽屉能够使用
mDrawerToggle.setDrawerIndicatorEnabled(true);
//添加抽屉触发变量
mDrawerLayout.addDrawerListener(mDrawerToggle);
}
(4)其他重写的方法
//设置MapView随界面停止、恢复、销毁
@Override
protected void onPause() {
super.onPause();
mMapView.pause();
}
@Override
protected void onResume() {
super.onResume();
mMapView.resume();
}
@Override
protected void onDestroy() {
super.onDestroy();
mMapView.dispose();
}
//Activity彻底运行起来的回调
@Override
protected void onPostCreate(Bundle savedInstanceState) {
super.onPostCreate(savedInstanceState);
// Sync the toggle state after onRestoreInstanceState has occurred.
mDrawerToggle.syncState();
}
//当屏幕方向改变、弹出软键盘、关闭软键盘时不调用onCreate,调用此方法
@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
mDrawerToggle.onConfigurationChanged(newConfig);
}
//选项菜单创建后事件
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.menu_main, menu);
return true;
}
//菜单单项被选中的事件
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
// Activate the navigation drawer toggle
return (mDrawerToggle.onOptionsItemSelected(item)) || super.onOptionsItemSelected(item);
}
3.运行APP:可对显示的矢量切片地图进行浏览,且能够对其进行切换