接上篇。
改造一下MapsActivity:
MapsActivity Activity
實現4個interface:
android.location.LocationListener
GoogleMap.InfoWindowAdapter
GoogleMap.OnMarkerClickListener
GoogleMap.OnMarkerDragListener
本篇要實現在地圖上定位,主要用到LocationListener介面。
另外3個介面關係到 打標記(Marker),移動標記點,以及點擊標記彈出info視窗。這些功能將在下一篇文中整理。
地圖初始化
首先在onCreate中需要對地圖對象做一些設定:
servicesConnected 檢查service是否可用
resultCode = GooglePlayServicesUtil.isGooglePlayServicesAvailable( (ConnectionResult.SUCCESS =="Google Play services is available."= ConnectionResult connectionResult = ConnectionResult(resultCode, errorCode = Dialog errorDialog = (errorDialog != =
上一篇說過,手機調試環境需要安裝Google Play服務和play store。如果沒有安裝,這裡就會返回錯誤碼。
initMapView 初始化
mMapView = UiSettings setting = setting.setTiltGesturesEnabled(
2行,獲得地圖對象 GoogleMap mMapView;後面很多操作都要通過它。
3行,設在地圖模式為normal
4行,UiSettings 設定人機互動相關的各種按鈕手勢等待,例如:
void setTiltGesturesEnabled(boolean) 是否允許手勢改變視角;
void setCompassEnabled(boolean) 是否顯示指南針;
詳細的UiSettings用法可參考官文 https://developers.google.com/maps/documentation/android/reference/com/google/android/gms/maps/UiSettings
移動到經緯度地點
先闡明一個概念,Goolge Map假定地圖本身是固定不動的,移動的是camera(public final class CameraUpdate)。
想象一下,在地球上空漂浮著一隻佳能無敵兔,把鏡頭對準魔都,焦距拉近看到了一號線,再拉遠,視角傾斜一下,看到了魔都全貌,還是帶廣角的。不錯吧!
回到代碼,這裡需要用的GPS。通過LocationManager來獲得位置服務
mLocManager == mLocManager.isProviderEnabled(LocationManager.GPS_PROVIDER);
獲得LocationManager,並檢查GPS是否可用。
在onResume函數中註冊監聽
(isServiceOk == String provider = (provider != mLocManager.requestLocationUpdates(provider, 5*1000, 1, }
7行,獲得可用的Location Provider,開啟GPS的情況下這裡得到的是GPS provider
9行,註冊位置變化監聽。第二入參5*1000表示每隔5秒更新一次,第三入參表示移動超過1米更新一次。最後一個入參即LocationListener,由於activity implement了LocationListener,所以這裡只需要給activity的this指標。
12行和13行的兩個函數,用於主動擷取最新位置,移動地圖到該位置,稍後貼出。
先看一下位置變化的監聽函數,activity在implement了LocationListener後 需要實現一下幾個函數:
(mLocation != onStatusChanged(String arg0,
3~9行,我這裡只處理了
Location mLocation =
函數中,把新的location儲存到mLocation中,然後調用把地圖移動到該位置。
有時我們需要主動查詢最新的Location
String bestProvider = Location newLoction = (bestProvider != newLoction = (mLocation == mLocation = Location("" (newLoction != }
3行,擷取最優的provider
7行,擷取最近一次的location
8~16行,同樣的,新位置記錄到mLocation中。
getBestProvider函數體如下:
private String getBestProvider(){
Criteria criteria = new Criteria();
criteria.setPowerRequirement(Criteria.POWER_LOW);
criteria.setAccuracy(Criteria.ACCURACY_FINE);
String bestOne = mLocManager.getBestProvider(criteria, true);
return bestOne;
}
上文用到的兩個函數
setLatLng( (mLocation == Toast.makeText( dLat = dLong = log("setLatLng: (" + dLat + "," + dLong + ")" LatLng latlng = ((latlng.latitude == 0) && (latlng.longitude == 0 } mMapView.moveCamera(CameraUpdateFactory.newLatLngZoom(latlng, 15 animateLatLng( (mLocation == Toast.makeText( dLat = dLong = log("animateLatLng: (" + dLat + "," + dLong + ")" LatLng latlng = }
先看第一個:
7~8行,從mLocation中調用getLatitude()取得維度,getLongitude()取得經度。
12行,構造一個LatLng對象
16行, mMapView.moveCamera(CameraUpdateFactory.newLatLngZoom(latlng, 15));
CameraUpdateFactory.newLatLngZoom(latlng, 15) 返回一個CameraUpdate對象,入參是經緯度和zoom level;
GoogleMap的moveCamera方法把地圖移動到該位置。
函數
31行 基本相同,唯一的區別是最後調用的是animateCamera,我們會看到地圖從原location移動到新location的過程。而moveCamera方法是瞬移過去的,不會看到移動過程。
CameraUpdate有很多中構造方法,可以單獨或同時指定位置和放大倍數。指定邊界等待,詳見
https://developers.google.com/maps/documentation/android/reference/com/google/android/gms/maps/CameraUpdateFactory
最後,要在onPause函數中登出位置服務監聽
mLocManager.removeUpdates(this);