เครื่องหมายระบุตําแหน่งหนึ่งแห่งบนแผนที่ คุณสามารถปรับแต่งเครื่องหมาย โดยการเปลี่ยนสีเริ่มต้น หรือแทนที่ไอคอนเครื่องหมายด้วย ภาพที่กําหนดเอง หน้าต่างข้อมูลสามารถให้บริบทเพิ่มเติมแก่เครื่องหมายได้
ตัวอย่างโค้ด
ที่เก็บ ApiDemos ใน GitHub มีตัวอย่างที่แสดงฟีเจอร์ต่างๆ ของตัวทําเครื่องหมายดังนี้
Java
- MapWithMarker: แผนที่ง่ายๆ ที่มีเครื่องหมาย ดูบทแนะนําเกี่ยวกับการเพิ่มแผนที่ด้วยเครื่องหมาย
- MarkerDemoActivity: การใช้เครื่องหมายบนแผนที่ ซึ่งรวมถึงตัวเลือกและผู้ฟัง
โคตลิน
- MapWithMarker: แผนที่ง่ายๆ ที่มีเครื่องหมาย ดูบทแนะนําเกี่ยวกับการเพิ่มแผนที่ด้วย Marker-kt
- MarkerDemoActivity: การใช้เครื่องหมายบนแผนที่ ซึ่งรวมถึงตัวเลือกและผู้ฟัง
ข้อมูลเบื้องต้น
เครื่องหมายระบุตําแหน่งบนแผนที่ เครื่องหมายเริ่มต้นใช้ไอคอนมาตรฐาน ซึ่งพบได้บ่อยในรูปลักษณ์ Google แผนที่ คุณสามารถเปลี่ยนสี
ไอคอน จุดยึด ของ API ได้ เครื่องหมายคือวัตถุประเภท Marker
และถูกเพิ่มลงในแผนที่โดยใช้เมธอด GoogleMap.addMarker(markerOptions)
เครื่องหมายได้รับการออกแบบมาให้เป็นแบบอินเทอร์แอ็กทีฟ โดยจะได้รับเหตุการณ์ click
โดยค่าเริ่มต้นและมักจะใช้กับ Listener เหตุการณ์เพื่อเปิดหน้าต่างข้อมูล การตั้งค่าพร็อพเพอร์ตี้ของ draggable
เป็น true
ทําให้ผู้ใช้เปลี่ยนตําแหน่งของเครื่องหมายได้ ใช้การกดค้างเพื่อเปิดใช้งานความสามารถในการย้ายเครื่องหมาย
โดยค่าเริ่มต้น เมื่อผู้ใช้แตะเครื่องหมาย แถบเครื่องมือแผนที่จะปรากฏที่ด้านล่างขวาของแผนที่เพื่อให้ผู้ใช้เข้าถึงแอป Google Maps บนอุปกรณ์เคลื่อนที่ได้อย่างรวดเร็ว คุณสามารถปิดใช้งานแถบเครื่องมือได้ สําหรับข้อมูลเพิ่มเติม โปรดดูคําแนะนําเกี่ยวกับการควบคุม
การเริ่มต้นใช้งานเครื่องหมาย
Maps Live ตอนนี้ครอบคลุมข้อมูลพื้นฐานของการเพิ่มเครื่องหมายลงในแผนที่ของคุณโดยใช้ Maps SDK สําหรับ Android
เพิ่มเครื่องหมาย
ตัวอย่างต่อไปนี้แสดงวิธีเพิ่มเครื่องหมายลงในแผนที่ เครื่องหมายระบุตําแหน่งถูกสร้างขึ้นที่พิกัด -33.852,151.211
(ซิดนีย์ ออสเตรเลีย) และแสดงสตริง "มาร์กเกอร์ในซิดนีย์" ในหน้าต่างข้อมูลเมื่อคลิก
Java
@Override public void onMapReady(GoogleMap googleMap) { // Add a marker in Sydney, Australia, // and move the map's camera to the same location. LatLng sydney = new LatLng(-33.852, 151.211); googleMap.addMarker(new MarkerOptions() .position(sydney) .title("Marker in Sydney")); googleMap.moveCamera(CameraUpdateFactory.newLatLng(sydney)); }
Kotlin
override fun onMapReady(googleMap: GoogleMap) { // Add a marker in Sydney, Australia, // and move the map's camera to the same location. val sydney = LatLng(-33.852, 151.211) googleMap.addMarker( MarkerOptions() .position(sydney) .title("Marker in Sydney") ) googleMap.moveCamera(CameraUpdateFactory.newLatLng(sydney)) }
แสดงข้อมูลเพิ่มเติมเกี่ยวกับเครื่องหมาย
ข้อกําหนดทั่วไปคือการแสดงข้อมูลเพิ่มเติมเกี่ยวกับสถานที่หรือตําแหน่ง เมื่อผู้ใช้แตะเครื่องหมายบนแผนที่ ดูคู่มือเกี่ยวกับหน้าต่างข้อมูล
เชื่อมโยงข้อมูลด้วยเครื่องหมาย
คุณสามารถจัดเก็บออบเจ็กต์ข้อมูลที่กําหนดเองด้วยเครื่องหมายโดยใช้ Marker.setTag()
และดึงออบเจ็กต์ข้อมูลโดยใช้ Marker.getTag()
ตัวอย่างด้านล่างแสดงวิธี
นับจํานวนครั้งที่มีการคลิกเครื่องหมายโดยใช้แท็ก
Java
/** * A demo class that stores and retrieves data objects with each marker. */ public class MarkerDemoActivity extends AppCompatActivity implements GoogleMap.OnMarkerClickListener, OnMapReadyCallback { private final LatLng PERTH = new LatLng(-31.952854, 115.857342); private final LatLng SYDNEY = new LatLng(-33.87365, 151.20689); private final LatLng BRISBANE = new LatLng(-27.47093, 153.0235); private Marker markerPerth; private Marker markerSydney; private Marker markerBrisbane; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_markers); SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.map); mapFragment.getMapAsync(this); } /** Called when the map is ready. */ @Override public void onMapReady(GoogleMap map) { // Add some markers to the map, and add a data object to each marker. markerPerth = map.addMarker(new MarkerOptions() .position(PERTH) .title("Perth")); markerPerth.setTag(0); markerSydney = map.addMarker(new MarkerOptions() .position(SYDNEY) .title("Sydney")); markerSydney.setTag(0); markerBrisbane = map.addMarker(new MarkerOptions() .position(BRISBANE) .title("Brisbane")); markerBrisbane.setTag(0); // Set a listener for marker click. map.setOnMarkerClickListener(this); } /** Called when the user clicks a marker. */ @Override public boolean onMarkerClick(final Marker marker) { // Retrieve the data from the marker. Integer clickCount = (Integer) marker.getTag(); // Check if a click count was set, then display the click count. if (clickCount != null) { clickCount = clickCount + 1; marker.setTag(clickCount); Toast.makeText(this, marker.getTitle() + " has been clicked " + clickCount + " times.", Toast.LENGTH_SHORT).show(); } // Return false to indicate that we have not consumed the event and that we wish // for the default behavior to occur (which is for the camera to move such that the // marker is centered and for the marker's info window to open, if it has one). return false; } }
Kotlin
/** * A demo class that stores and retrieves data objects with each marker. */ class MarkerDemoActivity : AppCompatActivity(), OnMarkerClickListener, OnMapReadyCallback { private val PERTH = LatLng(-31.952854, 115.857342) private val SYDNEY = LatLng(-33.87365, 151.20689) private val BRISBANE = LatLng(-27.47093, 153.0235) private var markerPerth: Marker? = null private var markerSydney: Marker? = null private var markerBrisbane: Marker? = null override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_markers) val mapFragment = supportFragmentManager.findFragmentById(R.id.map) as SupportMapFragment? mapFragment!!.getMapAsync(this) } /** Called when the map is ready. */ override fun onMapReady(map: GoogleMap) { // Add some markers to the map, and add a data object to each marker. markerPerth = map.addMarker( MarkerOptions() .position(PERTH) .title("Perth") ) markerPerth?.tag = 0 markerSydney = map.addMarker( MarkerOptions() .position(SYDNEY) .title("Sydney") ) markerSydney?.tag = 0 markerBrisbane = map.addMarker( MarkerOptions() .position(BRISBANE) .title("Brisbane") ) markerBrisbane?.tag = 0 // Set a listener for marker click. map.setOnMarkerClickListener(this) } /** Called when the user clicks a marker. */ override fun onMarkerClick(marker: Marker): Boolean { // Retrieve the data from the marker. val clickCount = marker.tag as? Int // Check if a click count was set, then display the click count. clickCount?.let { val newClickCount = it + 1 marker.tag = newClickCount Toast.makeText( this, "${marker.title} has been clicked $newClickCount times.", Toast.LENGTH_SHORT ).show() } // Return false to indicate that we have not consumed the event and that we wish // for the default behavior to occur (which is for the camera to move such that the // marker is centered and for the marker's info window to open, if it has one). return false } }
ต่อไปนี้คือตัวอย่างสถานการณ์บางส่วนเกี่ยวกับลักษณะที่ดีในการเก็บและเรียกข้อมูลด้วยเครื่องหมาย
- แอปอาจรองรับเครื่องหมายประเภทต่างๆ และคุณต้องการจัดการกับเครื่องหมายเหล่านั้นแตกต่างกันเมื่อผู้ใช้คลิก หากต้องการดําเนินการดังกล่าว คุณสามารถเก็บ
String
ที่มีเครื่องหมายซึ่งระบุประเภท - คุณอาจติดต่อกับระบบที่มีตัวระบุระเบียนที่ไม่ซ้ํากัน โดยเครื่องหมายนั้นจะเป็นระเบียนเฉพาะในระบบนั้น
- ข้อมูลตัวทําเครื่องหมายอาจระบุถึงลําดับความสําคัญที่จะใช้เมื่อเลือกดัชนี z ของตัวทําเครื่องหมาย
ทําให้เครื่องหมายสามารถลากได้
คุณสามารถย้ายเครื่องหมายระบุตําแหน่งได้เมื่อเพิ่มลงในแผนที่แล้ว ตราบใดที่คุณสมบัติ draggable
ของสถานที่นั้นถูกตั้งค่าเป็น true
กดเครื่องหมายค้างไว้เพื่อ
ลาก เมื่อคุณยกนิ้วออกจากหน้าจอ เครื่องหมายจะอยู่ในตําแหน่งนั้น
เครื่องหมายไม่สามารถลากได้โดยค่าเริ่มต้น คุณต้องกําหนดเครื่องหมายให้ลากได้โดยต้องลากด้วย MarkerOptions.draggable(boolean)
ก่อนที่จะเพิ่มในแผนที่
หรือ Marker.setDraggable(boolean)
เมื่อมีการเพิ่มในแผนที่แล้ว
คุณฟังเหตุการณ์การลากได้ของตัวทําเครื่องหมายตามที่อธิบายไว้ในเหตุการณ์การลากมาร์กเกอร์
ข้อมูลโค้ดด้านล่างเพิ่มเครื่องหมายที่ลากได้ที่เมืองเพิร์ธ ประเทศออสเตรเลีย
Java
final LatLng perthLocation = new LatLng(-31.90, 115.86); Marker perth = map.addMarker( new MarkerOptions() .position(perthLocation) .draggable(true));
Kotlin
val perthLocation = LatLng(-31.90, 115.86) val perth = map.addMarker( MarkerOptions() .position(perthLocation) .draggable(true) )
กําหนดค่าเครื่องหมาย
วิดีโอนี้จะแสดงวิธีใช้เครื่องหมายระบุตําแหน่งเพื่อแสดงภาพตําแหน่งบนแผนที่
เครื่องหมายอาจกําหนดภาพที่กําหนดเองเพื่อแสดงแทนที่ไอคอนเริ่มต้น การกําหนดไอคอนเกี่ยวข้องกับการตั้งค่าคุณสมบัติหลายอย่างที่มีผลต่อพฤติกรรมภาพของเครื่องหมาย
ตัวทําเครื่องหมายสนับสนุนการปรับแต่งผ่านคุณสมบัติต่อไปนี้
- ตําแหน่ง (จําเป็น)
- ค่า
LatLng
สําหรับตําแหน่งของเครื่องหมายบนแผนที่ พร็อพเพอร์ตี้นี้เป็นเพียงพร็อพเพอร์ตี้เดียวที่จําเป็นสําหรับออบเจ็กต์Marker
- สมอ
- จุดบนภาพที่จะวางที่เครื่องหมายละติจูดลองจิจูด ค่าเริ่มต้นนี้จะอยู่ตรงกลางของด้านล่างของรูปภาพ
- Alpha
- ตั้งค่าความทึบของเครื่องหมาย ค่าเริ่มต้นคือ 1.0
- ชื่อ
- สตริงที่ปรากฏในหน้าต่างข้อมูลเมื่อผู้ใช้แตะ เครื่องหมาย
- ตัวอย่างข้อมูล
- ข้อความเพิ่มเติมที่แสดงอยู่ด้านล่างชื่อ
- Icon
- บิตแมปที่แสดงแทนรูปภาพเครื่องหมายเริ่มต้น
- ลากได้
- ตั้งค่าเป็น
true
หากต้องการอนุญาตให้ผู้ใช้ย้ายเครื่องหมาย ค่าเริ่มต้นคือfalse
- แสดง
- ตั้งค่าเป็น
false
เพื่อซ่อนเครื่องหมาย ค่าเริ่มต้นคือtrue
- การจัดวางแนวราบหรือบิลบอร์ด
- โดยค่าเริ่มต้น เครื่องหมายจะใช้การวางแนวของป้ายบิลบอร์ด ซึ่งหมายความว่าจะวาดตามแนวของหน้าจออุปกรณ์ ไม่ใช่พื้นผิวของแผนที่ การหมุน การเอียง หรือการซูมแผนที่ไม่เปลี่ยนการวางแนวของเครื่องหมาย คุณสามารถตั้งค่าทิศทางของเครื่องหมายให้แบนกับพื้นโลก เครื่องหมายแสดงค่าแบบแบนราบจะหมุนเมื่อมีการหมุนแผนที่ และเปลี่ยนมุมมองเมื่อแผนที่เอียง เช่นเดียวกับเครื่องหมายบิลบอร์ด เครื่องหมายแสดงการแบนจะมีขนาดเท่าเดิมเมื่อซูมแผนที่เข้าหรือออก
- การหมุน
- การวางแนวของหมุด จะระบุเป็นองศาตามเข็มนาฬิกา ตําแหน่งเริ่มต้นจะเปลี่ยนหากเครื่องหมายแบน ตําแหน่งเริ่มต้นของเครื่องหมายคงที่จะอยู่ในระดับทิศเหนือ เมื่อเครื่องหมายไม่แบน ตําแหน่งเริ่มต้นจะชี้ขึ้น และการหมุนเป็นทิศทางที่หันกล้องเข้าหาตัว
ข้อมูลโค้ดด้านล่างจะสร้างเครื่องหมายแบบง่ายที่มีไอคอนเริ่มต้น
Java
final LatLng melbourneLocation = new LatLng(-37.813, 144.962); Marker melbourne = map.addMarker( new MarkerOptions() .position(melbourneLocation));
Kotlin
val melbourneLocation = LatLng(-37.813, 144.962) val melbourne = map.addMarker( MarkerOptions() .position(melbourneLocation) )
ปรับแต่งสีของเครื่องหมาย
คุณปรับแต่งสีของรูปภาพเครื่องหมายเริ่มต้นได้โดยการส่งออบเจ็กต์ BitmapDescriptor
ไปยังเมธอด icon() คุณจะใช้ชุดสีที่กําหนดไว้ล่วงหน้าในออบเจ็กต์ BitmapDescriptorFactory
หรือกําหนดสีเครื่องหมายแบบกําหนดเองโดยใช้เมธอด BitmapDescriptorFactory.defaultMarker(float hue)
ก็ได้ โทนสีนี้คือค่าระหว่าง 0 ถึง 360 ซึ่งแทนจุดบนวงล้อสี
Java
final LatLng melbourneLocation = new LatLng(-37.813, 144.962); Marker melbourne = map.addMarker( new MarkerOptions() .position(melbourneLocation) .icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_AZURE)));
Kotlin
val melbourneLocation = LatLng(-37.813, 144.962) val melbourne = map.addMarker( MarkerOptions() .position(melbourneLocation) .icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_AZURE)) )
ปรับแต่งความทึบแสงของตัวทําเครื่องหมาย
คุณสามารถควบคุมความทึบของตัวทําเครื่องหมายได้ด้วยเมธอด MarkerOptions.alpha() ในรุ่น Alpha ควรเป็นเลขทศนิยมระหว่าง 0.0 และ 1.0 โดย 0 หมายถึงโปร่งแสงเต็มที่ และ 1 หมายถึงทึบแสงเต็มที่
Java
final LatLng melbourneLocation = new LatLng(-37.813, 144.962); Marker melbourne = map.addMarker(new MarkerOptions() .position(melbourneLocation) .alpha(0.7f));
Kotlin
val melbourneLocation = LatLng(-37.813, 144.962) val melbourne = map.addMarker( MarkerOptions() .position(melbourneLocation) .alpha(0.7f) )
ปรับแต่งภาพเครื่องหมาย
คุณสามารถแทนที่เครื่องหมายเริ่มต้นด้วยภาพเครื่องหมายที่กําหนดเอง ซึ่งมักเรียกว่าไอคอน ไอคอนที่กําหนดเองจะมีการตั้งค่าเป็น BitmapDescriptor
เสมอ และกําหนดโดยใช้เมธอดใดเมธอดหนึ่งในคลาส BitmapDescriptorFactory
fromAsset(String assetName)
- สร้างตัวทําเครื่องหมายที่กําหนดเองโดยใช้ชื่อรูปภาพบิตแมปในไดเรกทอรีเนื้อหา
fromBitmap(Bitmap image)
- สร้างเครื่องหมายที่กําหนดเองจากรูปภาพบิตแมป
fromFile(String fileName)
- สร้างไอคอนที่กําหนดเองโดยใช้ชื่อไฟล์ภาพบิตแมปที่อยู่ในที่จัดเก็บข้อมูลภายใน
fromPath(String absolutePath)
- สร้างเครื่องหมายที่กําหนดเองจากเส้นทางไฟล์สัมบูรณ์ของรูปภาพในบิตแมป
fromResource(int resourceId)
- สร้างตัวทําเครื่องหมายที่กําหนดเองโดยใช้รหัสทรัพยากรของรูปภาพบิตแมป
ข้อมูลโค้ดด้านล่างจะสร้างเครื่องหมายที่มีไอคอนแบบกําหนดเอง
Java
final LatLng melbourneLocation = new LatLng(-37.813, 144.962); Marker melbourne = map.addMarker( new MarkerOptions() .position(melbourneLocation) .title("Melbourne") .snippet("Population: 4,137,400") .icon(BitmapDescriptorFactory.fromResource(R.drawable.arrow)));
Kotlin
val melbourneLocation = LatLng(-37.813, 144.962) val melbourne = map.addMarker( MarkerOptions() .position(melbourneLocation) .title("Melbourne") .snippet("Population: 4,137,400") .icon(BitmapDescriptorFactory.fromResource(R.drawable.arrow)) )
ขยายเครื่องหมาย
ไอคอนเครื่องหมายจะวาดตามหน้าจอ การหมุน เอียง หรือซูมแผนที่จะไม่เปลี่ยนแปลงแนวการวางของเครื่องหมาย คุณสามารถตั้งค่าทิศทางของเครื่องหมายให้แบนกับพื้นโลก หมุดที่อยู่ในทิศทางนี้จะหมุนเมื่อหมุนแผนที่ และเปลี่ยนมุมมองเมื่อแผนที่เอียง เครื่องหมายแบบแบนราบจะยังคงขนาดเดิมอยู่เมื่อมีการย่อหรือขยายแผนที่
หากต้องการเปลี่ยนการวางแนวของเครื่องหมาย ให้ตั้งค่าคุณสมบัติ flat
ของเครื่องหมายเป็น true
Java
final LatLng perthLocation = new LatLng(-31.90, 115.86); Marker perth = map.addMarker( new MarkerOptions() .position(perthLocation) .flat(true));
Kotlin
val perthLocation = LatLng(-31.90, 115.86) val perth = map.addMarker( MarkerOptions() .position(perthLocation) .flat(true) )
หมุนเครื่องหมาย
คุณหมุนเครื่องหมายรอบจุดยึดได้ด้วย Marker
setRotation()
การหมุนจะวัดเป็นองศาตามเข็มนาฬิกา
จากตําแหน่งเริ่มต้น เมื่อเครื่องหมายแบนราบบนแผนที่ ตําแหน่งเริ่มต้นจะเป็นทิศเหนือ เมื่อเครื่องหมายไม่แบน ตําแหน่งเริ่มต้นจะชี้ขึ้น และการหมุนเป็นทิศทางที่หันกล้องเข้าหาตัว
ตัวอย่างด้านล่างจะหมุนเครื่องหมาย 90° การตั้งค่าจุดยึดเป็น 0.5,0.5
จะทําให้เครื่องหมายหมุนรอบจุดกึ่งกลาง แทนที่จะเป็นฐาน
Java
final LatLng perthLocation = new LatLng(-31.90, 115.86); Marker perth = map.addMarker( new MarkerOptions() .position(perthLocation) .anchor(0.5f,0.5f) .rotation(90.0f));
Kotlin
val perthLocation = LatLng(-31.90, 115.86) val perth = map.addMarker( MarkerOptions() .position(perthLocation) .anchor(0.5f, 0.5f) .rotation(90.0f) )
ดัชนีลําดับ Z
ดัชนีลําดับ z จะระบุลําดับสแต็กของเครื่องหมายนี้เมื่อเทียบกับเครื่องหมายอื่นๆ บนแผนที่ ตัวทําเครื่องหมายที่มีดัชนี z สูงจะวาดอยู่ด้านบนตัวทําเครื่องหมายที่มีดัชนี z ต่ํากว่า ค่าดัชนีลําดับ z เริ่มต้นคือ 0
ตั้งค่าดัชนีลําดับ z บนออบเจ็กต์ตัวเลือกของเครื่องหมาย โดยเรียก MarkerOptions.zIndex()
ดังที่แสดงในข้อมูลโค้ดต่อไปนี้:
Java
map.addMarker(new MarkerOptions() .position(new LatLng(10, 10)) .title("Marker z1") .zIndex(1.0f));
Kotlin
map.addMarker( MarkerOptions() .position(LatLng(10.0, 10.0)) .title("Marker z1") .zIndex(1.0f) )
คุณสามารถเข้าถึงดัชนีลําดับ Z ของเครื่องหมายได้โดยการเรียกใช้ Marker.getZIndex()
และคุณสามารถเปลี่ยนค่าได้โดยโทรไปที่ Marker.setZIndex()
เครื่องหมายจะวาดอยู่ด้านบนของชิ้นส่วนแผนที่และการวางซ้อนอื่นๆ ที่ไม่ใช่เครื่องหมาย (การวางซ้อนพื้น รูปหลายเหลี่ยม รูปหลายเหลี่ยม และรูปร่างอื่นๆ) โดยไม่คํานึงถึงดัชนีลําดับ Z ของภาพซ้อนทับอื่นๆ เครื่องหมายจะถือว่าอยู่ ในกลุ่มดัชนี z แยกต่างหากอย่างมีประสิทธิภาพเมื่อเทียบกับภาพซ้อนทับอื่นๆ
อ่านข้อมูลผลกระทบของดัชนีลําดับ Z ที่มีต่อกิจกรรมการคลิกด้านล่าง
จัดการเหตุการณ์ของตัวทําเครื่องหมาย
Maps API ช่วยให้คุณฟังและตอบสนองต่อเหตุการณ์ของเครื่องหมายได้ หากต้องการฟังเหตุการณ์เหล่านี้ คุณต้องตั้งค่า Listener ที่เกี่ยวข้องในออบเจ็กต์ GoogleMap
ที่มีตัวทําเครื่องหมายอยู่ เมื่อเหตุการณ์เกิดขึ้นในหนึ่งในตัวทําเครื่องหมายบนแผนที่ ระบบจะเรียกใช้การเรียกฟังของผู้ฟังด้วยออบเจ็กต์ Marker
ที่ตรงกันซึ่งส่งผ่านเป็นพารามิเตอร์ หากต้องการเปรียบเทียบออบเจ็กต์ Marker
นี้กับการอ้างอิงของคุณเองกับออบเจ็กต์ Marker
คุณต้องใช้ equals()
ไม่ใช่ ==
คุณสามารถฟังเหตุการณ์ต่อไปนี้ได้
เหตุการณ์คลิกของตัวทําเครื่องหมาย
คุณใช้ OnMarkerClickListener
เพื่อฟัง
เหตุการณ์การคลิกบนเครื่องหมายได้ หากต้องการตั้งค่า Listener นี้บนแผนที่ ให้เรียกใช้ GoogleMap.setOnMarkerClickListener(OnMarkerClickListener)
เมื่อผู้ใช้คลิกที่เครื่องหมายนั้น ระบบจะเรียก onMarkerClick(Marker)
และเครื่องหมายจะถูกส่งผ่านเป็นอาร์กิวเมนต์ วิธีนี้ทําให้บูลีนแสดงว่าคุณได้ใช้เหตุการณ์หรือไม่ (เช่น ต้องการระงับการทํางานเริ่มต้น) หากแสดงผล false
ลักษณะการทํางานเริ่มต้นจะเกิดขึ้นนอกเหนือจากการทํางานที่กําหนดเองของคุณ ลักษณะการทํางานเริ่มต้นของกิจกรรมการคลิกเครื่องหมายคือการแสดงหน้าต่างข้อมูล (ถ้ามี) และย้ายกล้องเพื่อให้เครื่องหมายอยู่ตรงกลางบนแผนที่
ผลกระทบของดัชนีลําดับ z ต่อกิจกรรมการคลิก:
- เมื่อผู้ใช้คลิกกลุ่มของเครื่องหมาย กิจกรรมการคลิกจะถูกเรียกสําหรับเครื่องหมายที่มีดัชนี z สูงสุด
- สูงสุด 1 เหตุการณ์จะทริกเกอร์ต่อคลิก กล่าวคือ ระบบจะไม่คลิกนั้นคลิกไปยังเครื่องหมายหรือการวางซ้อนอื่นๆ ที่มีค่าดัชนีลําดับต่ํากว่า
- การคลิกที่กลุ่มของตัวทําเครื่องหมายจะทําให้จํานวนคลิกที่ตามมาวนรอบคลัสเตอร์ โดยเลือกทีละอันดับ ลําดับของวงจรจะมีความสําคัญเป็นอันดับแรก ของดัชนี z แล้วความใกล้เคียงกับการคลิก
- หากผู้ใช้คลิกที่นอกความใกล้เคียงของคลัสเตอร์ API จะคํานวณคลัสเตอร์ใหม่ และรีเซ็ตสถานะของรอบคลิกเพื่อให้เริ่มต้นจากจุดเริ่มต้น
- กิจกรรมการคลิกจะลากผ่านกลุ่มเครื่องหมายไปยังรูปร่างและการวางซ้อนอื่นๆ ก่อนที่จะรีสตาร์ทรอบ
- เครื่องหมายจะถือว่าอยู่ในกลุ่มดัชนีลําดับ Z แยกต่างหากอย่างมีประสิทธิภาพเมื่อเทียบกับภาพซ้อนทับหรือรูปทรงอื่นๆ (รูปหลายเหลี่ยม รูปหลายเหลี่ยม วงกลม และ/หรือภาพซ้อนทับระดับพื้น) โดยไม่คํานึงถึงดัชนีลําดับ Z ของภาพซ้อนทับอื่นๆ หากตัวทําเครื่องหมาย ตัววางซ้อน หรือรูปทรงหลายตัววางซ้อนบนกัน เหตุการณ์การคลิกจะวนรอบกลุ่มตัวทําเครื่องหมายก่อน จากนั้นจึงทริกเกอร์สําหรับการวางซ้อนหรือรูปร่างที่คลิกได้อื่นๆ ตามค่าดัชนีลําดับ z
เหตุการณ์การลากเครื่องหมาย
คุณใช้ OnMarkerDragListener
เพื่อฟังเหตุการณ์ลากบนเครื่องหมายได้ หากต้องการตั้งค่า Listener นี้บนแผนที่ ให้เรียกใช้ GoogleMap.setOnMarkerDragListener
ในการลากเครื่องหมาย
ผู้ใช้ต้องกดเครื่องหมายนั้นค้างไว้ เมื่อผู้ใช้เอานิ้วออกจากหน้าจอ เครื่องหมายจะอยู่ในตําแหน่งนั้น เมื่อมีการลากเครื่องหมาย
onMarkerDragStart(Marker)
จะถูกเรียกเริ่มต้น ขณะลากเครื่องหมาย
จะมีการเรียก onMarkerDrag(Marker)
อย่างต่อเนื่อง ในตอนท้ายของการลาก
จะมีการเรียก onMarkerDragEnd(Marker)
คุณสามารถรับตําแหน่งของเครื่องหมายนี้ได้ตลอดเวลาโดยเรียก Marker.getPosition()