標籤:
轉載請標明出處:http://blog.csdn.net/lmj623565791/article/details/37730469
在上一篇部落格中,我們成功把地圖匯入了我們的項目。本篇我們準備為地圖加入:第一,定位功能;第二。與方向感應器結合。通過旋轉手機進行道路的方向確認。有了這兩個功能,地圖已經能夠為我服務了~~~~
:
好了,能夠代碼,為了方便,我把全部的button都放到了menu菜單中。
1、初次啟動定位
/** * 定位的client */private LocationClient mLocationClient;/** * 定位的監聽器 */public MyLocationListener mMyLocationListener;/** * 當前定位的模式 */private LocationMode mCurrentMode = LocationMode.NORMAL;/*** * 是否是第一次定位 */private volatile boolean isFristLocation = true;/** * 初始化定位相關代碼 */private void initMyLocation(){// 定位初始化mLocationClient = new LocationClient(this);mMyLocationListener = new MyLocationListener();mLocationClient.registerLocationListener(mMyLocationListener);// 設定定位的相關配置LocationClientOption option = new LocationClientOption();option.setOpenGps(true);// 開啟gpsoption.setCoorType("bd09ll"); // 設定座標類型option.setScanSpan(1000);mLocationClient.setLocOption(option);}
然後是定位的監聽器MyLocationListener:
/** * 實現實位回調監聽 */public class MyLocationListener implements BDLocationListener{@Overridepublic void onReceiveLocation(BDLocation location){// map view 銷毀後不在處理新接收的位置if (location == null || mMapView == null)return;// 構造定位元據MyLocationData locData = new MyLocationData.Builder().accuracy(location.getRadius())// 此處設定開發人員擷取到的方向資訊,順時針0-360.direction(mXDirection).latitude(location.getLatitude()).longitude(location.getLongitude()).build();mCurrentAccracy = location.getRadius();// 設定定位元據mBaiduMap.setMyLocationData(locData);mCurrentLantitude = location.getLatitude();mCurrentLongitude = location.getLongitude();// 設定自己定義表徵圖BitmapDescriptor mCurrentMarker = BitmapDescriptorFactory.fromResource(R.drawable.navi_map_gps_locked);MyLocationConfigeration config = new MyLocationConfigeration(mCurrentMode, true, mCurrentMarker);mBaiduMap.setMyLocationConfigeration(config);// 第一次定位時,將地圖位置移動到當前位置if (isFristLocation){isFristLocation = false;LatLng ll = new LatLng(location.getLatitude(),location.getLongitude());MapStatusUpdate u = MapStatusUpdateFactory.newLatLng(ll);mBaiduMap.animateMapStatus(u);}}}能夠看到,我們初始化了定位的參數。設定了定位的監聽器,每隔1s會進行一次定位,應用開啟時,第一定位,會把地圖中心設定目前使用者位置。
定位也是比較耗電的,所以我們在onStart中開啟定位,在onStop中關閉定位~~這樣應用最小化時就不會一直在哪GPS請求定位了,使用者要是看你app一直在那定位,預計立即就被卸載了~
@Overrideprotected void onStart(){// 開啟圖層定位mBaiduMap.setMyLocationEnabled(true);if (!mLocationClient.isStarted()){mLocationClient.start();}// 開啟方向感應器myOrientationListener.start();super.onStart();}@Overrideprotected void onStop(){// 關閉圖層定位mBaiduMap.setMyLocationEnabled(false);mLocationClient.stop();// 關閉方向感應器myOrientationListener.stop();super.onStop();}
上面的感應器的代碼,一會就會介紹~
記得在AndroidManifest.xml配一個service
<service android:name="com.baidu.location.f" android:enabled="true" android:process=":remote" > <intent-filter> <action android:name="com.baidu.location.service_v2.2" > </action> </intent-filter> </service>
如今主要的定位功能已經實現了~只是我們還須要加入點擊定位button和方向感應器
2、我的位置
點擊我的位置菜單會調用center2myLoc方法。
case R.id.id_menu_map_myLoc:center2myLoc();break;
/** * 地圖移動到我的位置,此處能夠又一次發定位請求,然後定位; * 直接拿近期一次經緯度,假設長時間沒有定位成功。可能會顯示效果不好 */private void center2myLoc(){LatLng ll = new LatLng(mCurrentLantitude, mCurrentLongitude);MapStatusUpdate u = MapStatusUpdateFactory.newLatLng(ll);mBaiduMap.animateMapStatus(u);}
非常easy。我們在定位的監聽器中已經儲存了近期一次的定位經緯度,所以僅僅須要點擊時,把地圖移動到對應的位置就可以。
3、整合方向感應器
首先是封裝的方向感應器的類MyOrientationListener.java
package com.zhy.zhy_baidu_ditu_demo00;import android.content.Context;import android.hardware.Sensor;import android.hardware.SensorEvent;import android.hardware.SensorEventListener;import android.hardware.SensorManager;public class MyOrientationListener implements SensorEventListener{private Context context;private SensorManager sensorManager;private Sensor sensor;private float lastX ; private OnOrientationListener onOrientationListener ; public MyOrientationListener(Context context){this.context = context;}// 開始public void start(){// 獲得感應器管理器sensorManager = (SensorManager) context.getSystemService(Context.SENSOR_SERVICE);if (sensorManager != null){// 獲得方向感應器sensor = sensorManager.getDefaultSensor(Sensor.TYPE_ORIENTATION);}// 注冊if (sensor != null){//SensorManager.SENSOR_DELAY_UIsensorManager.registerListener(this, sensor,SensorManager.SENSOR_DELAY_UI);}}// 停止檢測public void stop(){sensorManager.unregisterListener(this);}@Overridepublic void onAccuracyChanged(Sensor sensor, int accuracy){}@Overridepublic void onSensorChanged(SensorEvent event){// 接受方向感應器的類型 if (event.sensor.getType() == Sensor.TYPE_ORIENTATION) { // 這裡我們能夠得到資料。然後依據須要來處理 float x = event.values[SensorManager.DATA_X]; if( Math.abs(x- lastX) > 1.0 ) { onOrientationListener.onOrientationChanged(x); }// Log.e("DATA_X", x+""); lastX = x ; } }public void setOnOrientationListener(OnOrientationListener onOrientationListener){this.onOrientationListener = onOrientationListener ;}public interface OnOrientationListener {void onOrientationChanged(float x);}}
在onCreate中初始化方向感應器
/** * 初始化方向感應器 */private void initOritationListener(){myOrientationListener = new MyOrientationListener(getApplicationContext());myOrientationListener.setOnOrientationListener(new OnOrientationListener(){@Overridepublic void onOrientationChanged(float x){mXDirection = (int) x;// 構造定位元據MyLocationData locData = new MyLocationData.Builder().accuracy(mCurrentAccracy)// 此處設定開發人員擷取到的方向資訊,順時針0-360.direction(mXDirection).latitude(mCurrentLantitude).longitude(mCurrentLongitude).build();// 設定定位元據mBaiduMap.setMyLocationData(locData);// 設定自己定義表徵圖BitmapDescriptor mCurrentMarker = BitmapDescriptorFactory.fromResource(R.drawable.navi_map_gps_locked);MyLocationConfigeration config = new MyLocationConfigeration(mCurrentMode, true, mCurrentMarker);mBaiduMap.setMyLocationConfigeration(config);}});}
最後在onStart和onStop中分別開啟和關閉方向感應器。
對於旋轉手機確定方向,實際上利用了
new MyLocationData.Builder()//此處設定開發人員擷取到的方向資訊,順時針0-360 .direction(mXDirection)
僅僅須要把x方向的角度設定就可以~~~是不是非常easy~~~
好了,介紹完成了,關閉地圖樣式的切換,以及尾隨、羅盤等模式的切換就不介紹了,大家自己看下原始碼~~
原始碼點擊下載
註:開發人員key須要換成自己申請的。不清楚申請的請看第一篇部落格的。
百度地圖相關部落格視頻版本號碼已經上線:Android中百度地圖的使用期待您的支援。
博主部分視頻已經上線,假設你不喜歡枯燥的文本。請猛戳(初錄。期待您的支援):
1、Android 自己定義控制項實戰 電商活動中的刮刮卡
2、Android自己定義控制項實戰 打造Android流式布局和熱門標籤
3、Android智能機器人“小慕”的實現
4、高仿QQ5.0側滑
5、高仿5.2.1主介面及訊息提醒
百度地圖相關部落格視頻版本號碼已經上線:Android中百度地圖的使用期待您的支援。
博主部分視頻已經上線,假設你不喜歡枯燥的文本,請猛戳(初錄。期待您的支援):
1、Android 自己定義控制項實戰 電商活動中的刮刮卡
2、Android自己定義控制項實戰 打造Android流式布局和熱門標籤
3、Android智能機器人“小慕”的實現
4、高仿QQ5.0側滑
5、高仿5.2.1主介面及訊息提醒
Android 百度地圖 SDK v3.0.0 (二) 定位與結合方向感應器