ภาพรวมการควบคุม
แผนที่ที่แสดงผ่าน Maps JavaScript API มีองค์ประกอบ UI ที่ให้ผู้ใช้โต้ตอบกับแผนที่ได้ องค์ประกอบเหล่านี้เรียกว่า การควบคุม และคุณสามารถรวมการควบคุมแบบต่างๆ เหล่านี้ไว้ใน แอปพลิเคชัน หรือจะปล่อยไว้โดยไม่ทำอะไรเลยก็ได้ แล้วให้ Maps JavaScript API จัดการลักษณะการทํางานของการควบคุมทั้งหมด
แผนที่ต่อไปนี้แสดงชุดการควบคุมเริ่มต้นที่ Maps JavaScript API แสดง
ด้านล่างนี้เป็นรายการการควบคุมทั้งหมดที่คุณสามารถใช้ในแผนที่ได้
- การควบคุมการซูมจะแสดงปุ่ม "+" และ "-" สำหรับเปลี่ยนระดับการซูมของแผนที่ การควบคุมนี้จะปรากฏโดยค่าเริ่มต้นใน ที่มุมขวาล่างของแผนที่
- การควบคุมกล้องมีทั้งการควบคุมการซูมและการควบคุมการเลื่อน โดยจะแสดงโดยค่าเริ่มต้นแทนการควบคุมการซูมเมื่อใช้แชแนลเบต้า
- การควบคุมประเภทแผนที่มีอยู่ในเมนูแบบเลื่อนลง
หรือรูปแบบแถบปุ่มแนวนอน ซึ่งช่วยให้ผู้ใช้เลือกประเภทแผนที่
(
ROADMAP
,SATELLITE
,HYBRID
หรือTERRAIN
) การควบคุมนี้จะปรากฏที่ด้านซ้ายบนโดยค่าเริ่มต้น มุมของแผนที่ - การควบคุม Street View มีไอคอนเพ็กแมน ซึ่งสามารถลากไปไว้บนแผนที่เพื่อเปิดใช้ Street View ได้ ตัวควบคุมนี้จะปรากฏขึ้นที่ด้านขวาล่างของแผนที่โดยค่าเริ่มต้น
- การควบคุมการหมุนมีชุดค่าผสมของ ตัวเลือกการเอียงและหมุนสำหรับแผนที่ที่มีภาพเอียง ตัวควบคุมนี้จะปรากฏขึ้นที่ด้านขวาล่างของแผนที่โดยค่าเริ่มต้น ดูข้อมูลเพิ่มเติมได้ที่ภาพมุม 45°
- ตัวควบคุมการปรับขนาดจะแสดงองค์ประกอบสเกลแผนที่ การควบคุมนี้จะปิดใช้โดยค่าเริ่มต้น
- การควบคุมแบบเต็มหน้าจอจะมีตัวเลือกในการเปิด แผนที่ในโหมดเต็มหน้าจอ การควบคุมนี้จะเปิดใช้โดยค่าเริ่มต้นในเดสก์ท็อปและอุปกรณ์เคลื่อนที่ หมายเหตุ: iOS ไม่รองรับฟีเจอร์แบบเต็มหน้าจอ ดังนั้น การควบคุมแบบเต็มหน้าจอจะเป็น ไม่ปรากฏในอุปกรณ์ iOS
- การควบคุมแป้นพิมพ์ลัดจะแสดงรายการแป้นพิมพ์ลัดสำหรับการโต้ตอบกับแผนที่
คุณจะไม่เข้าถึงหรือแก้ไขการควบคุมแผนที่เหล่านี้โดยตรง แต่คุณแก้ไขฟิลด์ MapOptions
ของแผนที่แทน ซึ่งส่งผลต่อการแสดงผลและระดับการเข้าถึงของการควบคุม คุณสามารถปรับการแสดงการควบคุมเมื่อสร้างอินสแตนซ์แผนที่ (โดยใช้ MapOptions
ที่เหมาะสม) หรือแก้ไขแผนที่แบบไดนามิกโดยการเรียกใช้ setOptions()
เพื่อเปลี่ยนตัวเลือกของแผนที่
การควบคุมเหล่านี้ไม่ได้เปิดใช้โดยค่าเริ่มต้น ดูข้อมูลเกี่ยวกับลักษณะการทํางานของ UI เริ่มต้น (และวิธีแก้ไขลักษณะการทํางานดังกล่าว) ได้ที่UI เริ่มต้นด้านล่าง
UI เริ่มต้น
โดยค่าเริ่มต้น ตัวควบคุมทั้งหมดจะหายไปหากแผนที่มีขนาดเล็กเกินไป (200x200 พิกเซล) คุณสามารถลบล้างลักษณะการทำงานนี้ได้โดยตั้งค่าตัวควบคุมเป็น มองเห็นได้ โปรดดูการเพิ่มการควบคุมลงในแผนที่
ลักษณะการทำงานและรูปลักษณ์ของการควบคุมจะเหมือนกันทั้งในอุปกรณ์เคลื่อนที่และ อุปกรณ์เดสก์ท็อป ยกเว้นการควบคุมแบบเต็มหน้าจอ (ดูลักษณะการทำงาน ตามที่อธิบายไว้ในรายการควบคุม)
นอกจากนี้ การจัดการแป้นพิมพ์จะเปิดอยู่โดยค่าเริ่มต้นในอุปกรณ์ทุกเครื่อง
ปิดใช้ UI เริ่มต้น
คุณอาจต้องปิดปุ่ม UI เริ่มต้นของ API เลย โดยดำเนินการดังนี้
กำหนดพร็อพเพอร์ตี้ disableDefaultUI
ของแผนที่ (ภายใน
MapOptions
ของออบเจ็กต์) ไปยัง true
พร็อพเพอร์ตี้นี้จะปิดใช้ปุ่มควบคุม UI จาก Maps JavaScript API ทั้งนี้
อย่างไรก็ตาม ไม่ส่งผลต่อท่าทางสัมผัสของเมาส์หรือแป้นพิมพ์ลัดที่อยู่บริเวณฐาน
แผนที่ ซึ่งควบคุมโดย gestureHandling
และ
keyboardShortcuts
พร็อพเพอร์ตี้ตามลำดับ
โค้ดต่อไปนี้จะปิดใช้ปุ่ม UI
TypeScript
function initMap(): void { const map = new google.maps.Map( document.getElementById("map") as HTMLElement, { zoom: 4, center: { lat: -33, lng: 151 }, disableDefaultUI: true, } ); } declare global { interface Window { initMap: () => void; } } window.initMap = initMap;
JavaScript
function initMap() { const map = new google.maps.Map(document.getElementById("map"), { zoom: 4, center: { lat: -33, lng: 151 }, disableDefaultUI: true, }); } window.initMap = initMap;
ลองใช้ตัวอย่าง
เพิ่มการควบคุมลงในแผนที่
คุณอาจต้องปรับแต่งอินเทอร์เฟซด้วยการนําออก เพิ่ม หรือแก้ไขลักษณะการทํางานหรือการควบคุม UI และตรวจสอบว่าการอัปเดตในอนาคตจะไม่เปลี่ยนแปลงลักษณะการทํางานนี้ หากคุณต้องการแค่เพิ่มหรือแก้ไขลักษณะการทำงานที่มีอยู่ คุณต้อง ตรวจสอบว่ามีการเพิ่มตัวควบคุมโดยตรงในแอปพลิเคชัน
ตัวควบคุมบางอย่างจะปรากฏบนแผนที่โดยค่าเริ่มต้น แต่ตัวควบคุมอื่นๆ จะไม่ปรากฏ
เว้นแต่คุณจะร้องขออย่างเจาะจง การเพิ่มหรือนำการควบคุมออกจากแผนที่จะระบุไว้ในช่องของMapOptions
ออบเจ็กต์ต่อไปนี้ ซึ่งคุณตั้งค่าเป็น true
เพื่อให้มองเห็นหรือตั้งค่าเป็น false
เพื่อซ่อน
{ zoomControl: boolean, cameraControl: boolean, mapTypeControl: boolean, scaleControl: boolean, streetViewControl: boolean, rotateControl: boolean, fullscreenControl: boolean }
โดยค่าเริ่มต้น ตัวควบคุมทั้งหมดจะหายไปหากแผนที่มีขนาดเล็กกว่า 200x200 พิกเซล
คุณสามารถลบล้างลักษณะการทำงานนี้ได้โดยการตั้งค่าให้การควบคุมแสดงอย่างชัดแจ้ง ตัวอย่างเช่น ตารางต่อไปนี้แสดงว่าตัวควบคุมการซูมจะแสดงหรือไม่ โดยอิงตามขนาดแผนที่และการตั้งค่าช่อง zoomControl
ขนาดของแผนที่ | zoomControl |
มองเห็นได้ไหม |
---|---|---|
ตามแต่ละประเทศ | false |
ไม่ได้ |
ตามแต่ละประเทศ | true |
ใช่ |
>= 200x200 พิกเซล | undefined |
ใช่ |
< 200x200 พิกเซล | undefined |
ไม่ได้ |
ตัวอย่างต่อไปนี้กำหนดให้แผนที่ซ่อนการซูม และแสดงการควบคุมการปรับขนาด โปรดทราบว่าเราจะไม่ ปิดใช้ UI เริ่มต้น ดังนั้นการแก้ไขเหล่านี้จะเป็นส่วนเพิ่มเติมให้กับ UI เริ่มต้น พฤติกรรมของคุณ
TypeScript
function initMap(): void { const map = new google.maps.Map( document.getElementById("map") as HTMLElement, { zoom: 4, center: { lat: -33, lng: 151 }, zoomControl: false, scaleControl: true, } ); } declare global { interface Window { initMap: () => void; } } window.initMap = initMap;
JavaScript
function initMap() { const map = new google.maps.Map(document.getElementById("map"), { zoom: 4, center: { lat: -33, lng: 151 }, zoomControl: false, scaleControl: true, }); } window.initMap = initMap;
ลองใช้ตัวอย่าง
ตัวเลือกการควบคุม
การควบคุมหลายรายการสามารถกําหนดค่าได้ ซึ่งจะช่วยให้คุณเปลี่ยนแปลงลักษณะการทํางานหรือลักษณะที่ปรากฏได้ ตัวอย่างเช่น ตัวควบคุมประเภทแผนที่อาจปรากฏเป็นแถบแนวนอนหรือเมนูแบบเลื่อนลง
การควบคุมเหล่านี้มีการแก้ไขโดยการเปลี่ยนตัวเลือกการควบคุมที่เหมาะสม
ภายในออบเจ็กต์ MapOptions
ขณะสร้างแผนที่
เช่น ตัวเลือกสำหรับการเปลี่ยนแปลงตัวควบคุมประเภทแผนที่จะระบุไว้ในช่อง mapTypeControlOptions
ตัวควบคุมประเภทแผนที่อาจปรากฏใน
ตัวเลือกใดตัวเลือกหนึ่งต่อไปนี้ style
:
google.maps.MapTypeControlStyle.HORIZONTAL_BAR
แสดง อาร์เรย์ของการควบคุมในรูปแบบปุ่มในแถบแนวนอนตามที่แสดงใน Google Mapsgoogle.maps.MapTypeControlStyle.DROPDOWN_MENU
แสดงตัวควบคุมปุ่มเดียวที่ช่วยให้คุณเลือกประเภทแผนที่ได้โดยใช้เมนูแบบเลื่อนลงgoogle.maps.MapTypeControlStyle.DEFAULT
แสดงลักษณะการทำงานเริ่มต้น ซึ่งขึ้นอยู่กับขนาดหน้าจอและอาจเปลี่ยนแปลงใน API เวอร์ชันในอนาคต
โปรดทราบว่าหากคุณแก้ไขตัวเลือกการควบคุม คุณควรเปิดใช้
ควบคุมด้วยโดยตั้งค่า MapOptions
ที่เหมาะสม
ไปยัง true
ตัวอย่างเช่น ในการตั้งค่าตัวควบคุมประเภทแผนที่
เพื่อแสดงรูปแบบ DROPDOWN_MENU
ให้ใช้โค้ดต่อไปนี้ภายใน
ออบเจ็กต์ MapOptions
:
... mapTypeControl: true, mapTypeControlOptions: { style: google.maps.MapTypeControlStyle.DROPDOWN_MENU } ...
ตัวอย่างต่อไปนี้แสดงวิธีเปลี่ยนตำแหน่งเริ่มต้นและ ของการควบคุม
TypeScript
// You can set control options to change the default position or style of many // of the map controls. function initMap(): void { const map = new google.maps.Map( document.getElementById("map") as HTMLElement, { zoom: 4, center: { lat: -33, lng: 151 }, mapTypeControl: true, mapTypeControlOptions: { style: google.maps.MapTypeControlStyle.DROPDOWN_MENU, mapTypeIds: ["roadmap", "terrain"], }, } ); } declare global { interface Window { initMap: () => void; } } window.initMap = initMap;
JavaScript
// You can set control options to change the default position or style of many // of the map controls. function initMap() { const map = new google.maps.Map(document.getElementById("map"), { zoom: 4, center: { lat: -33, lng: 151 }, mapTypeControl: true, mapTypeControlOptions: { style: google.maps.MapTypeControlStyle.DROPDOWN_MENU, mapTypeIds: ["roadmap", "terrain"], }, }); } window.initMap = initMap;
ลองใช้ตัวอย่าง
โดยปกติ การควบคุมจะถูกกำหนดค่าเมื่อมีการสร้างแผนที่ อย่างไรก็ตาม คุณอาจปรับเปลี่ยนการแสดงตัวควบคุมแบบไดนามิกได้โดยเรียกใช้เมธอด setOptions()
ของ Map
โดยส่งตัวเลือกการควบคุมใหม่ให้
แก้ไขการควบคุม
คุณสามารถระบุการนำเสนอของการควบคุมเมื่อคุณสร้างแผนที่ของคุณ
ผ่านช่องต่างๆ ภายในออบเจ็กต์ MapOptions
ของแผนที่ เหล่านี้
ฟิลด์จะแสดงอยู่ด้านล่าง:
zoomControl
เปิด/ปิดการควบคุมการซูม โดยค่าเริ่มต้น การควบคุมนี้จะปรากฏและปรากฏบริเวณด้านล่างขวาของแผนที่ นอกจากนี้ ช่องzoomControlOptions
ยังระบุZoomControlOptions
เพื่อใช้สำหรับการควบคุมนี้cameraControl
เปิด/ปิดการควบคุมกล้อง การควบคุมนี้จะปรากฏโดยค่าเริ่มต้นบนแผนที่ที่ใช้ เวอร์ชันเบต้า ฟิลด์cameraControlOptions
จะระบุฟิลด์CameraControlOptions
เพื่อใช้สำหรับการควบคุมนี้mapTypeControl
เปิด/ปิดการควบคุมประเภทแผนที่ซึ่งช่วยให้ผู้ใช้สลับระหว่างแผนที่ประเภทต่างๆ ได้ (เช่น แผนที่และภาพถ่ายดาวเทียม) โดยค่าเริ่มต้น การควบคุมนี้จะปรากฏที่มุมซ้ายบนของแผนที่ ช่องmapTypeControlOptions
ยังระบุMapTypeControlOptions
ที่จะใช้สําหรับการควบคุมนี้ด้วยstreetViewControl
เปิด/ปิดการควบคุม Pegman ที่ช่วยให้ผู้ใช้เปิดใช้งานภาพพาโนรามาของ Street View ได้ โดยค่าเริ่มต้น ตัวควบคุมนี้จะปรากฏอยู่ใกล้กับด้านล่างขวาของแผนที่ ช่องstreetViewControlOptions
ระบุStreetViewControlOptions
เพิ่มเติม เพื่อใช้สำหรับการควบคุมนี้rotateControl
เปิด/ปิดการแสดงตัวควบคุมการหมุนสำหรับควบคุมการวางแนวของภาพ 45° โดย โดยค่าเริ่มต้น การมีตัวควบคุมจะขึ้นอยู่กับการปรากฏหรือการไม่มีอยู่ ภาพ 45° สำหรับประเภทแผนที่ที่ระบุเมื่อซูมปัจจุบันและ ตำแหน่งนั้น คุณอาจเปลี่ยนลักษณะการทํางานของการควบคุมได้โดยการตั้งค่าrotateControlOptions
ของแผนที่เพื่อระบุRotateControlOptions
ที่จะใช้ คุณไม่สามารถทำให้ตัวควบคุมปรากฏขึ้นได้หากไม่มีภาพมุม 45°scaleControl
เปิด/ปิดการควบคุมขนาดแผนที่ โดยค่าเริ่มต้น การควบคุมนี้จะมองไม่เห็น เมื่อเปิดใช้แล้ว ฟีเจอร์นี้จะปรากฏที่มุมขวาล่างของแผนที่เสมอscaleControlOptions
จะระบุScaleControlOptions
เพิ่มเติมที่จะใช้สำหรับการควบคุมนี้fullscreenControl
จะเปิด/ปิดใช้ตัวควบคุมที่เปิด แผนที่ในโหมดเต็มหน้าจอ การควบคุมนี้จะเปิดใช้อยู่โดยค่าเริ่มต้น บนเดสก์ท็อปและอุปกรณ์ Android เมื่อเปิดใช้ ตัวควบคุมจะปรากฏที่ด้านขวาบนของแผนที่fullscreenControlOptions
จะระบุFullscreenControlOptions
เพิ่มเติมเพื่อใช้สำหรับการควบคุมนี้
โปรดทราบว่าคุณจะระบุตัวเลือกสำหรับการควบคุมที่คุณปิดใช้ในตอนแรกได้
การควบคุมการจัดตำแหน่ง
ตัวเลือกการควบคุมส่วนใหญ่มีพร็อพเพอร์ตี้ 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
บ่งบอกว่าควรวางการควบคุมไว้ที่ด้านขวาล่างของแผนที่ โดยให้องค์ประกอบย่อยของการควบคุม "ไหล" ไปทางกึ่งกลางด้านล่าง
โปรดทราบว่าตำแหน่งเหล่านี้อาจสัมพันธ์กับตำแหน่งขององค์ประกอบ UI ซึ่งมีตำแหน่งที่คุณไม่สามารถแก้ไข (เช่น ลิขสิทธิ์และโลโก้ของ Google) ในกรณีดังกล่าว ตัวควบคุมจะทำงานตามตรรกะที่ระบุไว้สำหรับแต่ละตำแหน่ง และจะปรากฏใกล้กับตำแหน่งที่ระบุไว้มากที่สุด
ตัวอย่างต่อไปนี้แสดงแผนที่ง่ายๆ ที่เปิดใช้การควบคุมทั้งหมดในตำแหน่งต่างๆ
TypeScript
function initMap(): void { const map = new google.maps.Map( document.getElementById("map") as HTMLElement, { zoom: 12, center: { lat: -28.643387, lng: 153.612224 }, mapTypeControl: true, mapTypeControlOptions: { style: google.maps.MapTypeControlStyle.HORIZONTAL_BAR, position: google.maps.ControlPosition.TOP_CENTER, }, zoomControl: true, zoomControlOptions: { position: google.maps.ControlPosition.LEFT_CENTER, }, scaleControl: true, streetViewControl: true, streetViewControlOptions: { position: google.maps.ControlPosition.LEFT_TOP, }, fullscreenControl: true, } ); } declare global { interface Window { initMap: () => void; } } window.initMap = initMap;
JavaScript
function initMap() { const map = new google.maps.Map(document.getElementById("map"), { zoom: 12, center: { lat: -28.643387, lng: 153.612224 }, mapTypeControl: true, mapTypeControlOptions: { style: google.maps.MapTypeControlStyle.HORIZONTAL_BAR, position: google.maps.ControlPosition.TOP_CENTER, }, zoomControl: true, zoomControlOptions: { position: google.maps.ControlPosition.LEFT_CENTER, }, scaleControl: true, streetViewControl: true, streetViewControlOptions: { position: google.maps.ControlPosition.LEFT_TOP, }, fullscreenControl: true, }); } window.initMap = initMap;
ลองใช้ตัวอย่าง
การควบคุมที่กำหนดเอง
นอกจากการแก้ไขสไตล์และตําแหน่งของการควบคุม API ที่มีอยู่แล้ว คุณยังสร้างการควบคุมของคุณเองเพื่อจัดการการโต้ตอบกับผู้ใช้ได้ด้วย ตัวควบคุมคือวิดเจ็ตแบบคงที่ซึ่งลอยอยู่เหนือแผนที่ในตำแหน่งสัมบูรณ์ ต่างจากการวางซ้อนซึ่งจะเคลื่อนไหวตามแผนที่ที่อยู่เบื้องล่าง โดยทั่วไปแล้ว ตัวควบคุมคือองค์ประกอบ <div>
ซึ่งมีตําแหน่งสัมบูรณ์บนแผนที่ แสดง UI บางรายการต่อผู้ใช้ และจัดการการโต้ตอบกับผู้ใช้หรือแผนที่ โดยปกติแล้วจะผ่านตัวแฮนเดิลเหตุการณ์
การสร้างการควบคุมที่กำหนดเองจำเป็นต้องใช้กฎ 2-3 ข้อ อย่างไรก็ตาม หลักเกณฑ์ต่อไปนี้อาจใช้เป็นแนวทางปฏิบัติแนะนำได้
- กำหนด CSS ที่เหมาะสมสำหรับองค์ประกอบควบคุมที่จะแสดง
- จัดการการโต้ตอบกับผู้ใช้หรือแผนที่ผ่านตัวแฮนเดิลเหตุการณ์สําหรับการเปลี่ยนแปลงพร็อพเพอร์ตี้แผนที่หรือเหตุการณ์ของผู้ใช้ (เช่น เหตุการณ์
'click'
) - สร้างองค์ประกอบ
<div>
เพื่อเก็บการควบคุมและเพิ่มองค์ประกอบนี้ลงในพร็อพเพอร์ตี้controls
ของMap
เราจะพูดถึงข้อกังวลเหล่านี้แต่ละข้อด้านล่าง
การวาดตัวควบคุมที่กำหนดเอง
คุณวาดการควบคุมอย่างไรก็ได้ โดยทั่วไป เราขอแนะนำให้คุณ
วางงานนำเสนอการควบคุมทั้งหมดของคุณไว้ใน
<div>
ให้คุณปรับแต่งการควบคุม
หนึ่งหน่วย เราจะใช้รูปแบบการออกแบบนี้ในตัวอย่างที่แสดงด้านล่าง
การออกแบบการควบคุมที่น่าสนใจต้องใช้ความรู้เกี่ยวกับโครงสร้าง CSS และ DOM โค้ดต่อไปนี้แสดงฟังก์ชันในการสร้างองค์ประกอบปุ่ม ที่เลื่อนแผนที่ให้เป็นจุดศูนย์กลางของชิคาโก
function createCenterControl(map) { const controlButton = document.createElement("button"); // Set CSS for the control. controlButton.style.backgroundColor = "#fff"; controlButton.style.border = "2px solid #fff"; controlButton.style.borderRadius = "3px"; controlButton.style.boxShadow = "0 2px 6px rgba(0,0,0,.3)"; controlButton.style.color = "rgb(25,25,25)"; controlButton.style.cursor = "pointer"; controlButton.style.fontFamily = "Roboto,Arial,sans-serif"; controlButton.style.fontSize = "16px"; controlButton.style.lineHeight = "38px"; controlButton.style.margin = "8px 0 22px"; controlButton.style.padding = "0 5px"; controlButton.style.textAlign = "center"; controlButton.textContent = "Center Map"; controlButton.title = "Click to recenter the map"; controlButton.type = "button"; // Setup the click event listeners: simply set the map to Chicago. controlButton.addEventListener("click", () => { map.setCenter(chicago); }); return controlButton; }
การจัดการเหตุการณ์จากการควบคุมที่กำหนดเอง
หากต้องการใช้ประโยชน์จากการควบคุม จะต้องดำเนินการบางอย่างจริงๆ คุณจะกำหนดให้การควบคุมทํางานอย่างไรก็ได้ ตัวควบคุมอาจตอบสนองต่อข้อมูลจากผู้ใช้ หรืออาจตอบสนอง
การเปลี่ยนแปลงในสถานะของ Map
สําหรับตอบกลับข้อมูลของผู้ใช้ ให้ใช้ addEventListener()
ที่จัดการเหตุการณ์ DOM ที่รองรับ ข้อมูลโค้ดต่อไปนี้จะเพิ่ม Listener สําหรับเหตุการณ์ 'click'
ของเบราว์เซอร์ โปรดทราบว่าเหตุการณ์นี้ได้รับจาก DOM ไม่ใช่จากแผนที่
// Setup the click event listener: set the map to center on Chicago var chicago = {lat: 41.850, lng: -87.650}; controlButton.addEventListener('click', () => { map.setCenter(chicago); });
การทำให้การควบคุมที่กำหนดเองสามารถเข้าถึงได้
วิธีตรวจสอบว่าตัวควบคุมได้รับเหตุการณ์เกี่ยวกับแป้นพิมพ์และปรากฏต่อโปรแกรมอ่านหน้าจออย่างถูกต้อง
- ใช้องค์ประกอบ HTML ดั้งเดิมสำหรับปุ่ม องค์ประกอบแบบฟอร์ม และป้ายกำกับเสมอ ใช้เฉพาะ DIV เป็นคอนเทนเนอร์สำหรับเก็บการควบคุมแบบเนทีฟ อย่าใช้ DIV ซ้ำเป็น UI แบบอินเทอร์แอกทีฟ
- ใช้องค์ประกอบ
label
แอตทริบิวต์title
หรือaria-label
ตามที่เหมาะสม เพื่อระบุข้อมูลเกี่ยวกับองค์ประกอบ UI
การวางตัวควบคุมที่กำหนดเอง
ระบบจะวางตำแหน่งตัวควบคุมที่กำหนดเองบนแผนที่โดยการวางไว้ในตำแหน่งที่เหมาะสม
ตำแหน่งภายใน controls
ของออบเจ็กต์ Map
พร็อพเพอร์ตี้นี้มีอาร์เรย์ของ
google.maps.ControlPosition
วินาที คุณเพิ่มการควบคุมที่กำหนดเองลงในแผนที่ได้โดยเพิ่ม Node
(โดยทั่วไปคือ <div>
) ลงใน ControlPosition
ที่เหมาะสม (สำหรับข้อมูลเกี่ยวกับ
ให้ดูควบคุมการจัดตำแหน่ง
above.)
ControlPosition
แต่ละรายการจะจัดเก็บ MVCArray
ของตัวควบคุมที่แสดงในตําแหน่งนั้น ผลที่ได้คือเมื่อมีการเพิ่มตัวควบคุมหรือ
นำออกจากตำแหน่งแล้ว API จะอัปเดตตัวควบคุมให้สอดคล้องกัน
API จะวางการควบคุมในแต่ละตำแหน่งตามลำดับของ
พร็อพเพอร์ตี้ index
ที่มีดัชนีต่ำกว่าจะได้รับตำแหน่งก่อน
ตัวอย่างเช่น การควบคุมที่กำหนดเอง 2 รายการที่ตำแหน่ง BOTTOM_RIGHT
จะ
แสดงตามลำดับดัชนีนี้ โดยค่าดัชนีที่ต่ำกว่าจะใช้
ลำดับความสำคัญ โดยค่าเริ่มต้น ระบบจะวางการควบคุมที่กําหนดเองทั้งหมดหลังการวางการควบคุมเริ่มต้นของ API คุณจะลบล้างลักษณะการทำงานนี้ได้โดยการตั้งค่าพร็อพเพอร์ตี้ index
ของการควบคุมเป็นค่าลบ การควบคุมที่กำหนดเอง
ไม่สามารถวางด้านซ้ายของโลโก้หรือด้านขวาของ
ลิขสิทธิ์
โค้ดต่อไปนี้จะสร้างการควบคุมที่กําหนดเองใหม่ (ไม่แสดงตัวสร้างคอนโทรล) และเพิ่มลงในแผนที่ในตําแหน่ง TOP_RIGHT
var map = new google.maps.Map(document.getElementById('map'), mapOptions); // Create a DIV to attach the control UI to the Map. const centerControlDiv = document.createElement("div"); // Create the control. This code calls a function that // creates a new instance of a button control. const centerControl = createCenterControl(map); // Append the control to the DIV. centerControlDiv.appendChild(centerControl); // 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_CENTER].push(centerControlDiv);
ตัวอย่างการควบคุมที่กำหนดเอง
การควบคุมต่อไปนี้ทำได้ง่าย (แต่อาจไม่มีประโยชน์มากนัก) และ
รวมรูปแบบที่แสดงด้านบน การควบคุมนี้จะตอบสนองต่อเหตุการณ์ DOM 'click'
โดยจัดกําหนดให้แผนที่อยู่กึ่งกลางในตําแหน่งเริ่มต้นที่เจาะจง ดังนี้
TypeScript
let map: google.maps.Map; const chicago = { lat: 41.85, lng: -87.65 }; /** * Creates a control that recenters the map on Chicago. */ function createCenterControl(map) { const controlButton = document.createElement('button'); // Set CSS for the control. controlButton.style.backgroundColor = '#fff'; controlButton.style.border = '2px solid #fff'; controlButton.style.borderRadius = '3px'; controlButton.style.boxShadow = '0 2px 6px rgba(0,0,0,.3)'; controlButton.style.color = 'rgb(25,25,25)'; controlButton.style.cursor = 'pointer'; controlButton.style.fontFamily = 'Roboto,Arial,sans-serif'; controlButton.style.fontSize = '16px'; controlButton.style.lineHeight = '38px'; controlButton.style.margin = '8px 0 22px'; controlButton.style.padding = '0 5px'; controlButton.style.textAlign = 'center'; controlButton.textContent = 'Center Map'; controlButton.title = 'Click to recenter the map'; controlButton.type = 'button'; // Setup the click event listeners: simply set the map to Chicago. controlButton.addEventListener('click', () => { map.setCenter(chicago); }); return controlButton; } function initMap() { map = new google.maps.Map(document.getElementById('map') as HTMLElement, { zoom: 12, center: chicago, }); // Create the DIV to hold the control. const centerControlDiv = document.createElement('div'); // Create the control. const centerControl = createCenterControl(map); // Append the control to the DIV. centerControlDiv.appendChild(centerControl); map.controls[google.maps.ControlPosition.TOP_CENTER].push(centerControlDiv); } declare global { interface Window { initMap: () => void; } } window.initMap = initMap;
JavaScript
let map; const chicago = { lat: 41.85, lng: -87.65 }; /** * Creates a control that recenters the map on Chicago. */ function createCenterControl(map) { const controlButton = document.createElement("button"); // Set CSS for the control. controlButton.style.backgroundColor = "#fff"; controlButton.style.border = "2px solid #fff"; controlButton.style.borderRadius = "3px"; controlButton.style.boxShadow = "0 2px 6px rgba(0,0,0,.3)"; controlButton.style.color = "rgb(25,25,25)"; controlButton.style.cursor = "pointer"; controlButton.style.fontFamily = "Roboto,Arial,sans-serif"; controlButton.style.fontSize = "16px"; controlButton.style.lineHeight = "38px"; controlButton.style.margin = "8px 0 22px"; controlButton.style.padding = "0 5px"; controlButton.style.textAlign = "center"; controlButton.textContent = "Center Map"; controlButton.title = "Click to recenter the map"; controlButton.type = "button"; // Setup the click event listeners: simply set the map to Chicago. controlButton.addEventListener("click", () => { map.setCenter(chicago); }); return controlButton; } function initMap() { map = new google.maps.Map(document.getElementById("map"), { zoom: 12, center: chicago, }); // Create the DIV to hold the control. const centerControlDiv = document.createElement("div"); // Create the control. const centerControl = createCenterControl(map); // Append the control to the DIV. centerControlDiv.appendChild(centerControl); map.controls[google.maps.ControlPosition.TOP_CENTER].push(centerControlDiv); } window.initMap = initMap;
ลองใช้ตัวอย่าง
การเพิ่มสถานะไปยังตัวควบคุม
ตัวควบคุมยังอาจจัดเก็บสถานะด้วย ตัวอย่างต่อไปนี้คล้ายกับตัวอย่างที่แสดงก่อนหน้านี้ แต่ตัวควบคุมมีปุ่ม "ตั้งเป็นบ้าน" เพิ่มเติม ซึ่งจะตั้งค่าตัวควบคุมให้แสดงตำแหน่งบ้านใหม่ โดยการสร้าง
พร็อพเพอร์ตี้ home_
ภายในการควบคุมเพื่อจัดเก็บสถานะนี้และ
จัดหา Getters และ Setters สำหรับรัฐนั้น
TypeScript
let map: google.maps.Map; const chicago: google.maps.LatLngLiteral = { lat: 41.85, lng: -87.65 }; /** * The CenterControl adds a control to the map that recenters the map on * Chicago. */ class CenterControl { private map_: google.maps.Map; private center_: google.maps.LatLng; constructor( controlDiv: HTMLElement, map: google.maps.Map, center: google.maps.LatLngLiteral ) { this.map_ = map; // Set the center property upon construction this.center_ = new google.maps.LatLng(center); controlDiv.style.clear = "both"; // Set CSS for the control border const goCenterUI = document.createElement("button"); goCenterUI.id = "goCenterUI"; goCenterUI.title = "Click to recenter the map"; controlDiv.appendChild(goCenterUI); // Set CSS for the control interior const goCenterText = document.createElement("div"); goCenterText.id = "goCenterText"; goCenterText.innerHTML = "Center Map"; goCenterUI.appendChild(goCenterText); // Set CSS for the setCenter control border const setCenterUI = document.createElement("button"); setCenterUI.id = "setCenterUI"; setCenterUI.title = "Click to change the center of the map"; controlDiv.appendChild(setCenterUI); // Set CSS for the control interior const setCenterText = document.createElement("div"); setCenterText.id = "setCenterText"; setCenterText.innerHTML = "Set Center"; setCenterUI.appendChild(setCenterText); // Set up the click event listener for 'Center Map': Set the center of // the map // to the current center of the control. goCenterUI.addEventListener("click", () => { const currentCenter = this.center_; this.map_.setCenter(currentCenter); }); // Set up the click event listener for 'Set Center': Set the center of // the control to the current center of the map. setCenterUI.addEventListener("click", () => { const newCenter = this.map_.getCenter()!; if (newCenter) { this.center_ = newCenter; } }); } } function initMap(): void { map = new google.maps.Map(document.getElementById("map") as HTMLElement, { zoom: 12, center: chicago, }); // Create the DIV to hold the control and call the CenterControl() // constructor passing in this DIV. const centerControlDiv = document.createElement("div"); const control = new CenterControl(centerControlDiv, map, chicago); // @ts-ignore centerControlDiv.index = 1; centerControlDiv.style.paddingTop = "10px"; map.controls[google.maps.ControlPosition.TOP_CENTER].push(centerControlDiv); } declare global { interface Window { initMap: () => void; } } window.initMap = initMap;
JavaScript
let map; const chicago = { lat: 41.85, lng: -87.65 }; /** * The CenterControl adds a control to the map that recenters the map on * Chicago. */ class CenterControl { map_; center_; constructor(controlDiv, map, center) { this.map_ = map; // Set the center property upon construction this.center_ = new google.maps.LatLng(center); controlDiv.style.clear = "both"; // Set CSS for the control border const goCenterUI = document.createElement("button"); goCenterUI.id = "goCenterUI"; goCenterUI.title = "Click to recenter the map"; controlDiv.appendChild(goCenterUI); // Set CSS for the control interior const goCenterText = document.createElement("div"); goCenterText.id = "goCenterText"; goCenterText.innerHTML = "Center Map"; goCenterUI.appendChild(goCenterText); // Set CSS for the setCenter control border const setCenterUI = document.createElement("button"); setCenterUI.id = "setCenterUI"; setCenterUI.title = "Click to change the center of the map"; controlDiv.appendChild(setCenterUI); // Set CSS for the control interior const setCenterText = document.createElement("div"); setCenterText.id = "setCenterText"; setCenterText.innerHTML = "Set Center"; setCenterUI.appendChild(setCenterText); // Set up the click event listener for 'Center Map': Set the center of // the map // to the current center of the control. goCenterUI.addEventListener("click", () => { const currentCenter = this.center_; this.map_.setCenter(currentCenter); }); // Set up the click event listener for 'Set Center': Set the center of // the control to the current center of the map. setCenterUI.addEventListener("click", () => { const newCenter = this.map_.getCenter(); if (newCenter) { this.center_ = newCenter; } }); } } function initMap() { map = new google.maps.Map(document.getElementById("map"), { zoom: 12, center: chicago, }); // Create the DIV to hold the control and call the CenterControl() // constructor passing in this DIV. const centerControlDiv = document.createElement("div"); const control = new CenterControl(centerControlDiv, map, chicago); // @ts-ignore centerControlDiv.index = 1; centerControlDiv.style.paddingTop = "10px"; map.controls[google.maps.ControlPosition.TOP_CENTER].push(centerControlDiv); } window.initMap = initMap;