google map 接入指南——map 詳解
講解Google map類基本用法和使用場景
map model 地圖模型
學習google map,我們要知道其思想是通過建立一些模型和實體概念來簡化相關認識。
BitmapDescriptor | 定義點陣圖影象。 |
BitmapDescriptorFactory | 用於建立點陣圖影象的定義,用於標記圖示和地面疊加。 |
ButtCap | 在Polyline 實線筆劃圖案的開始或結束頂點處準確平方的頂點,相當於在開始或結束頂點之外沒有額外的頂點。 |
CameraPosition | 一個不可變類,它聚合所有攝像機位置引數,例如位置,縮放級別,傾斜角度和方位。 |
CameraPosition.Builder | 建立相機位置。 |
Cap | 不可變的上限可以應用於a的起點或終點Polyline 。 |
Circle | 地球表面上的一個圓圈(球冠)。 |
CircleOptions | 定義a的選項Circle 。 |
點陣圖疊加以a的起始或結束頂點為中心Polyline ,根據線的第一個或最後一個邊的方向定向,並相對於線的筆劃寬度進行縮放。 |
|
Dash | 表示為一個行程圖案中使用短劃線不可變類Polyline 或一的輪廓Polygon 或Circle 。 |
Dot | 表示為一個行程圖案中的點的不可變類Polyline 或一的輪廓Polygon 或Circle 。 |
Gap | 表示用於在行程模式中使用的間隙的不可變類 或一的輪廓Polygon 或Circle 。 |
GroundOverlay | 地面疊加層是固定在地圖上的影象。 |
的GroundOverlayOptions | 定義地面疊加層的選項。 |
IndoorBuilding | 代表一座建築。 |
IndoorLevel | 表示建築物中的水平。 |
JointType | 聯合型別Polyline 和概述Polygon 。 |
LatLng | 表示一對緯度和經度座標的不可變類,以度為單位儲存。 |
的LatLngBounds | 表示緯度/經度對齊矩形的不可變類。 |
LatLngBounds.Builder | 這是一個能夠根據一組LatLng點建立最小邊界的構建器。 |
MapStyleOptions | 為a定義樣式選項GoogleMap 。 |
Marker | 放置在地圖表面特定點的圖示。 |
的MarkerOptions | 為標記定義MarkerOptions。 |
PatternItem | 在一個行程模式使用一成不變的專案 Polyline 或輪廓Polygon 或Circle 。 |
PointOfInterest | 包含有關單擊的PointOfInterest的資訊。 |
Polygon | 地球表面的多邊形。 |
的PolygonOptions | 定義多邊形的選項。 |
Polyline | 折線是一個點列表,其中線段在連續點之間繪製。 |
的PolylineOptions | 定義折線的選項。 |
RoundCap | 半徑等於行程寬度一半的半圓形帽,Polyline 以實線筆劃圖案的起點或終點為中心。 |
SquareCap | 在將筆畫寬度的一半延伸到Polyline 具有實線筆劃圖案的開始或結束頂點之後,將其平方。 |
StreetViewPanoramaCamera | 一個聚合所有攝像機位置引數的不可變類。 |
StreetViewPanoramaCamera.Builder | 構建全景相機。 |
StreetViewPanoramaLink | 一個不可變類,表示指向另一個街景全景圖的連結。 |
StreetViewPanoramaLocation | 一個不可變類,包含使用者當前街景全景圖的詳細資訊 |
StreetViewPanoramaOrientation | 一個聚合所有使用者視點引數的不可變類。 |
StreetViewPanoramaOrientation.Builder | 構建街景全景方向。 |
StreetViewSource | 用於將街景搜尋限制為選定來源的識別符號。 |
Tile | 包含有關由a返回的Tile的資訊TileProvider 。 |
TileOverlay | 平鋪疊加是一組影象,顯示在基本地圖圖塊的頂部。 |
TileOverlayOptions | 定義TileOverlay的選項。 |
UrlTileProvider | 部分實現TileProvider 只需要指向要提供的影象的URL。 |
VisibleRegion | 包含定義在地圖相機中可見的四邊形多邊形的四個點。 |
mapView 上的一些UI 就是對應上面的各種model,那我們瞭解這些模型相關的api,就能大致知道如何去運用地圖了。比如如何新增相關model,及相關事件處理;
基本用法
- 畫線:
private static final Dash DASH = new Dash(50); private static final Gap GAP = new Gap(20); private static final List<PatternItem> PATTERN_DASHED = Arrays.asList(DASH, GAP); mPolyline = mMap.addPolyline(new PolylineOptions() .add(latLng, new LatLng(latLng.latitude, toRadiusLatLng(latLng, 200).longitude)) .color(getResources().getColor(R.color.colorAccent)) .width(10) //短線 50 點為DOT 沒有長度單位 .pattern(PATTERN_DASHED) .zIndex(2) .clickable(true));
- 標記marker
mCenterMarker = mMap.addMarker(new MarkerOptions() .position(latLng) //系統標記圖示 .icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_RED)) .draggable(true) .zIndex(2) .title("detection marker")); //也可以換成自己的Bitmap .icon(BitmapDescriptorFactory.fromBitmap(getBitmap(xx))
-
多邊形
mMutablePolygon = map.addPolygon(new PolygonOptions() .addAll(createRectangle(CENTER, 5, 5)) .addHole(createRectangle(new LatLng(-22, 128), 1, 1)) .addHole(createRectangle(new LatLng(-18, 133), 0.5, 1.5)) .fillColor(fillColorArgb) .strokeColor(strokeColorArgb) .strokeWidth(mStrokeWidthBar.getProgress()) .clickable(mClickabilityCheckbox.isChecked())); 就是多個線連線起來的
圓形
mCircle = mMap.addCircle(new CircleOptions()
.center(new LatLng(latLng.latitude , latLng.longitude))
.radius(200)
.strokeWidth(5)
.strokeColor(getResources().getColor(R.color.detectionCircle))
//填充色為透明
.fillColor(0x220000FF)
.zIndex(2)
.clickable(true));
UI Settings 設定
文件說明;該類只要控制地圖介面上的UI 控制元件和一些手勢動作,這裡對一些重要的類做一些解析:
boolean | isCompassEnabled() Gets whether the compass is enabled/disabled. |
boolean | isIndoorLevelPickerEnabled() Gets whether the indoor level picker is enabled/disabled. |
boolean | isMapToolbarEnabled() Gets whether the Map Toolbar is enabled/disabled. |
boolean | isMyLocationButtonEnabled() Gets whether the my-location button is enabled/disabled. |
boolean | isRotateGesturesEnabled() Gets whether rotate gestures are enabled/disabled. |
boolean | isScrollGesturesEnabled() Gets whether scroll gestures are enabled/disabled. |
boolean | isTiltGesturesEnabled() Gets whether tilt gestures are enabled/disabled. |
boolean | isZoomControlsEnabled() Gets whether the zoom controls are enabled/disabled. |
boolean | isZoomGesturesEnabled() Gets whether zoom gestures are enabled/disabled. |
void | setAllGesturesEnabled(boolean enabled) Sets the preference for whether all gestures should be enabled or disabled. |
void | setCompassEnabled(boolean enabled) Enables or disables the compass. |
void | setIndoorLevelPickerEnabled(boolean enabled) Sets whether the indoor level picker is enabled when indoor mode is enabled. |
void | setMapToolbarEnabled(boolean enabled) Sets the preference for whether the Map Toolbar should be enabled or disabled. |
void | setMyLocationButtonEnabled(boolean enabled) Enables or disables the my-location button. |
void | setRotateGesturesEnabled(boolean enabled) Sets the preference for whether rotate gestures should be enabled or disabled. |
void | setScrollGesturesEnabled(boolean enabled) Sets the preference for whether scroll gestures should be enabled or disabled. |
void | setTiltGesturesEnabled(boolean enabled) Sets the preference for whether tilt gestures should be enabled or disabled. |
void | setZoomControlsEnabled(boolean enabled) Enables or disables the zoom controls. |
void | setZoomGesturesEnabled(boolean enabled) Sets the preference for whether zoom gestures should be enabled or disabled. |
一般的,我們是在地圖載入成功後,進行map的UI Setting 設定,如:
@SuppressLint("MissingPermission")
private void initMapSetting() {
mMap.getUiSettings().setAllGesturesEnabled(true);
//mMap.getUiSettings().setZoomControlsEnabled(true);
mMap.getUiSettings().setCompassEnabled(false);
mMap.getUiSettings().setMyLocationButtonEnabled(true);
//禁止右下角的兩個系統圖標
mMap.getUiSettings().setMapToolbarEnabled(false);
//定位功能開啟
mMap.setMyLocationEnabled(true);
//定位按鈕點選事件
mMap.setOnMyLocationButtonClickListener(this);
mMap.setOnCameraChangeListener(this);
}
@SuppressLint("MissingPermission")
private void forbidMapOperation() {
mMap.getUiSettings().setAllGesturesEnabled(false);
//mMap.getUiSettings().setZoomControlsEnabled(false);
mMap.getUiSettings().setMyLocationButtonEnabled(false);
mMap.setMyLocationEnabled(false);
mMap.setOnMyLocationButtonClickListener(null);
mMap.setOnCameraChangeListener(this);
}
比如說 展現羅盤,縮放按鈕,定位按鈕,手勢操作等設定。
回撥事件
文件說明;主要常用的有 On(Map,Marker,Circle,MyLocationButton--定位按鈕,Polygon--多邊形,Polyline--線,InfoWindow--字型資訊)ClickListener ,OnMapLongClickListener ,OnMarkerDragListener,onCameraChangeListener(相機位置和屬性改變後);這些回撥的規律是:圍繞一些地圖上的模型點選,移動,長按的事件進行回撥;
縮放和移動的 文件說明 ;google地圖的縮放級別從1(洲)——20(街道);注意縮放其實是相機的視角變化,並不是地圖本身進行縮放,這一點對於移動也是,移動本身不是mapView的移動,而是地圖上方的相機進行移動,這一點是地圖和相機的關係,理解這一點很重要。
更改縮放級別並設定最小/最大縮放
CameraUpdateFactory.zoomIn()
並 CameraUpdateFactory.zoomOut()
給你一個CameraUpdate
改變縮放級別1.0,同時保持所有其他屬性相同。
CameraUpdateFactory.zoomTo(float)
為您提供一個CameraUpdate
將縮放級別更改為給定值,同時保持所有其他屬性相同的值。
CameraUpdateFactory.zoomBy(float)
並 CameraUpdateFactory.zoomBy(float, Point)
給你一個CameraUpdate
增加(或減少,如果值為負)的縮放級別給定的值。後者固定螢幕上的給定點,使得它保持在相同的位置(緯度/經度),因此它可以改變相機的位置以實現此目的。
您可能會發現設定首選的最小和/或最大縮放級別很有用。例如,如果您的應用顯示感興趣點周圍的已定義區域,或者您使用的是具有有限縮放級別的自定義圖塊疊加層,則此功能可用於控制使用者的體驗。
設定縮放範圍:
mMap.setMinZoomPreference(6.0f);
mMap.setMaxZoomPreference(14.0f);
改變相機位置
常見的位置變化有兩種方便的方法。 CameraUpdateFactory.newLatLng(LatLng)
給你一個CameraUpdate
改變相機的經度和經度,同時保留所有其他屬性。 CameraUpdateFactory.newLatLngZoom(LatLng, float)
為您提供CameraUpdate
更改相機的緯度,經度和變焦,同時保留所有其他屬性。
為了在更改攝像機位置時具有完全的靈活性,使用 CameraUpdateFactory.newCameraPosition(CameraPosition)
它CameraUpdate
可以將攝像機移動到給定位置。A CameraPosition
可以直接獲得,使用 new CameraPosition()
或CameraPosition.Builder
使用 new CameraPosition.Builder()
。
mMap.moveCamera(CameraUpdateFactory.newLatLngZoom(new LatLng(mLastLocation.getLatitude(), mLastLocation.getLongitude()), 15));
平移(滾動)
CameraUpdateFactory.scrollBy(float, float)
為您提供一個CameraUpdate
更改相機的緯度和經度,使地圖按指定的畫素數移動。正x值會使攝像機向右移動,以使地圖看起來向左移動。正y值會使相機向下移動,以使地圖看起來向上移動。相反,負x值會導致相機向左移動,因此地圖似乎已向右移動,負y值會導致相機向上移動。滾動是相對於相機的當前方向。例如,如果攝像機的軸承為90度,則向東“向上”。
onCameraChangeListener
這個回撥很重要,我們的很多邏輯可以在這裡處理,現在此方法已被廢棄,被以下回調替代
GoogleMap.OnCameraMoveStartedListener
GoogleMap.OnCameraMoveListener
GoogleMap.OnCameraIdleListener
目前先寫這麼多了,後面繼續增加地圖區域設定,電子圍欄功能使用。