安卓智能地图开发与实施九:地图缩放与旋转 - ArcGIS Runtime SDK for Android(Version 100.0.0)

0
分享 2017-08-21
移动电子地图缩放与旋转
MapView(com.esri.arcgisruntime.mapping.view.MapView)自身提供手势操作来放大、缩小、旋转。当通过按钮或者说事件来调整电子地图放大、缩小、旋转时,需要稍微调整。

MapView提供了和放大、缩小、旋转相关的方法如下: setViewpointAsync:改变当前移动电子地图的视图范围 setViewpointRotationAsync:改变旋转角度 setViewpointScaleAsync:改变比例尺

注:当使用本地切片时,很难获取到Layer的所有Scale(比例尺),无法一级一级缩放。当然,使用在线切片地图作为基础底图时可以采用setViewpointScaleAsync方法一级一级缩放。
电子地图旋转

直接使用setViewpointScaleAsync方法。指北参数为0。
MapView mainMapView =
(MapView) findViewById(R.id.mMapView);
mainMapView.setViewpointRotationAsync(0);

电子地图缩放

操作稍微有点复杂,因为没有直接的ZoomIn和ZoomOut方法。可以通过设置Viewpoint(setViewpointAsync)和Scale(setViewpointScaleAsync)来实现。使用设置Scale较为简便。
double mScale = mainMapView.getMapScale();
mainMapView.setViewpointScaleAsync(mScale*0.5);
mainMapView.setViewpointScaleAsync(mScale*2);

隐藏电子地图的网格
MapView(com.esri.arcgisruntime.mapping.view.MapView)默认提供了带有网格效果,通过其setBackgroundGrid ()方法,来设置,接收参数为 BackgroundGrid(com.esri.arcgisruntime.mapping.view.BackgroundGrid)
BackgroundGrid mainBackgroundGrid = new BackgroundGrid();
mainBackgroundGrid.setColor(0xffffffff);
mainBackgroundGrid.setGridLineColor(0xffffffff);
mainBackgroundGrid.setGridLineWidth(0);
mainMapView.setBackgroundGrid(mainBackgroundGrid);

基本的安卓程序框架
主要包括台头(ToolBar)、MapView对象、地图浮动按钮以及图层管理侧滑面板。 Android Studio已经提供了基本的控件,例如DrawerLayout、ToolBar、LinearLayout、ConstraintLayout、NavigationView等帮助我们构建一个基本的安卓程序框架。

创建空工程




详细步骤参考 安卓智能地图开发与实施三:创建第一个地图程序 - ArcGIS Runtime SDK for Android(Version 100.0.0)。 <a href="http://blog.csdn.net/allenlu20 ... 12432

隐藏原有的ActionBar




添加无ActionBar样式,并在AndroidManifest.xml中指向该样式。

style.xml文件


 
 <resources>

<!-- Base application theme. -->
<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
<!-- Customize your theme here. -->
<item name="colorPrimary">@color/colorPrimary</item>
<item name="colorPrimaryDark">@color/colorPrimaryDark</item>
<item name="colorAccent">@color/colorAccent</item>
</style>
<style name="AppTheme.NoActionBar">
<item name="windowActionBar">false</item>
<item name="windowNoTitle">true</item>
<item name="android:windowFullscreen">true</item>
</style>
<style name="AppTheme.AppBarOverlay" parent="ThemeOverlay.AppCompat.Dark.ActionBar" />
<style name="AppTheme.PopupOverlay" parent="ThemeOverlay.AppCompat.Light" />
</resources>

替换主程序依托类



使用DrawerLayout布局,主要是为了后续做侧滑面板。继承Application新制作自定义类,是为了存储自定义变量,方便各个模块之间调用。

注意,需要添加引用(DrawerLayout、NavigationView),
compile 'com.android.support:support-v4:25.3.1' compile 'com.android.support:design:25.3.1'

自定义Activity



继承AppCompatActivity新制作自定义Activity,主要用以分离业务类代码。
package esrichina.hymn.usingmappingbyhymnlocal;

import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v4.view.GravityCompat;
import android.support.v4.view.MenuItemCompat;
import android.support.v4.widget.DrawerLayout;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.SearchView;
import android.view.Menu;
import android.view.MenuItem;

import com.esri.arcgisruntime.mapping.view.MapView;

import esrichina.hymn.Bootstrap.TypefaceProvider;
import esrichina.hymn.Methods.MapViewMethodsClass;
import esrichina.hymn.usingmappingbyhymnlocal.Components.MainActivityHeaderComponent;
import esrichina.hymn.usingmappingbyhymnlocal.Components.MainManagerLayerComponent;
import esrichina.hymn.usingmappingbyhymnlocal.Components.MainMapFloatButtonComponent;

/** * Created by HymnHan on 2017/5/10. */

public class HymnActivity extends AppCompatActivity {
public static HymnActivity mainHymnActivity;
protected Configurations mainConfigurations;
private MapView mainMapView;
private DrawerLayout mainContainer;

//Activity 台头模块
private MainActivityHeaderComponent mainActivityHeaderComponent;
//Mapview 地图浮动按钮模块
private MainMapFloatButtonComponent mainMapFloatButtonComponent;
//LayerManager 地图图层管理
public MainManagerLayerComponent mainManagerLayerComponent;
public HymnActivity() {
super();
}
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mainHymnActivity = this;
mainConfigurations = (Configurations) getApplication();
TypefaceProvider.registerDefaultIconSets();
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.main_activity_header_menu, menu);
MenuItem menuItem = menu.findItem(R.id.action_search);//在菜单中找到对应控件的item
SearchView searchView = (SearchView) MenuItemCompat.getActionView(menuItem);
return true;
}
public void Configurations(MapView mMapView, DrawerLayout mDrawerLayout){
mainMapView = mMapView;
mainContainer = mDrawerLayout;
mainConfigurations.ConfigurationsFunction(mMapView,mDrawerLayout);
//初始化台头
mainActivityHeaderComponent = new MainActivityHeaderComponent();
//初始化地图浮动按钮
mainMapFloatButtonComponent = new MainMapFloatButtonComponent();
//初始化地图图层管理
mainManagerLayerComponent = new MainManagerLayerComponent();
}
public void CloseDrawerFunction() {
if (mainContainer != null) {
mainContainer.closeDrawer(GravityCompat.START);
mainContainer.closeDrawer(GravityCompat.END);
}
}

public void OpenLeftDrawerFunction() {
if (mainContainer != null) {
mainContainer.openDrawer(GravityCompat.START);
}
}

public void OpenRightDrawerFunction() {
if (mainContainer != null) {
mainContainer.openDrawer(GravityCompat.END);
}
}
public Configurations getMainConfigurations() {
return mainConfigurations;
}
public MapView getMainMapView() {
return mainMapView;
}
public DrawerLayout getMainContainer() {
return mainContainer;
}
}


制作ToolBar



使用安卓自带的ToolBar,制作基本框架的台头。

main_activity_header_container.xml文件:
<?xml version="1.0" encoding="utf-8"?>
<android.support.design.widget.CoordinatorLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="esrichina.hymn.mapbasicframeworkbyhymn.MainActivity">
<android.support.design.widget.AppBarLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:theme="@style/AppTheme.AppBarOverlay">
<android.support.v7.widget.Toolbar
android:id="@+id/mainHeaderToolBar"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
android:background="?attr/colorPrimary"
app:popupTheme="@style/AppTheme.PopupOverlay" >
</android.support.v7.widget.Toolbar>
</android.support.design.widget.AppBarLayout>
</android.support.design.widget.CoordinatorLayout>

MainActivityHeaderComponent.java文件:
package esrichina.hymn.mapbasicframeworkbyhymn.Components;

import android.support.v7.widget.Toolbar;

import esrichina.hymn.mapbasicframeworkbyhymn.R;

/** * Created by HymnHan on 2017/5/11. */

public class MainActivityHeaderComponent extends BaseComponent {
public MainActivityHeaderComponent() {
Toolbar toolbar = (Toolbar) mainHymnActivity.findViewById(R.id.mainHeaderToolBar);
toolbar.setLogo(R.mipmap.ic_launcher);
toolbar.setTitle(R.string.app_name);
toolbar.setSubtitle(R.string.sub_app_name);
mainHymnActivity.setSupportActionBar(toolbar);
}
}

制作地图布局文件




地图浮动按钮文件(main_map_floatbutton_container.xml):
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="48dp"
android:layout_height="wrap_content"
app:layout_constraintTop_toTopOf="parent"
android:layout_marginTop="@dimen/window_header_height_inner"
android:layout_marginRight="@dimen/window_inner"
app:layout_constraintRight_toRightOf="parent"
android:orientation="vertical">
<esrichina.hymn.Bootstrap.BootstrapButtonGroup
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
app:bootstrapBrand="info"
app:roundedCorners="true">
<esrichina.hymn.Bootstrap.BootstrapButton
android:id="@+id/mainNorthBT"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:fontAwesomeIcon="fa_compass" />
<esrichina.hymn.Bootstrap.BootstrapButton
android:id="@+id/mainZoomInBT"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:fontAwesomeIcon="fa_plus" />
<esrichina.hymn.Bootstrap.BootstrapButton
android:id="@+id/mainZoomOutBT"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:fontAwesomeIcon="fa_minus" />
<esrichina.hymn.Bootstrap.BootstrapButton
android:id="@+id/mainFullMapBT"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:fontAwesomeIcon="fa_globe" />
</esrichina.hymn.Bootstrap.BootstrapButtonGroup>
<esrichina.hymn.Bootstrap.BootstrapButton
android:id="@+id/mainOpenRightBT"
android:layout_marginTop="@dimen/window_inner"
app:bootstrapBrand="info"
app:roundedCorners="true"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textSize="25dp"
app:typicon="ty_tabs_outline"/>
</LinearLayout>

地图浮动按钮文件(main_map_container.xml):
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent">
<com.esri.arcgisruntime.mapping.view.MapView android:id="@+id/mainMapView" android:layout_width="fill_parent" android:layout_height="fill_parent" tools:layout_editor_absoluteX="8dp" tools:layout_editor_absoluteY="8dp" />
<include layout="@layout/main_map_floatbutton_container"/>
</android.support.constraint.ConstraintLayout>

浮动按钮布局利用了BootstrapButtonGroup和BootstrapButton,感兴趣的同学可以参考<a href="https://github.com/Bearded-Hen ... strap
MainMapFloatButtonComponent.java文件:
package esrichina.hymn.mapbasicframeworkbyhymn.Components;


import android.view.View;

import esrichina.hymn.Bootstrap.BootstrapButton;
import esrichina.hymn.Methods.MapViewMethodsClass;
import esrichina.hymn.mapbasicframeworkbyhymn.Configurations;
import esrichina.hymn.mapbasicframeworkbyhymn.R;


/** * Created by HymnHan on 2017/4/7. * MapView 浮动按钮模块 */

public class MainMapFloatButtonComponent extends BaseComponent {
private BootstrapButton mainNorthBT;
private BootstrapButton mainZoomInBT;
private BootstrapButton mainZoomOutBT;
private BootstrapButton mainFullMapBT;
private BootstrapButton mainOpenRightBT;

public MainMapFloatButtonComponent() {
mainNorthBT = (BootstrapButton) mainHymnActivity.findViewById(R.id.mainNorthBT);
mainNorthBT.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
MapViewMethodsClass.ChangeMapViewRotationFunction(mainConfigurations.getMainMapView());
}
});
mainZoomInBT = (BootstrapButton) mainHymnActivity.findViewById(R.id.mainZoomInBT);
mainZoomInBT.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
MapViewMethodsClass.ChangeMapViewScaleZoomInFunction(mainConfigurations.getMainMapView());
}
});
mainZoomOutBT = (BootstrapButton) mainHymnActivity.findViewById(R.id.mainZoomOutBT);
mainZoomOutBT.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
MapViewMethodsClass.ChangeMapViewScaleZoomOutFunction(mainConfigurations.getMainMapView());
}
});
mainFullMapBT = (BootstrapButton) mainHymnActivity.findViewById(R.id.mainFullMapBT);
mainFullMapBT.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
MapViewMethodsClass.ChangeMapViewViewpointFunction(
mainConfigurations.getMainMapView(),mainConfigurations.getMainFullExtent());
MapViewMethodsClass.ChangeMapViewRotationFunction(mainConfigurations.getMainMapView());
}
});
mainOpenRightBT = (BootstrapButton) mainHymnActivity.findViewById(R.id.mainOpenRightBT);
mainOpenRightBT.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mainHymnActivity.OpenRightDrawerFunction();
}
});
}
}

结尾



源程序包含:
MapBasicFrameworkByHymn 
请自行下载: 
链接:http://pan.baidu.com/s/1o7XgZZc 密码:4nkm 
若失效,可发邮件给韩源萌(polyline@126.com)索要。
 
 安卓智能地图开发与实施一:配置离线SDK - ArcGIS Runtime SDK for Android(Version 100.0.0) :http://zhihu.esrichina.com.cn/article/3304
 安卓智能地图开发与实施二:开发环境准备 - ArcGIS Runtime SDK for Android(Version 100.0.0) :http://zhihu.esrichina.com.cn/article/3303
 安卓智能地图开发与实施三:创建第一个地图程序 - ArcGIS Runtime SDK for Android(Version 100.0.0) :http://zhihu.esrichina.com.cn/article/3302
 安卓智能地图开发与实施四:二维地图的MapView与Layers - ArcGIS Runtime SDK for Android(Version 100.0.0) :http://zhihu.esrichina.com.cn/article/3305
 安卓智能地图开发与实施五:在线基础底图 - ArcGIS Runtime SDK for Android(Version 100.0.0) :http://zhihu.esrichina.com.cn/article/3309
 安卓智能地图开发与实施六:离线基础底图 - ArcGIS Runtime SDK for Android(Version 100.0.0) :http://zhihu.esrichina.com.cn/article/3299
 安卓智能地图开发与实施七:在线业务图层(浏览查询) - ArcGIS Runtime SDK for Android(Version 100.0.0) :http://zhihu.esrichina.com.cn/article/3298
 安卓智能地图开发与实施八:离线业务图层(浏览查询) - ArcGIS Runtime SDK for Android(Version 100.0.0) :http://zhihu.esrichina.com.cn/article/3297
 安卓智能地图开发与实施九:地图缩放与旋转 - ArcGIS Runtime SDK for Android(Version 100.0.0) :http://zhihu.esrichina.com.cn/article/3296
 安卓智能地图开发与实施十:图层管理 - ArcGIS Runtime SDK for Android(Version 100.0.0) :http://zhihu.esrichina.com.cn/article/3295
 安卓智能地图开发与实施十一:业务数据查询 - ArcGIS Runtime SDK for Android(Version 100.0.0) :http://zhihu.esrichina.com.cn/article/3294
 安卓智能地图开发与实施十二:空间查询与模糊搜索 - ArcGIS Runtime SDK for Android(Version 100.0.0) :http://zhihu.esrichina.com.cn/article/3293
 安卓智能地图开发与实施十三:空间查询与展示 - ArcGIS Runtime SDK for Android(Version 100.0.0) :http://zhihu.esrichina.com.cn/article/3308
 安卓智能地图开发与实施十四:业务数据编辑 - ArcGIS Runtime SDK for Android(Version 100.0.0) :http://zhihu.esrichina.com.cn/article/3307
 安卓智能地图开发与实施十五:离线与同步 - ArcGIS Runtime SDK for Android(Version 100.0.0) :http://zhihu.esrichina.com.cn/article/3306
 安卓智能地图开发与实施十六:三维地图 - ArcGIS Runtime SDK for Android(Version 100.1.0) :http://zhihu.esrichina.com.cn/article/3289
 安卓智能地图开发与实施十七:使用天地图 - ArcGIS Runtime SDK for Android(Version 100.1.0) :http://zhihu.esrichina.com.cn/article/3288
 安卓智能地图开发与实施十八:空间要素绘制 - ArcGIS Runtime SDK for Android(Version 100.1.0) :http://zhihu.esrichina.com.cn/article/3287
 安卓智能地图开发与实施十九:符号与渲染器 - ArcGIS Runtime SDK for Android(Version 100.1.0) :http://zhihu.esrichina.com.cn/article/3286
文章来源:http://blog.csdn.net/allenlu2008/article/details/72236318

0 个评论

要回复文章请先登录注册