ArcGIS Runtime SDK for Android 进阶:通过侧滑菜单实现图层切换---以矢量切片图层为例

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:可对显示的矢量切片地图进行浏览,且能够对其进行切换

      


猜你喜欢

转载自blog.csdn.net/Smart3S/article/details/81036606