控制項概述 Google Maps 上的地圖包含用戶界面元素,可以讓用戶通過地圖進行交互。這些元素稱為“控制項”。您可以在 Google Maps API 應用程式中添加這些控制項的多種組合。或者,您也可以不進行任何操作,讓 Google Maps API 處理所有控制項行為。 Google Maps AP ...
控制項概述
Google Maps 上的地圖包含用戶界面元素,可以讓用戶通過地圖進行交互。這些元素稱為“控制項”。您可以在 Google Maps API 應用程式中添加這些控制項的多種組合。或者,您也可以不進行任何操作,讓 Google Maps API 處理所有控制項行為。
Google Maps API 帶有大量可以在地圖中使用的內置控制項:
- 縮放控制項會顯示一個滑塊(對於大型地圖)或小型的“+/-”按鈕(對於小型地圖),用於控制地圖的縮放級別。在非觸摸的設備上,該控制項預設顯示在地圖的左上角,而在觸摸設備上則會出現在左下角。
- 平移控制項顯示了用於平移地圖的按鈕。在非觸摸的設備上,該控制項預設顯示在地圖的左上角。您還可以使用平移控制項對圖像進行 45° 旋轉(如果可用的話)。
- 比例控制項,用於顯示地圖比例元素。預設情況下,系統不會啟用此控制項。
- MapType 控制項,可讓用戶在不同的地圖類型(例如
ROADMAP
和SATELLITE
)之間進行切換。該控制項預設顯示在地圖的右上角。 - Street View 控制項包含一個街景小人圖標,將該圖標拖動到地圖上即可啟用 Street View。該控制項預設顯示在地圖的左上角。
- 旋轉控制項包含一個較小的圓形圖標,可讓您旋轉包含斜面圖像的地圖。該控制項預設顯示在地圖的左上角(有關詳情,請參見 45° 圖像)。
- 總覽圖控制項會顯示一個簡略的總覽圖,用於在更廣闊區域內反映當前的地圖視口。該控制項預設以壓縮狀態顯示在地圖的右下角。
請註意:以前提供的導航控制項已棄用,系統已將其分割為獨立的縮放和平移控制項。
您無法直接訪問或修改這些地圖控制項,而應修改地圖的 MapOptions
欄位,這些欄位會影響控制項的可見性和顯示方式。您可以在初始化地圖時調整控制項的顯示(使用適當MapOptions
),或者通過調用 setOptions()
以更改地圖的選項,對地圖進行動態修改。
預設情況下,系統並不會啟用所有這些控制項。要瞭解有關預設用戶界面行為(以及如何修改此類行為)的信息,請參閱下麵的預設用戶界面部分。
預設用戶界面
您可能只想指定自己的地圖展示 Google Maps 界面的外觀(其中包括以後要添加到地圖中的所有新特征或控制項),而不想指定和設置單獨的控制項。要實現此行為,您無需進行任何操作。地圖將會顯示預設控制項。
預設控制項集
Google Maps API 提供了以下預設控制項:
控制項 | 大屏幕 | 小屏幕 | iPhone | Android |
---|---|---|---|---|
縮放 | 大型縮放控制項,適用於 400x350 像素以上的屏幕 | 小型縮放控制項,適用於 400x350 像素以下的屏幕 | 不顯示。縮放是通過兩根手指的開合操作來實現的。 | “觸摸”式控制項 |
平移 | 對 400x350 像素以上的屏幕顯示 | 對 400x350 像素以下的屏幕不顯示 | 不顯示。平移是通過觸摸來實現的。 | 不顯示。平移是通過觸摸來實現的。 |
MapType | 水平欄,適用於寬度在 320 像素以上的屏幕 | 下拉菜單,適用於寬度在 320 像素以下的屏幕 | 與大屏幕/小屏幕相同 | 與大屏幕/小屏幕相同 |
比例 | 不存在 | 不存在 | 不存在 | 不存在 |
此外,預設情況下,系統對所有設備都啟用了鍵盤處理功能。
停用預設用戶界面
有時,您可能希望關閉 API 的預設用戶界面設置。要進行上述操作,請將 Map
的 disableDefaultUI
屬性(在 Map options
對象中)設置為 true
。此屬性可停用 Google Maps API 中所有自動執行的用戶界面行為。
以下代碼可徹底停用預設用戶界面:
function initialize() {
var myOptions = {
zoom: 4,
center: new google.maps.LatLng(-33, 151),
disableDefaultUI: true,
mapTypeId: google.maps.MapTypeId.ROADMAP
}
var map = new google.maps.Map(document.getElementById("map_canvas"),
myOptions);
}
向地圖添加控制項
您可能想要通過刪除、添加或修改用戶界面行為或控制項調整您的界面,並確保即使以後進行了更新,也不會改變這種行為。如果您只想添加或修改現有的行為,您需要確保以顯式的方式將相應的控制項添加到自己的應用程式中。
有些控制項在預設情況下會出現在地圖上,而其他控制項則只有在您明確提出相關請求後,才會顯示出來。在地圖中添加控制項,或者從地圖中刪除控制項都是在以下 Map options
對象的欄位中指定的,您可以將這些欄位設置為 true
以顯示相應的控制項,或者設置為 false
以隱藏相應的控制項:
{
panControl: boolean,
zoomControl: boolean,
mapTypeControl: boolean,
scaleControl: boolean,
streetViewControl: boolean,
overviewMapControl: boolean
}
以下示例對地圖進行了設置,使其隱藏導航(縮放和平移)控制項,同時顯示比例控制項。請註意,我們並未顯式停用預設用戶界面,因此,您可在預設用戶界面行為中加入這些修改。
function initialize() {
var myOptions = {
zoom: 4,
center: new google.maps.LatLng(-33, 151),
panControl: false,
zoomControl: false,
scaleControl: true,
mapTypeId: google.maps.MapTypeId.ROADMAP
}
var map = new google.maps.Map(document.getElementById("map_canvas"),
myOptions);
}
控制項選項
有些控制項是可以配置的,這樣,您就可以更改它們的行為或外觀。例如,縮放控制項可顯示為帶有滑塊的大型完整控制項,也可以顯示為適用於較小地圖的小型迷你縮放控制項。
您可以在創建地圖時更改 MapOptions
對象內適當的控制項選項欄位,從而對這些控制項進行修改。例如,用於更改縮放控制項的選項位於 zoomControlOptions
欄位中。
縮放控制項可能出現在以下某個 style
選項中:
google.maps.ZoomControlStyle.SMALL
,用於顯示迷你縮放控制項,其中僅限 + 和 - 按鈕。此樣式適用於小型地圖。在觸摸設備上,該控制項顯示為可響應觸摸事件的 + 和 -按鈕。google.maps.ZoomControlStyle.LARGE
用於顯示標準縮放滑塊控制項。在觸摸設備上,該控制項顯示為可響應觸摸事件的 + 和 - 按鈕。google.maps.ZoomControlStyle.DEFAULT
會按照地圖大小和運行地圖的設備來挑選合適的縮放控制項。
MapType 控制項可顯示為以下 style
選項之一:
google.maps.MapTypeControlStyle.HORIZONTAL_BAR
,用於在水平欄中將一組控制項顯示為如 Google Maps 中所示按鈕。google.maps.MapTypeControlStyle.DROPDOWN_MENU
,用於顯示單個按鈕控制項,以便您從下拉菜單中選擇地圖類型。google.maps.MapTypeControlStyle.DEFAULT
,用於顯示“預設”的行為,該行為取決於屏幕尺寸,並且可能會在 API 以後的版本中有所變化。
請註意,如果您確實想要修改任何控制項選項,您還是應當通過將 MapOptions
值設置為 true
以顯式地啟用相應的控制項。例如,要將縮放控制項設置為顯示 SMALL
樣式,請在MapOptions
對象內使用以下代碼:
...
zoomControl: true,
zoomControlOptions: {
style: google.maps.ZoomControlStyle.SMALL
}
...
以下示例設置了一個下拉 MapType 控制項,並指定縮放控制項使用小型迷你縮放佈局:
function initialize() {
var myOptions = {
zoom: 4,
center: new google.maps.LatLng(-33, 151),
mapTypeControl: true,
mapTypeControlOptions: {
style: google.maps.MapTypeControlStyle.DROPDOWN_MENU
},
zoomControl: true,
zoomControlOptions: {
style: google.maps.ZoomControlStyle.SMALL
},
mapTypeId: google.maps.MapTypeId.ROADMAP
}
var map = new google.maps.Map(document.getElementById("map_canvas"),
myOptions);
}
控制項通常是在創建地圖時配置的。但是,您可以通過調用 Map
的 setOptions()
方法併為其傳遞新的控制項選項動態更改控制項的顯示。
修改控制項
您可以在創建地圖時通過地圖的 MapOptions
對象中的欄位指定控制項的顯示。下麵對這些欄位進行了說明:
mapTypeControl
可啟用/停用“地圖類型”控制項,該控制項允許用戶在地圖類型(如“地圖”和“衛星”)之間切換。預設情況下,此控制項將顯示在地圖右上角。mapTypeControlOptions
欄位可進一步指定要用於此控制項的MapTypeControlOptions
。panControl
可啟用/停用平移控制項。預設情況下,此控制項將顯示在地圖左上角。panControlOptions
欄位可進一步指定要用於此控制項的PanControlOptions
。zoomControl
可啟用/停用縮放控制項。預設情況下,此控制項將顯示在地圖左上角。zoomControlOptions
欄位可進一步指定要用於此控制項的ZoomControlOptions
。scaleControl
可啟用/停用“比例”控制項,該控制項可提供一個簡單的地圖比例尺。預設情況下,不會顯示此控制項。啟用後,它將顯示在地圖的左下角。scaleControlOptions
可進一步指定用於此控制項的ScaleControlOptions
。rotateControl
可決定顯示/不顯示用於控制 45° 圖像方向的旋轉控制項。預設情況下,該控制項是否顯示取決於指定的地圖類型在當前縮放級別和位置上是否存在 45° 圖像。要更改控制項的行為,您可以設置地圖的rotateControlOptions
以指定要使用的RotateControlOptions
(不過,如果當前沒有可用的 45° 圖像,則無法顯示該控制項)。overviewMapControl
可啟用/停用總覽圖控制項。總覽圖控制項可以顯示為完整的控制項(展示簡略的總覽圖),也可以顯示為壓縮的最小化狀態。預設情況下,該控制項處於停用和壓縮狀態。overviewMapControlOptions
可進一步指定用於此控制項的OverviewMapControlOptions
。
請註意,您可以為您最初停用的控制項指定選項。
控制項定位
每個控制項選項都包含一個 position
屬性(類型為 ControlPosition
),它指明要在地圖上放置該控制項的位置。控制項的定位並不是絕對的;相反,API 會在給定的約束條件(如地圖大小)下,通過圍繞現有地圖元素或其他控制項“流動”控制項以智能方式佈局控制項。註意:雖然 API 會嘗試以智能方式排列控制項,但這並不能保證控制項不會疊加指定的複雜佈局。
系統支持以下控制項位置:
TOP_CENTER
表示控制項應沿著地圖頂部中心放置。TOP_LEFT
表示控制項應沿著地圖頂部左側放置,控制項的任何子元素“流”向頂部中心。TOP_RIGHT
表示控制項應沿著地圖頂部右側放置,控制項的任何子元素“流”向頂部中心。LEFT_TOP
表示控制項應沿著地圖頂部左側放置,但應位於所有TOP_LEFT
元素的下方。RIGHT_TOP
表示控制項應沿著地圖頂部右側放置,但應位於所有TOP_RIGHT
元素的下方。LEFT_CENTER
表示控制項應沿著地圖左側放置,位於TOP_LEFT
和BOTTOM_LEFT
位置的中間。RIGHT_CENTER
表示控制項應沿著地圖右側放置,位於TOP_RIGHT
和BOTTOM_RIGHT
位置的中間。LEFT_BOTTOM
表示控制項應沿著地圖底部左側放置,但應位於所有BOTTOM_LEFT
元素的上方。RIGHT_BOTTOM
表示控制項應沿著地圖底部右側放置,但應位於所有BOTTOM_RIGHT
元素的上方。BOTTOM_CENTER
表示控制項應沿著地圖底部中心放置。BOTTOM_LEFT
表示控制項應沿著地圖底部左側放置,控制項的任何子元素“流”向底部中心。BOTTOM_RIGHT
表示控制項應沿著地圖底部右側放置,控制項的任何子元素“流”向底部中心。
請註意,這些位置可能會與用戶界面元素的位置相衝突,而您無法修改用戶界面元素(如版權和 Google 徽標)的位置。在這種情況下,控制項將按照每個位置的邏輯說明“流動”,並顯示在儘可能靠近指定位置的位置。
下麵的示例顯示了一個簡單的地圖,其中啟用了位於不同位置的所有控制項。
function initialize() {
var myOptions = {
zoom: 12,
center: new google.maps.LatLng(-28.643387, 153.612224),
mapTypeId: google.maps.MapTypeId.ROADMAP,
mapTypeControl: true,
mapTypeControlOptions: {
style: google.maps.MapTypeControlStyle.HORIZONTAL_BAR,
position: google.maps.ControlPosition.BOTTOM_CENTER
},
panControl: true,
panControlOptions: {
position: google.maps.ControlPosition.TOP_RIGHT
},
zoomControl: true,
zoomControlOptions: {
style: google.maps.ZoomControlStyle.LARGE,
position: google.maps.ControlPosition.LEFT_CENTER
},
scaleControl: true,
scaleControlOptions: {
position: google.maps.ControlPosition.TOP_LEFT
},
streetViewControl: true,
streetViewControlOptions: {
position: google.maps.ControlPosition.LEFT_TOP
}
}
var map = new google.maps.Map(document.getElementById("map_canvas"),
myOptions);
}
查看示例 (control-positioning.html)
自定義控制項
除了修改現有 API 控制項的樣式和位置外,您還可以創建自己的控制項以處理與用戶的交互操作。控制項是固定的視窗小部件,浮動在地圖之上的絕對位置處;這與“疊加”不同,後者會隨下麵的地圖一起移動。從本質上講,控制項只是一個在地圖上具有絕對位置的 <div>
元素,它會向用戶顯示某個用戶界面,並處理與用戶或地圖的交互(通常通過某個事件處理程式)。
要創建您自己的自定義控制項,沒有什麼需要遵循的“規則”。不過,您可以將以下指導原則視為最佳實踐的參考:
- 為待顯示的控制項元素定義適當的 CSS。
- 針對地圖屬性更改或用戶事件(如
'click'
事件),通過事件處理程式處理與用戶或地圖的交互。 - 創建一個
<div>
元素以承載控制項並將此元素添加到Map
的controls
屬性中。
下麵將分別對上述原則加以說明。
繪製自定義控制項
如何繪製控制項由您自己決定。一般來講,我們建議您將所有控制項的顯示方式放在一個單獨的 <div>
元素中,以便可以將控制項作為一個單元進行處理。我們將在下麵所示的示例中使用這種設計模式。
設計具有吸引力的控制項需要具備一些 CSS 和 DOM 結構方面的知識。以下代碼顯示瞭如何通過一個 <div>
容器、一個承載按鈕輪廓的 <div>
和另一個承載按鈕內部事項的 <div>
創建一個簡單的控制項。
// Create a div to hold the control.
var controlDiv = document.createElement('DIV');
// Set CSS styles for the DIV containing the control
// Setting padding to 5 px will offset the control
// from the edge of the map
controlDiv.style.padding = '5px';
// Set CSS for the control border
var controlUI = document.createElement('DIV');
controlUI.style.backgroundColor = 'white';
controlUI.style.borderStyle = 'solid';
controlUI.style.borderWidth = '2px';
controlUI.style.cursor = 'pointer';
controlUI.style.textAlign = 'center';
controlUI.title = 'Click to set the map to Home';
controlDiv.appendChild(controlUI);
// Set CSS for the control interior
var controlText = document.createElement('DIV');
controlText.style.fontFamily = 'Arial,sans-serif';
controlText.style.fontSize = '12px';
controlText.style.paddingLeft = '4px';
controlText.style.paddingRight = '4px';
controlText.innerHTML = 'Home';
controlUI.appendChild(controlText);
處理自定義控制項的事件
要使控制項有用,它必須能夠實際完成某些任務。控制項的用途由您確定。控制項可以響應用戶輸入,也可以響應 Map
的狀態變化。
為響應用戶輸入,Maps API 提供了一個跨瀏覽器的事件處理方法 addDomListener()
,它可以處理瀏覽器的多數支持的 DOM 事件。以下代碼段為瀏覽器的 'click'
事件添加了一個偵聽器。請註意,此事件是從 DOM 接收的,而不是從地圖。
// Setup the click event listener: simply set the map to center on Chicago
var chicago = new google.maps.LatLng(41.850033, -87.6500523);
google.maps.event.addDomListener(outer, 'click', function() {
map.setCenter(chicago)
});
定位自定義控制項
要在地圖上定位自定義控制項,您可以在 Map
對象的 controls
屬性中將其放在適當位置。此屬性包含一個 google.maps.ControlPosition
數組。您可以通過將 Node
(通常是<div>
)添加至適當 ControlPosition
向地圖中添加自定義控制項。(有關這些位置的信息,請參見上面的控制項定位。)
每個 ControlPosition
會存儲一個顯示在該位置的控制項的 MVCArray
。因此,當您向該位置添加或從中刪除控制項時,API 將相應更新控制項。
API 按照 index
屬性的順序將控制項放在每個位置,並會首先放置索引值較低的控制項。例如,位置 BOTTOM_RIGHT
處的兩個自定義控制項將按照此索引順序進行排列,並優先放置索引值較低的控制項。預設情況下,所有自定義控制項將在放置完任何 API 預設控制項之後進行放置。您可以通過將控制項的 index
屬性設置為一個負值覆蓋此行為。請註意,如果希望在放置相同位置的預設 API 控制項“之前”放置您的控制項,通常只需設置一個索引值。
以下代碼將創建一個新的自定義控制項(未顯示其構造函數)並將其添加到地圖中的 TOP_RIGHT
位置。
var map = new google.maps.Map(document.getElementById('map_canvas'), mapOptions);
// Construct your control in whatever manner is appropriate.
// Generally, your constructor will want access to the
// DIV on which you'll attach the control UI to the Map.
var controlDiv = document.createElement('DIV');
var myControl = new MyControl(controlDiv);
// We don't really need to set an index value here, but
// this would be how you do it. Note that we set this
// value as a property of the DIV itself.
controlDiv.index = 1;
// Add the control to the map at a designated control position
// by pushing it on the position's array. This code will
// implicitly add the control to the DOM, through the Map
// object. You should not attach the control manually.
map.controls[google.maps.ControlPosition.TOP_RIGHT].push(controlDiv);
自定義控制項示例
下麵是一個簡單的控制項(儘管不是很實用),其中綜合了上面所示的模式。該控制項通過將地圖在某個預設位置居中來響應 DOM 'click'
事件:
var map;
var chicago = new google.maps.LatLng(41.850033, -87.6500523);
/**
* The HomeControl adds a control to the map that simply
* returns the user to Chicago. This constructor takes
* the control DIV as an argument.
*/
function HomeControl(controlDiv, map) {
// Set CSS styles for the DIV containing the control
// Setting padding to 5 px will offset the control
// from the edge of the map
controlDiv.style.padding = '5px';
// Set CSS for the control border
var controlUI = document.createElement('DIV');
controlUI.style.backgroundColor = 'white';
controlUI.style.borderStyle = 'solid';
controlUI.style.borderWidth = '2px';
controlUI.style.cursor = 'pointer';
controlUI.style.textAlign = 'center';
controlUI.title = 'Click to set the map to Home';
controlDiv.appendChild(controlUI);
// Set CSS for the control interior
var controlText = document.createElement('DIV');
controlText.style.fontFamily = 'Arial,sans-serif';
controlText.style.fontSize = '12px';
controlText.style.paddingLeft = '4px';
controlText.style.paddingRight = '4px';
controlText.innerHTML = 'Home';
controlUI.appendChild(controlText);
// Setup the click event listeners: simply set the map to Chicago
google.maps.event.addDomListener(controlUI, 'click', function() {
map.setCenter(chicago)
});
}
function initialize() {
var mapDiv = document.getElementById('map_canvas');
var myOptions = {
zoom: 12,
center: chicago,
mapTypeId: google.maps.