1.简介MapBox是一个开源的矢量地图SDK。该框架有望在开发视频游戏时提供卓越的渲染速度和流畅度。如果您有兴趣将地图功能集成到您的应用程序中,那么MapBox将是值得您考虑的选项之一。2.权限设置首先要说明的是,本文提供的源代码可以从GitHub网站https://github.com/sitepoint-editors/MapBox-App下载。要使用Mapbox等应用程序,您需要一个API访问令牌。为此,您需要先创建一个Mapbox帐户,您可以在https://www.mapbox.com/studio/account/tokens找到您需要的类数据。然后,将令牌添加到您的Android程序的文件strings.xml中:android:name="android.permission.ACCESS_NETWORK_STATE"/>注意:在AndroidMarshmallow(API23)及更高版本运行时需要以上权限。3、安装MapBox接下来打开配置文件build.gradle(对应Module:app文件夹下的那个),添加对MapBox的依赖。请参考以下配置代码:repositories{mavenCentral()}dependencies{...compile('com.mapbox.mapboxsdk:mapbox-android-sdk:3.2.0@aar'){transitive=true}compile('com.mapbox.mapboxsdk:mapbox-android-directions:1.0.0@aar'){transitive=true}}上面代码中的***配置是对Mapbox的描述,下面的配置对应Directions库的描述,即用于为驾车、步行、跨骑等应用提供调用功能,支持在地图上绘制自己的轨迹。4.MapBox布局接下来,打开布局文件content_main.xml,将原来的内容替换为以下内容:接下来初始化你需要用到的MainActivity文件变量:publicclassMainActivityextendsAppCompatActivity{privateMapViewmapView=null;privateStringMAPBOX_ACCESS_TOKEN="";privateDirectionsRoutecurrentRoute=null;...接下来,在MainActivity.java文件中,删除onCreate()方法中创建工具栏和浮动按钮的代码,添加如下代码初始化地图:StringMAPBOX_ACCESS_TOKEN=getResources().getString(R.string.accessToken);//设置标准MapboxmapMapViewmapView=(MapView)findViewById(R.id.mapview);mapView.setAccessToken(MAPBOX_ACCESS_TOKEN);mapView.setStyleUrl(Style.MAPBOX_STREETS);//指定地图样式mapView.setZoom(14);//zoomlevelmapView.onCreate(savedInstanceState);Mapbox需要实现Activity的生命周期方法,避免运行时出错;因此需要增加如下重写函数:@OverrideprotectedvoidonStart(){super.onStart();mapView.onStart();}@OverrideprotectedvoidonStop(){super.onStop();mapView.onStop();}@OverrideprotectedvoidonDestroy(){super.onDestroy();mapView.onDestroy();}@OverrideprotectedvoidonResume(){super.onResume();mapView.onResume();}@OverrideprotectedvoidonPause(){super.onPause();mapView.onPause();}@OverrideprotectedvoidonSaveInstanceState(BundleoutState){super.onSaveInstanceState(outState);mapView.onSaveInstanceState(outState);}现在Mapbox已经配置好了,你可以构建应用了。5.给地图添加标记现在,请在MainActivity的onCreate函数的第一部分添加以下代码:@OverrideprotectedvoidonStart(){super.onStart();mapView.onStart();}@OverrideprotectedvoidonStop(){super.onStop();mapView.onStop();}@OverrideprotectedvoidonDestroy(){super.onDestroy();mapView.onDestroy();}@OverrideprotectedvoidonResume(){super.onResume();mapView.onResume();}@OverrideprotectedvoidonPause(){super.onPause();mapView.onPause();}@OverrideprotectedvoidonSaveInstanceState(BundleoutState){super.onSaveInstanceState(outState);mapView.onSaveInstanceState(outState);}这段代码中的CameraPosition是一个非常有用的Mapbox类,它可以用于设置用户视图的位置、角度、缩放和倾斜等。到目前为止,我们的地图如下所示:6.获取设备位置为了让Mapbox访问设置的位置信息,设置位置服务必须启用,并且程序应该有权使用它们。如前所述,在AndroidMarshmallow(API23)及更高版本中,这些权限在运行时是必需的。现在,让我们创建一个新函数并添加代码以获取当前位置:)!=PackageManager.PERMISSION_GRANTED){//TODO:考虑调用//ActivityCompat#requestPermissions//此处请求缺少的权限,然后覆盖//publicvoidonRequestPermissionsResult(intrequestCode,String[]permissions,//int[]grantResult)//处理用户授予权限的情况。请参阅//forActivityCompliance的文档requestPermissionsformoredetails.return;}mapView.setMyLocationEnabled(true);mapView.setMyLocationTrackingMode(MyLocationTracking.TRACKING_FOLLOW);mapView.getMyLocation();}然后,在地图初始化代码后添加如下函数调用:...mapView.onCreate(savedInstanceState);我的位置();在这种情况下,我们将跟踪方式设置为TRACKING_FOLLOW,这意味着用户的位置将被持续监控,地图将随着变化不断更新。7.在地图上绘制路线现在我们已经创建了标记和位置,下一步就是在地图上绘制路线。这是使用依赖设置中导入的第二个库(Directions库),也是Mapbox团队开发的。工作原理如下:1.创建两个航点位置,一个是出发点,一个对应目的地。2.创建一个MapboxDirections生成器对象,用于向MapboxAPI发送网络请求。其中的数据包含了起点和终点对应的waypoint位置信息,以及与方向路线(驾车、步行或骑行等)相关的配置信息。3.异步执行方向要求。其中,MapboxDirections类使用RetrofitAPI提供了内置的异步请求。具体来说,enqueue()函数用于执行请求。4.OnResponse()方法返回Retrofit响应结果,是标准的JSONAPI响应。5.响应文本包含位置坐标对信息,这些坐标稍后会绘制在地图上。6.使用MapboxPolyline函数在地图上绘制坐标。折线是一种几何特征,通过将多条线段首尾相接形成一条未闭合的折线。为了使用Direction库,我们需要获取设备的位置作为源路标,以及用户长按指定的目的路标的位置信息。8.添加航点位置,并为目的地添加标记现在,请在onCreate方法的第一页添加如下代码:/Markerisannotationthatshowsaniconimageatageographicallocation//soallmarkerscanberremovedwiththeremoveAllAnnotations()method.mapView.removeAllAnnotations();//SettheoriginwaypointtothedeviceslocationWaypointorigin=newWaypoint(mapView.getMyLocation().getLongitude(),mapView.getMyLocation().getLatitude());//设置目的地路点到位置WpointwaypointdbytheuserinationgetLongitude(),point.getLatitude());//AddmarkertothedestinationwaypointmapView.addMarker(newMarkerOptions().position(newLatLng(point)).title("DestinationMarker").snippet("Mydestination"));//GetroutefromAPIgetRoute(origin,目的地);}});九、创建MapboxDirections网络请求并异步运行接下来创建如下图获取***路由信息的方法:privatevoidgetRoute(Waypointorigin,Waypointd目的地){MapboxDirectionsdirections=newMapboxDirections.Builder().setAccessToken(MAPBOX_ACCESS_TOKEN).setOrigin(origin).setDestination(destination).setProfile(DirectionsCriteria.PROFILE_WALKING).build();directions.enqueue(newCallbackResponse(){@OverridesResponse>Response(){(Responseresponse,Retrofitretrofit){//DisplaysomeinfoabouttheroutecurrentRoute=response.body().getRoutes().get(0);showToastMessage(String.format("Youare%dmeters\nfromyourdestination",currentRoute.getDistance()));//DrawtherouteonthemapdrawRoute(currentRoute);}@OverridepublicvoidonFailure(Throwablet){showToastMessage("Error:"+t.getMessage());}});}10.使用地图上的坐标点绘制折线并在实现路径绘制中添加以下方法:privatevoiddrawRoute(DirectionsRouteroute){//ConvertListintoLatLng[]Listwaypoints=route.getGeometry().getWaypoints();LatLng[]point=newLatLng[waypoints.size()];for(inti=0;i