ตัวทำเครื่องหมาย

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

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

ตัวอย่างโค้ด

ที่เก็บ ApiDemos ใน GitHub มีตัวอย่างที่แสดงให้เห็นฟีเจอร์เครื่องหมายต่างๆ ดังนี้

Java

โกตลิน

ข้อมูลเบื้องต้น

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

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

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

เริ่มต้นใช้งานเครื่องหมาย

Maps Live ตอนนี้ครอบคลุมพื้นฐานการเพิ่มเครื่องหมายลงในแผนที่โดยใช้ Maps SDK สำหรับ Android

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

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

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

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

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