模式转换,即地图的普通模式,罗盘模式,跟随模式之间的转换
学习内容接自前三篇
安卓开发_慕课网_百度地图
安卓开发_慕课网_百度地图_实现定位
安卓开发_慕课网_百度地图_实现方向传感器
一、模式转换通过菜单按钮来控制
所以添加对应的菜单项(红色字体部分)
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
点击罗盘模式后点击左上角指南针图标 无法回到普通模式
在罗盘模式后,点击普通模式,界面不直接显示为普通模式,而要再点击左上角指南针图标后才能回到普通模式