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

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

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

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

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

Kotlin

Java

เกริ่นนำ

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

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

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

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

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

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

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

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
ชื่อ
สตริงที่ปรากฏในหน้าต่างข้อมูลเมื่อผู้ใช้แตะเครื่องหมาย
ตัวอย่างข้อมูล
ข้อความเพิ่มเติมที่แสดงใต้ชื่อ
Icon
บิตแมปที่แสดงแทนรูปภาพเครื่องหมายเริ่มต้น
ลากได้
โปรดตั้งค่าเป็น 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() ควรระบุอัลฟ่าเป็นแบบลอยที่อยู่ระหว่าง 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)
สร้างเครื่องหมายที่กำหนดเองโดยใช้ชื่อรูปภาพบิตแมปในไดเรกทอรีชิ้นงาน
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 ต่อกิจกรรมการคลิกด้านล่าง

จัดการเหตุการณ์ของตัวทำเครื่องหมาย

แผนที่ API ช่วยให้คุณฟังและตอบสนองต่อเหตุการณ์ของเครื่องหมายได้ หากต้องการฟังเหตุการณ์เหล่านี้ คุณต้องตั้งค่า Listener ที่เกี่ยวข้องในออบเจ็กต์ GoogleMap ที่มีตัวทำเครื่องหมายอยู่ เมื่อเกิดเหตุการณ์ที่เครื่องหมายใดเครื่องหมายหนึ่งบนแผนที่ ระบบจะเรียกใช้ Callback ของผู้ฟังด้วยออบเจ็กต์ 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()