学习内容来自“慕课网”
这里学习百度地图方向传感器功能
就是当转动手机的时候,地图上显示个人所在位置的图标的箭头变动
学习接自前两篇
安卓开发_慕课网_百度地图
安卓开发_慕课网_百度地图_实现定位
思路:
传感器随着定位的开始而开启,随着定位的结束而结束
传感器获得位置的移动而更新方向
代码在前两篇的基础上修改
一、讲原本坐标的图标改成箭头图标
二、引入方向传感器
首先增添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 LocationClientOption option = new LocationClientOption();
82 option.setCoorType("bd09ll");
83 option.setIsNeedAddress(true);
84 option.setOpenGps(true);
85 option.setScanSpan(1000);
86
87 mLocationClient.setLocOption(option);
88
89 // 初始化图标
90 mIconLocation = BitmapDescriptorFactory.fromResource(R.drawable.navi_map_gps_locked);
91 myOrientationListener = new MyOrientationListener(context);
92 myOrientationListener.setOnOrientationListener(new OnOrientationListener()
93 {
94 @Override
95 public void onOrientationChanged(float x)
96 {
97 mCurrentX = x;
98 }
99 });
100 }
101 //activity销毁时百度地图也销毁
102 @Override
103 protected void onDestroy() {
104 super.onDestroy();
105 //在activity执行onDestroy时执行mMapView.onDestroy(),实现地图生命周期管理
106 mMapView.onDestroy();
107 }
108 @Override
109 protected void onStart() {
110 // TODO Auto-generated method stub
111 super.onStart();
112 // 开启定位
113 mBaiduMap.setMyLocationEnabled(true);
114 if (!mLocationClient.isStarted())
115 mLocationClient.start();
116 // 开启方向传感器
117 myOrientationListener.start();
118
119 }
120 @Override
121 protected void onStop() {
122 // TODO Auto-generated method stub
123 super.onStop();
124 // 停止定位
125 mBaiduMap.setMyLocationEnabled(false);
126 mLocationClient.stop();
127 // 停止方向传感器
128 myOrientationListener.stop();
129 }
130 @Override
131 protected void onResume() {
132 super.onResume();
133 //在activity执行onResume时执行mMapView. onResume (),实现地图生命周期管理
134 mMapView.onResume();
135 }
136 @Override
137 protected void onPause() {
138 super.onPause();
139 //在activity执行onPause时执行mMapView. onPause (),实现地图生命周期管理
140 mMapView.onPause();
141 }
142 @Override
143 public boolean onCreateOptionsMenu(Menu menu) {
144 // TODO Auto-generated method stub
145
146 getMenuInflater().inflate(R.menu.main, menu);
147 return true;
148 }
149 //菜单按钮的响应事件
150 @Override
151 public boolean onOptionsItemSelected(MenuItem item) {
152 // TODO Auto-generated method stub
153 switch (item.getItemId()) {
154 case R.id.id_map_common:
155 mBaiduMap.setMapType(BaiduMap.MAP_TYPE_NORMAL);
156 break;
157 case R.id.id_map_site:
158 mBaiduMap.setMapType(BaiduMap.MAP_TYPE_SATELLITE);
159 break;
160 case R.id.id_map_traffic:
161 if(mBaiduMap.isTrafficEnabled())
162 {
163 mBaiduMap.setTrafficEnabled(false);
164 item.setTitle("实时交通(off)");
165 }
166 else
167 {
168 mBaiduMap.setTrafficEnabled(true);
169 item.setTitle("实时交通(on)");
170 }
171 break;
172 case R.id.id_map_location:
173 //定位最新自己的位置
174 centerToMyLocation();
175 break;
176
177 default:
178 break;
179 }
180 return super.onOptionsItemSelected(item);
181 }
182 //进到自己的位置
183 private void centerToMyLocation() {
184 LatLng latLng = new LatLng(mLatitude,mLongtitude);
185
186 MapStatusUpdate msu = MapStatusUpdateFactory.newLatLng(latLng);
187 mBaiduMap.animateMapStatus(msu);
188 }
189 private class MyLocationListener implements BDLocationListener{
190
191 @Override
192 public void onReceiveLocation(BDLocation location) {
193 // TODO Auto-generated method stub
194 MyLocationData data = new MyLocationData.Builder()//
195 .direction(mCurrentX)//
196 .accuracy(location.getRadius())//
197 .latitude(location.getLatitude())//
198 .longitude(location.getLongitude())//
199 .build();
200 mBaiduMap.setMyLocationData(data);
201 // 设置自定义图标
202 MyLocationConfiguration config = new MyLocationConfiguration(mLocationMode.NORMAL, true, mIconLocation);
203 mBaiduMap.setMyLocationConfigeration(config);
204 //获取最新经纬度
205 mLatitude = location.getLatitude();
206 mLongtitude = location.getLongitude();
207 //判断是否第一次定位
208 if (isFirstIn)
209 {
210 //设置经纬度
211 LatLng latLng = new LatLng(location.getLatitude(),location.getLongitude());
212
213 MapStatusUpdate msu = MapStatusUpdateFactory.newLatLng(latLng);
214 mBaiduMap.animateMapStatus(msu);
215 //将是否第一次定位的标志 变为不是第一次定位
216 isFirstIn = false;
217 //显示当前定位的位置
218 Toast.makeText(context, location.getAddrStr(),
219 Toast.LENGTH_SHORT).show();
220 }
221
222 }
223
224 }
225 }
添加方向传感器部分的类
MyLocationListener.java
1 package com.example.map;
2
3 import android.content.Context;
4 import android.hardware.Sensor;
5 import android.hardware.SensorEvent;
6 import android.hardware.SensorEventListener;
7 import android.hardware.SensorManager;
8
9 public class MyOrientationListener implements SensorEventListener
10 {
11 private SensorManager mSensorManager;
12 private Context mContext;
13 //传感器
14 private Sensor mSensor;
15 private float lastX;
16
17 //构造方法
18 public MyOrientationListener(Context context)
19 {
20 this.mContext = context;
21 }
22
23 @SuppressWarnings("deprecation")
24 //开始监听
25 public void start()
26 {
27 //拿到系统服务
28 mSensorManager = (SensorManager) mContext.getSystemService(Context.SENSOR_SERVICE);
29 if (mSensorManager != null)
30 {
31 // 获得方向传感器
32 mSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_ORIENTATION);
33 }
34
35 if (mSensor != null)
36 {
37 mSensorManager.registerListener(this, mSensor,
38 SensorManager.SENSOR_DELAY_UI);
39 }
40 }
41
42 //结束监听
43 public void stop()
44 {
45 mSensorManager.unregisterListener(this);
46 }
47
48 @Override
49 public void onAccuracyChanged(Sensor arg0, int arg1)
50 {
51 // TODO Auto-generated method stub
52
53 }
54
55 @SuppressWarnings(
56 { "deprecation" })
57 @Override
58 //方向发生变化
59 public void onSensorChanged(SensorEvent event)
60 {
61 if (event.sensor.getType() == Sensor.TYPE_ORIENTATION)
62 {
63 float x = event.values[SensorManager.DATA_X];
64
65 if (Math.abs(x - lastX) > 1.0)
66 {
67 if (mOnOrientationListener != null)
68 {
69 mOnOrientationListener.onOrientationChanged(x);
70 }
71 }
72
73 lastX = x;
74
75 }
76 }
77
78 private OnOrientationListener mOnOrientationListener;
79
80 public void setOnOrientationListener(
81 OnOrientationListener mOnOrientationListener)
82 {
83 this.mOnOrientationListener = mOnOrientationListener;
84 }
85
86 public interface OnOrientationListener
87 {
88 void onOrientationChanged(float x);
89 }
90
91 }
改动以上两部分后便可以看到效果,移动手机方向,坐标箭头方向随之变化
效果图
坐标箭头的素材