学习内容来自“慕课网”
模式转换,即地图的普通模式,罗盘模式,跟随模式之间的转换
学习内容接自前三篇
一、模式转换通过菜单按钮来控制
所以添加对应的菜单项(红色字体部分)
1 <menu xmlns:android="http://schemas.android.com/apk/res/android" > 2 3 <item 4 android:id="@+id/id_map_common" 5 6 android:showAsAction="never" 7 android:title="普通地图"/> 8 <item 9 android:id="@+id/id_map_site" 10 11 android:showAsAction="never" 12 android:title="卫星地图"/> 13 <item 14 android:id="@+id/id_map_traffic" 15 16 android:showAsAction="never" 17 android:title="实时交通(off)"/> 18 <item 19 android:id="@+id/id_map_location" 20 21 android:showAsAction="never" 22 android:title="定位我的位置"/> 23 <item 24 android:id="@+id/id_mode_commer" 25 26 android:showAsAction="never" 27 android:title="普通模式"/> 28 <item 29 android:id="@+id/id_mode_following" 30 31 android:showAsAction="never" 32 android:title="跟随模式"/> 33 <item 34 android:id="@+id/id_mode_compass" 35 36 android:showAsAction="never" 37 android:title="罗盘模式"/> 38 39 </menu>
在MainActivity.java中添加模式转换的代码
1 package com.example.map; 2 3 import com.baidu.location.BDLocation; 4 import com.baidu.location.BDLocationListener; 5 import com.baidu.location.LocationClient; 6 import com.baidu.location.LocationClientOption; 7 import com.baidu.mapapi.SDKInitializer; 8 import com.baidu.mapapi.map.BaiduMap; 9 import com.baidu.mapapi.map.BitmapDescriptor; 10 import com.baidu.mapapi.map.BitmapDescriptorFactory; 11 import com.baidu.mapapi.map.MapStatusUpdate; 12 import com.baidu.mapapi.map.MapStatusUpdateFactory; 13 import com.baidu.mapapi.map.MapView; 14 import com.baidu.mapapi.map.MyLocationConfiguration; 15 import com.baidu.mapapi.map.MyLocationConfiguration.LocationMode; 16 import com.baidu.mapapi.map.MyLocationData; 17 import com.baidu.mapapi.model.LatLng; 18 import com.example.map.MyOrientationListener.OnOrientationListener; 19 import com.example.map.R; 20 21 import android.location.Location; 22 import android.os.Bundle; 23 import android.app.Activity; 24 import android.content.Context; 25 import android.graphics.Bitmap; 26 import android.view.Menu; 27 import android.view.MenuItem; 28 import android.view.Window; 29 import android.widget.Toast; 30 31 public class MainActivity extends Activity { 32 33 private MapView mMapView = null; 34 private BaiduMap mBaiduMap; 35 //简化代码 用于this.context=this; 36 private Context context; 37 //定位相关 38 private LocationClient mLocationClient; 39 private MyLocationListener mLocationListener; 40 //是否第一次定位的标志 41 private boolean isFirstIn = true; 42 //定位经纬度 43 private double mLatitude; 44 private double mLongtitude; 45 //自定义定位图标 46 private BitmapDescriptor mIconLocation; 47 private LocationMode mLocationMode;//定义模式 48 private MyOrientationListener myOrientationListener; 49 private float mCurrentX; 50 51 52 @Override 53 protected void onCreate(Bundle savedInstanceState) { 54 super.onCreate(savedInstanceState); 55 //在使用SDK各组件之前初始化context信息,传入ApplicationContext 56 //注意该方法要再setContentView方法之前实现 57 SDKInitializer.initialize(getApplicationContext()); 58 59 requestWindowFeature(Window.FEATURE_NO_TITLE); 60 setContentView(R.layout.activity_main); 61 this.context = this; 62 initView(); 63 //初始化定位 64 initLocation(); 65 66 } 67 68 private void initView() { 69 // TODO Auto-generated method stub 70 mMapView = (MapView) findViewById(R.id.bmapView); 71 mBaiduMap = mMapView.getMap(); 72 //设置打开时的显示比列 这里显示500m左右 73 MapStatusUpdate msu = MapStatusUpdateFactory.zoomTo(15.0f); 74 mBaiduMap.setMapStatus(msu); 75 } 76 private void initLocation() { 77 // TODO Auto-generated method stub 78 mLocationClient = new LocationClient(this); 79 mLocationListener = new MyLocationListener(); 80 mLocationClient.registerLocationListener(mLocationListener); 81 //默认模式为普通型 82 mLocationMode = LocationMode.NORMAL; 83 LocationClientOption option = new LocationClientOption(); 84 option.setCoorType("bd09ll"); 85 option.setIsNeedAddress(true); 86 option.setOpenGps(true); 87 option.setScanSpan(1000); 88 89 mLocationClient.setLocOption(option); 90 91 // 初始化图标 92 mIconLocation = BitmapDescriptorFactory.fromResource(R.drawable.navi_map_gps_locked); 93 myOrientationListener = new MyOrientationListener(context); 94 myOrientationListener.setOnOrientationListener(new OnOrientationListener() 95 { 96 @Override 97 public void onOrientationChanged(float x) 98 { 99 mCurrentX = x; 100 } 101 }); 102 } 103 //activity销毁时百度地图也销毁 104 @Override 105 protected void onDestroy() { 106 super.onDestroy(); 107 //在activity执行onDestroy时执行mMapView.onDestroy(),实现地图生命周期管理 108 mMapView.onDestroy(); 109 } 110 @Override 111 protected void onStart() { 112 // TODO Auto-generated method stub 113 super.onStart(); 114 // 开启定位 115 mBaiduMap.setMyLocationEnabled(true); 116 if (!mLocationClient.isStarted()) 117 mLocationClient.start(); 118 // 开启方向传感器 119 myOrientationListener.start(); 120 121 } 122 @Override 123 protected void onStop() { 124 // TODO Auto-generated method stub 125 super.onStop(); 126 // 停止定位 127 mBaiduMap.setMyLocationEnabled(false); 128 mLocationClient.stop(); 129 // 停止方向传感器 130 myOrientationListener.stop(); 131 } 132 @Override 133 protected void onResume() { 134 super.onResume(); 135 //在activity执行onResume时执行mMapView. onResume (),实现地图生命周期管理 136 mMapView.onResume(); 137 } 138 @Override 139 protected void onPause() { 140 super.onPause(); 141 //在activity执行onPause时执行mMapView. onPause (),实现地图生命周期管理 142 mMapView.onPause(); 143 } 144 @Override 145 public boolean onCreateOptionsMenu(Menu menu) { 146 // TODO Auto-generated method stub 147 148 getMenuInflater().inflate(R.menu.main, menu); 149 return true; 150 } 151 //菜单按钮的响应事件 152 @Override 153 public boolean onOptionsItemSelected(MenuItem item) { 154 // TODO Auto-generated method stub 155 switch (item.getItemId()) { 156 case R.id.id_map_common: 157 mBaiduMap.setMapType(BaiduMap.MAP_TYPE_NORMAL); 158 break; 159 case R.id.id_map_site: 160 mBaiduMap.setMapType(BaiduMap.MAP_TYPE_SATELLITE); 161 break; 162 case R.id.id_map_traffic: 163 if(mBaiduMap.isTrafficEnabled()) 164 { 165 mBaiduMap.setTrafficEnabled(false); 166 item.setTitle("实时交通(off)"); 167 } 168 else 169 { 170 mBaiduMap.setTrafficEnabled(true); 171 item.setTitle("实时交通(on)"); 172 } 173 break; 174 case R.id.id_map_location: 175 //定位最新自己的位置 176 centerToMyLocation(); 177 break; 178 179 case R.id.id_mode_common: 180 //设置普通模式 181 mLocationMode = LocationMode.NORMAL; 182 break; 183 case R.id.id_mode_following: 184 //设置跟随模式 185 mLocationMode = LocationMode.FOLLOWING; 186 break; 187 case R.id.id_mode_compass: 188 //设置罗盘模式 189 mLocationMode = LocationMode.COMPASS; 190 break; 191 default: 192 break; 193 } 194 return super.onOptionsItemSelected(item); 195 } 196 //进到自己的位置 197 private void centerToMyLocation() { 198 LatLng latLng = new LatLng(mLatitude,mLongtitude); 199 200 MapStatusUpdate msu = MapStatusUpdateFactory.newLatLng(latLng); 201 mBaiduMap.animateMapStatus(msu); 202 } 203 private class MyLocationListener implements BDLocationListener{ 204 205 @Override 206 public void onReceiveLocation(BDLocation location) { 207 // TODO Auto-generated method stub 208 MyLocationData data = new MyLocationData.Builder()// 209 .direction(mCurrentX)// 210 .accuracy(location.getRadius())// 211 .latitude(location.getLatitude())// 212 .longitude(location.getLongitude())// 213 .build(); 214 mBaiduMap.setMyLocationData(data); 215 // 设置自定义图标 216 MyLocationConfiguration config = new MyLocationConfiguration(mLocationMode, true, mIconLocation); 217 mBaiduMap.setMyLocationConfigeration(config); 218 //获取最新经纬度 219 mLatitude = location.getLatitude(); 220 mLongtitude = location.getLongitude(); 221 //判断是否第一次定位 222 if (isFirstIn) 223 { 224 //设置经纬度 225 LatLng latLng = new LatLng(location.getLatitude(),location.getLongitude()); 226 227 MapStatusUpdate msu = MapStatusUpdateFactory.newLatLng(latLng); 228 mBaiduMap.animateMapStatus(msu); 229 //将是否第一次定位的标志 变为不是第一次定位 230 isFirstIn = false; 231 //显示当前定位的位置 232 Toast.makeText(context, location.getAddrStr(), 233 Toast.LENGTH_SHORT).show(); 234 } 235 236 } 237 238 } 239 }
效果图:
罗盘模式
跟随模式:
坐标一直显示在界面中心位置
代码是学习的,发现一点Bug
点击罗盘模式后点击左上角指南针图标 无法回到普通模式
在罗盘模式后,点击普通模式,界面不直接显示为普通模式,而要再点击左上角指南针图标后才能回到普通模式