เครื่องหมาย

เลือกแพลตฟอร์ม: Android iOS JavaScript

แผนที่ที่มีเครื่องหมายหลายรายการ

เครื่องหมายระบุตำแหน่งบนแผนที่ เครื่องหมายเริ่มต้นใช้ไอคอนมาตรฐานที่พบได้ทั่วไปใน Google Maps คุณสามารถเปลี่ยนสี รูปภาพ หรือจุดยึดของไอคอนผ่าน API ได้ เครื่องหมายเป็นออบเจ็กต์ประเภท Marker และจะเพิ่มลงในแผนที่ด้วยเมธอด GoogleMap.addMarker(markerOptions)

เครื่องหมายออกแบบมาให้โต้ตอบได้ โดยจะรับเหตุการณ์ click โดย ค่าเริ่มต้น และมักใช้ร่วมกับ Listener ของเหตุการณ์เพื่อแสดง หน้าต่างข้อมูล การตั้งค่าพร็อพเพอร์ตี้ draggable ของเครื่องหมายเป็น true จะช่วยให้ผู้ใช้เปลี่ยนตำแหน่งของเครื่องหมายได้ ใช้การกดค้างเพื่อเปิดใช้งานความสามารถในการย้ายเครื่องหมาย

โดยค่าเริ่มต้น เมื่อผู้ใช้แตะเครื่องหมาย แถบเครื่องมือแผนที่จะปรากฏขึ้นที่ด้านขวาล่างของแผนที่ ซึ่งจะช่วยให้ผู้ใช้เข้าถึงแอป Google Maps บนมือถือได้อย่างรวดเร็ว คุณสามารถปิดใช้แถบเครื่องมือได้ ดูข้อมูลเพิ่มเติมได้ที่ คู่มือการควบคุม

เพิ่มเครื่องหมาย

ตัวอย่างต่อไปนี้แสดงวิธีเพิ่มเครื่องหมายลงในแผนที่ เครื่องหมายจะสร้างขึ้นที่พิกัด -33.852,151.211 (ซิดนีย์ ออสเตรเลีย) และแสดงสตริง "Marker in 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))
}

      

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));
}

      

แสดงข้อมูลเพิ่มเติมเกี่ยวกับเครื่องหมาย

ข้อกำหนดทั่วไปคือการแสดงข้อมูลเพิ่มเติมเกี่ยวกับสถานที่เมื่อผู้ใช้แตะเครื่องหมายบนแผนที่ ดูคู่มือหน้าต่างข้อมูล

เชื่อมโยงข้อมูลกับเครื่องหมาย

คุณสามารถจัดเก็บออบเจ็กต์ข้อมูลที่กำหนดเองไว้กับเครื่องหมายได้โดยใช้ Marker.setTag() และดึงข้อมูลออบเจ็กต์โดยใช้ Marker.getTag() ตัวอย่างด้านล่างแสดงวิธีนับจำนวนครั้งที่มีการคลิกตัวทำเครื่องหมายโดยใช้แท็ก

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
    }
}

      

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;
    }
}

      

ตัวอย่างสถานการณ์ที่การจัดเก็บและดึงข้อมูลด้วยเครื่องหมายมีประโยชน์

  • แอปของคุณอาจรองรับเครื่องหมายประเภทต่างๆ และคุณต้องการจัดการเครื่องหมายเหล่านั้นแตกต่างกันเมื่อผู้ใช้คลิก หากต้องการทำเช่นนี้ คุณสามารถจัดเก็บ String ไว้กับเครื่องหมายเพื่อระบุประเภท
  • คุณอาจเชื่อมต่อกับระบบที่มีตัวระบุบันทึกที่ไม่ซ้ำกัน ซึ่งเครื่องหมายจะแสดงบันทึกที่เฉพาะเจาะจงในระบบนั้น
  • ข้อมูลเครื่องหมายอาจระบุลำดับความสำคัญที่จะใช้เมื่อตัดสินใจเกี่ยวกับดัชนีลำดับ Z ของเครื่องหมาย

ทำให้เครื่องหมายลากได้

คุณสามารถเปลี่ยนตำแหน่งเครื่องหมายได้เมื่อเพิ่มลงในแผนที่แล้ว ตราบใดที่พร็อพเพอร์ตี้ draggable ตั้งค่าเป็น true กดเครื่องหมายค้างไว้เพื่อเปิดใช้การลาก เมื่อคุณปล่อยนิ้วออกจากหน้าจอ เครื่องหมายจะยังคงอยู่ในตำแหน่งนั้น

เครื่องหมายจะลากไม่ได้โดยค่าเริ่มต้น คุณต้องตั้งค่าเครื่องหมายให้ลากได้โดยชัดแจ้งด้วย MarkerOptions.draggable(boolean) ก่อนที่จะเพิ่มลงในแผนที่ หรือ Marker.setDraggable(boolean) เมื่อเพิ่มลงในแผนที่แล้ว คุณสามารถฟังเหตุการณ์การลากบนเครื่องหมายได้ตามที่อธิบายไว้ในเหตุการณ์การลากเครื่องหมาย

ข้อมูลโค้ดด้านล่างจะเพิ่มเครื่องหมายที่ลากได้ที่เพิร์ท ออสเตรเลีย

Kotlin

val perthLocation = LatLng(-31.90, 115.86)
val perth = map.addMarker(
    MarkerOptions()
        .position(perthLocation)
        .draggable(true)
)

      

Java

final LatLng perthLocation = new LatLng(-31.90, 115.86);
Marker perth = map.addMarker(
    new MarkerOptions()
        .position(perthLocation)
        .draggable(true));

      

ปรับแต่งเครื่องหมาย

วิดีโอนี้แสดงวิธีใช้เครื่องหมายเพื่อแสดงภาพตำแหน่งบนแผนที่

เครื่องหมายอาจกำหนดรูปภาพที่กำหนดเองเพื่อแสดงแทนไอคอนเริ่มต้น การกำหนดไอคอนเกี่ยวข้องกับการตั้งค่าพร็อพเพอร์ตี้จำนวนหนึ่งซึ่งส่งผลต่อลักษณะการทำงานของเครื่องหมาย

เครื่องหมายรองรับการปรับแต่งผ่านพร็อพเพอร์ตี้ต่อไปนี้

ตำแหน่ง (ต้องระบุ)
ค่า LatLng สำหรับตำแหน่งของเครื่องหมายบนแผนที่ ซึ่งเป็นพร็อพเพอร์ตี้เดียวที่ต้องระบุสำหรับออบเจ็กต์ Marker
จุดยึด
จุดบนรูปภาพที่จะวางไว้ที่ตำแหน่ง LatLng ของ เครื่องหมาย ค่าเริ่มต้นคือตรงกลางด้านล่างของรูปภาพ
อัลฟ่า
ตั้งค่าความทึบแสงของเครื่องหมาย ค่าเริ่มต้นคือ 1.0
ชื่อ
สตริงที่จะแสดงในหน้าต่างข้อมูลเมื่อผู้ใช้แตะเครื่องหมาย
ตัวอย่างข้อมูล
ข้อความเพิ่มเติมที่จะแสดงใต้ชื่อ
ไอคอน
บิตแมปที่จะแสดงแทนรูปภาพเครื่องหมายเริ่มต้น
ลากได้
ตั้งค่าเป็น true หากต้องการอนุญาตให้ผู้ใช้ย้าย ตัวทำเครื่องหมาย ค่าเริ่มต้นคือ false
แสดง
ตั้งค่าเป็น false เพื่อทำให้ตัวทำเครื่องหมายไม่ปรากฏ ค่าเริ่มต้นคือ true.
การวางแนวแบบแบนหรือแบบบิลบอร์ด
โดยค่าเริ่มต้น เครื่องหมายจะใช้การวางแนวแบบป้ายโฆษณา ซึ่งหมายความว่าจะวาด โดยวางแนวกับหน้าจอของอุปกรณ์แทนที่จะวางแนวกับพื้นผิวของแผนที่ การหมุน การเอียง หรือการซูมแผนที่จะไม่เปลี่ยนการวางแนวของ เครื่องหมาย คุณสามารถตั้งค่าการวางแนวของเครื่องหมายให้แบนราบกับโลกได้ เครื่องหมายแบบแบนจะหมุนเมื่อแผนที่หมุน และเปลี่ยนมุมมองเมื่อแผนที่เอียง เครื่องหมายแบบแบนจะคงขนาดไว้เมื่อซูมเข้าหรือซูมออกแผนที่ เช่นเดียวกับเครื่องหมายแบบป้ายโฆษณา
การหมุน
การวางแนวของเครื่องหมายที่ระบุเป็นองศาตามเข็มนาฬิกา ตำแหน่งเริ่มต้น จะเปลี่ยนไปหากเครื่องหมายแบน ตำแหน่งเริ่มต้นสำหรับเครื่องหมายแบบแบน คือการจัดแนวไปทางทิศเหนือ เมื่อตัวทำเครื่องหมายไม่แบน ตำแหน่งเริ่มต้น จะชี้ขึ้น และการหมุนจะทำให้ตัวทำเครื่องหมายหันหน้าเข้าหากล้องเสมอ

ข้อมูลโค้ดด้านล่างจะสร้างเครื่องหมายแบบง่ายด้วยไอคอนเริ่มต้น

Kotlin

val melbourneLocation = LatLng(-37.813, 144.962)
val melbourne = map.addMarker(
    MarkerOptions()
        .position(melbourneLocation)
)

      

Java

final LatLng melbourneLocation = new LatLng(-37.813, 144.962);
Marker melbourne = map.addMarker(
    new MarkerOptions()
        .position(melbourneLocation));

      

ปรับแต่งสีเครื่องหมาย

คุณสามารถปรับแต่งสีของรูปภาพเครื่องหมายเริ่มต้นได้โดยส่งออบเจ็กต์ BitmapDescriptor ไปยังเมธอด icon() คุณสามารถใช้ชุดสีที่ กำหนดไว้ล่วงหน้าในBitmapDescriptorFactory ออบเจ็กต์ หรือตั้งค่าสีเครื่องหมายแบบกำหนดเองด้วย BitmapDescriptorFactory.defaultMarker(float hue)เมธอด เฉดสีเป็นค่าระหว่าง 0 ถึง 360 ซึ่งแสดงจุดบนวงล้อสี

Kotlin

val melbourneLocation = LatLng(-37.813, 144.962)
val melbourne = map.addMarker(
    MarkerOptions()
        .position(melbourneLocation)
        .icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_AZURE))
)

      

Java

final LatLng melbourneLocation = new LatLng(-37.813, 144.962);
Marker melbourne = map.addMarker(
    new MarkerOptions()
        .position(melbourneLocation)
        .icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_AZURE)));

      

ปรับแต่งความทึบแสงของเครื่องหมาย

คุณสามารถควบคุมความทึบแสงของเครื่องหมายได้ด้วยเมธอด MarkerOptions.alpha() โดยควรระบุอัลฟ่าเป็นค่า Float ระหว่าง 0.0 ถึง 1.0 ซึ่ง 0 หมายถึงโปร่งใสทั้งหมด และ 1 หมายถึงทึบแสงทั้งหมด

Kotlin

val melbourneLocation = LatLng(-37.813, 144.962)
val melbourne = map.addMarker(
    MarkerOptions()
        .position(melbourneLocation)
        .alpha(0.7f)
)

      

Java

final LatLng melbourneLocation = new LatLng(-37.813, 144.962);
Marker melbourne = map.addMarker(new MarkerOptions()
    .position(melbourneLocation)
    .alpha(0.7f));

      

ปรับแต่งรูปภาพเครื่องหมาย

คุณสามารถแทนที่รูปภาพเครื่องหมายเริ่มต้นด้วยรูปภาพเครื่องหมายแบบกำหนดเอง ซึ่งมักเรียกว่าไอคอน ไอคอนที่กำหนดเองจะตั้งค่าเป็น BitmapDescriptor เสมอ และ กำหนดโดยใช้เมธอดใดเมธอดหนึ่งใน BitmapDescriptorFactory คลาส

fromAsset(String assetName)
สร้างเครื่องหมายแบบกำหนดเองโดยใช้ชื่อรูปภาพบิตแมปในไดเรกทอรี Asset
fromBitmap(Bitmap image)
สร้างเครื่องหมายแบบกำหนดเองจากรูปภาพบิตแมป
fromFile(String fileName)
สร้างไอคอนที่กำหนดเองโดยใช้ชื่อไฟล์รูปภาพบิตแมปที่อยู่ในที่จัดเก็บข้อมูลภายใน
fromPath(String absolutePath)
สร้างเครื่องหมายแบบกำหนดเองจากเส้นทางไฟล์แบบสัมบูรณ์ของรูปภาพบิตแมป
fromResource(int resourceId)
สร้างเครื่องหมายแบบกำหนดเองโดยใช้รหัสทรัพยากรของรูปภาพบิตแมป

ข้อมูลโค้ดด้านล่างจะสร้างเครื่องหมายที่มีไอคอนที่กำหนดเอง

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))
)

      

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)));

      

ทำให้ตัวทำเครื่องหมายแบน

โดยปกติแล้ว ไอคอนตัวทำเครื่องหมายจะวาดโดยอิงตามสกรีน การหมุน การเอียง หรือการซูมแผนที่จะไม่เปลี่ยนการวางแนวของตัวทำเครื่องหมาย คุณสามารถตั้งค่าการวางแนวของเครื่องหมายให้แบนราบกับโลกได้ เครื่องหมายที่วางแนวในลักษณะนี้จะหมุนเมื่อแผนที่หมุน และเปลี่ยนมุมมองเมื่อแผนที่เอียง เครื่องหมายแบบแบนจะคงขนาดไว้เมื่อซูมเข้าหรือซูมออกแผนที่

หากต้องการเปลี่ยนการวางแนวของเครื่องหมาย ให้ตั้งค่าพร็อพเพอร์ตี้ flat ของเครื่องหมายเป็น true

Kotlin

val perthLocation = LatLng(-31.90, 115.86)
val perth = map.addMarker(
    MarkerOptions()
        .position(perthLocation)
        .flat(true)
)

      

Java

final LatLng perthLocation = new LatLng(-31.90, 115.86);
Marker perth = map.addMarker(
    new MarkerOptions()
        .position(perthLocation)
        .flat(true));

      

หมุนเครื่องหมาย

คุณสามารถหมุนเครื่องหมายรอบจุดยึดได้ด้วย Marker.setRotation() การหมุนจะวัดเป็นองศาตามเข็มนาฬิกาจากตำแหน่งเริ่มต้น เมื่อเครื่องหมายแบนราบอยู่บนแผนที่ ตำแหน่งเริ่มต้นคือทิศเหนือ เมื่อตัวทำเครื่องหมายไม่แบน ตำแหน่งเริ่มต้นจะชี้ขึ้น และการหมุนจะทำให้ตัวทำเครื่องหมายหันหน้าเข้าหากล้องเสมอ

ตัวอย่างด้านล่างจะหมุนเครื่องหมาย 90° การตั้งค่าจุดยึดเป็น 0.5,0.5 จะทำให้เครื่องหมายหมุนรอบจุดกึ่งกลางแทนที่จะหมุนรอบฐาน

Kotlin

val perthLocation = LatLng(-31.90, 115.86)
val perth = map.addMarker(
    MarkerOptions()
        .position(perthLocation)
        .anchor(0.5f, 0.5f)
        .rotation(90.0f)
)

      

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));

      

ดัชนีลำดับ Z ของเครื่องหมาย

ดัชนีลำดับ Z จะระบุลำดับการซ้อนของเครื่องหมายนี้เมื่อเทียบกับเครื่องหมายอื่นๆ บนแผนที่ ตัวทำเครื่องหมายที่มีดัชนีลำดับ Z สูงจะวาดทับตัวทำเครื่องหมายที่มีดัชนีลำดับ Z ต่ำกว่า ค่าดัชนีลำดับ Z เริ่มต้นคือ 0

ตั้งค่าดัชนีลำดับ Z ในออบเจ็กต์ตัวเลือกของเครื่องหมายโดยเรียกใช้ MarkerOptions.zIndex() ดังที่แสดงในข้อมูลโค้ดต่อไปนี้

Kotlin

map.addMarker(
    MarkerOptions()
        .position(LatLng(10.0, 10.0))
        .title("Marker z1")
        .zIndex(1.0f)
)

      

Java

map.addMarker(new MarkerOptions()
    .position(new LatLng(10, 10))
    .title("Marker z1")
    .zIndex(1.0f));

      

คุณสามารถเข้าถึงดัชนีลำดับ Z ของเครื่องหมายได้โดยเรียกใช้ Marker.getZIndex() และเปลี่ยนได้โดยเรียกใช้ Marker.setZIndex()

เครื่องหมายจะวาดเหนือเลเยอร์ไทล์และโอเวอร์เลย์อื่นๆ ที่ไม่ใช่เครื่องหมาย (โอเวอร์เลย์พื้น โพลีไลน์ รูปหลายเหลี่ยม และรูปร่างอื่นๆ) เสมอ ไม่ว่าดัชนีลำดับ Z ของโอเวอร์เลย์อื่นๆ จะเป็นเท่าใดก็ตาม ระบบจะถือว่าเครื่องหมายอยู่ในกลุ่มดัชนีลำดับ Z แยกต่างหากเมื่อเทียบกับโอเวอร์เลย์อื่นๆ

อ่านเกี่ยวกับผลของดัชนีลำดับ Z ต่อเหตุการณ์การคลิกด้านล่าง

จัดการเหตุการณ์ที่เกิดขึ้นกับเครื่องหมาย

Maps API ช่วยให้คุณฟังและตอบสนองต่อเหตุการณ์ที่เกิดขึ้นกับเครื่องหมายได้ หากต้องการฟังเหตุการณ์เหล่านี้ คุณต้องตั้งค่า Listener ที่เกี่ยวข้องในออบเจ็กต์ GoogleMap ที่เครื่องหมายสังกัดอยู่ เมื่อเหตุการณ์เกิดขึ้นกับเครื่องหมายใดเครื่องหมายหนึ่งบนแผนที่ ระบบจะเรียกใช้การเรียกกลับของ Listener โดยส่งออบเจ็กต์ Marker ที่เกี่ยวข้องผ่านเป็นพารามิเตอร์ หากต้องการเปรียบเทียบออบเจ็กต์ Marker นี้กับการอ้างอิงออบเจ็กต์ Marker ของคุณเอง คุณต้องใช้ equals() ไม่ใช่ ==

คุณสามารถฟังเหตุการณ์ต่อไปนี้

เหตุการณ์การคลิกเครื่องหมาย

คุณสามารถใช้ OnMarkerClickListener เพื่อฟัง Listener สำหรับกิจกรรมการคลิกบนตัวทำเครื่องหมาย หากต้องการตั้งค่า Listener นี้บนแผนที่ ให้เรียกใช้ GoogleMap.setOnMarkerClickListener(OnMarkerClickListener) เมื่อผู้ใช้คลิกเครื่องหมาย ระบบจะเรียกใช้ onMarkerClick(Marker) และส่งเครื่องหมายผ่านเป็นอาร์กิวเมนต์ เมธอดนี้จะแสดงค่าบูลีนที่ระบุว่าคุณได้ใช้เหตุการณ์แล้วหรือไม่ (เช่น คุณต้องการระงับลักษณะการทำงานเริ่มต้น) หากแสดงผล false ลักษณะการทำงานเริ่มต้นจะเกิดขึ้นนอกเหนือจากลักษณะการทำงานที่กำหนดเอง ลักษณะการทำงานเริ่มต้นสำหรับเหตุการณ์การคลิกเครื่องหมายคือการแสดงหน้าต่างข้อมูล (หากมี) และย้ายกล้องเพื่อให้เครื่องหมายอยู่ตรงกลางแผนที่

ผลของดัชนีลำดับ Z ต่อเหตุการณ์การคลิก

  • เมื่อผู้ใช้คลิกคลัสเตอร์เครื่องหมาย ระบบจะทริกเกอร์กิจกรรมการคลิกสำหรับเครื่องหมายที่มีดัชนีลำดับ Z สูงที่สุด
  • ระบบจะทริกเกอร์เหตุการณ์อย่างน้อย 1 รายการต่อการคลิก กล่าวคือ ระบบจะไม่ส่งการคลิกไปยังเครื่องหมายหรือโอเวอร์เลย์อื่นๆ ที่มีค่าดัชนีลำดับ Z ต่ำกว่า
  • การคลิกคลัสเตอร์เครื่องหมายจะทำให้การคลิกครั้งต่อๆ ไปหมุนเวียนไปตามคลัสเตอร์ โดยเลือกแต่ละรายการตามลำดับ ลำดับการหมุนเวียนจะให้ความสำคัญกับดัชนีลำดับ Z ก่อน แล้วจึงพิจารณาความใกล้เคียงกับจุดคลิก
  • หากผู้ใช้คลิกนอกบริเวณใกล้เคียงของคลัสเตอร์ API จะคำนวณคลัสเตอร์ใหม่และรีเซ็ตสถานะการหมุนเวียนของการคลิกเพื่อให้เริ่มจากจุดเริ่มต้น
  • ระบบจะถือว่าเครื่องหมายอยู่ในกลุ่มดัชนีลำดับ Z แยกต่างหากเมื่อเทียบกับโอเวอร์เลย์หรือรูปร่างอื่นๆ (โพลีไลน์ รูปหลายเหลี่ยม วงกลม และ/หรือโอเวอร์เลย์พื้น) ไม่ว่าดัชนีลำดับ Z ของโอเวอร์เลย์อื่นๆ จะเป็นเท่าใดก็ตาม หากเครื่องหมาย โอเวอร์เลย์ หรือรูปร่างหลายรายการซ้อนทับกัน ระบบจะหมุนเวียนกิจกรรมการคลิกผ่านคลัสเตอร์เครื่องหมายก่อน

เหตุการณ์การลากเครื่องหมาย

คุณสามารถใช้ OnMarkerDragListener เพื่อฟัง Listener สำหรับเหตุการณ์การลากบนตัวทำเครื่องหมาย หากต้องการตั้งค่า Listener นี้บนแผนที่ ให้เรียกใช้ GoogleMap.setOnMarkerDragListener หากต้องการลากเครื่องหมาย ผู้ใช้ต้องกดเครื่องหมายค้างไว้ เมื่อผู้ใช้ปล่อยนิ้วออกจากหน้าจอ เครื่องหมายจะยังคงอยู่ในตำแหน่งนั้น เมื่อมีการลากเครื่องหมาย ระบบจะเรียกใช้ onMarkerDragStart(Marker) ในตอนแรก ขณะที่ลากเครื่องหมาย ระบบจะเรียกใช้ onMarkerDrag(Marker) อย่างต่อเนื่อง เมื่อสิ้นสุดการลาก ระบบจะเรียกใช้ onMarkerDragEnd(Marker) คุณสามารถรับตำแหน่งของเครื่องหมายได้ทุกเมื่อโดยเรียกใช้ Marker.getPosition()