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

จัดทุกอย่างให้เป็นระเบียบอยู่เสมอด้วยคอลเล็กชัน บันทึกและจัดหมวดหมู่เนื้อหาตามค่ากำหนดของคุณ
เลือกแพลตฟอร์ม: Android iOS JavaScript

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

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

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

Java

โคตลิน

บทนำ

เครื่องหมายจะระบุสถานที่บนแผนที่ เครื่องหมายเริ่มต้นจะใช้ไอคอนมาตรฐาน ซึ่งโดยทั่วไปจะอยู่ในรูปลักษณ์ของ Google Maps คุณจะเปลี่ยนสี รูปภาพ หรือจุดยึดของไอคอนผ่าน 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
สมอ
จุดบนรูปภาพที่จะวางไว้ที่ตําแหน่ง LatLng ของเครื่องหมาย ค่าเริ่มต้นนี้จะอยู่ตรงกลางด้านล่างของรูปภาพ
อัลฟ่า
ตั้งค่าความทึบของตัวทําเครื่องหมาย ค่าเริ่มต้นคือ 1.0
ตำแหน่ง
สตริงที่แสดงในหน้าต่างข้อมูลเมื่อผู้ใช้แตะเครื่องหมาย
ข้อมูลโค้ด
ข้อความเพิ่มเติมที่แสดงอยู่ด้านล่างชื่อ
Icon
บิตแมปที่แสดงแทนรูปภาพเครื่องหมายเริ่มต้น
ลากได้
ตั้งค่าเป็น true หากต้องการอนุญาตให้ผู้ใช้ย้ายเครื่องหมาย ค่าเริ่มต้นคือ false
แสดง
ตั้งค่าเป็น false เพื่อซ่อนเครื่องหมาย ค่าเริ่มต้นคือ true
การจัดวางแนวราบหรือบิลบอร์ด
โดยค่าเริ่มต้น ตัวทําเครื่องหมายจะใช้การวางแนวของบิลบอร์ด ซึ่งหมายความว่าระบบจะวาดโดยเทียบกับหน้าจอของอุปกรณ์ ไม่ใช่นําไปยังพื้นผิวของแผนที่ การหมุน เอียง หรือซูมแผนที่จะไม่เปลี่ยนการวางแนวของเครื่องหมาย คุณสามารถตั้งค่าการวางแนวของเครื่องหมายให้แบนกับพื้นโลก ตัวทําเครื่องหมายแบบแนวราบจะหมุนเมื่อมีการหมุนแผนที่ และเปลี่ยนมุมมองเมื่อแผนที่เอียง เช่นเดียวกับเครื่องหมายบิลบอร์ด เครื่องหมายเดี่ยวจะคงขนาดไว้เมื่อแผนที่ถูกซูมเข้าหรือออก
พูลโรเทชั่น
การวางแนวของตัวทําเครื่องหมายที่ระบุไว้ในองศาตามเข็มนาฬิกา ตําแหน่งเริ่มต้นจะเปลี่ยนแปลงหากเครื่องหมายคงที่ ตําแหน่งเริ่มต้นของเครื่องหมาย Flat จะอยู่ในแนวเหนือ เมื่อเครื่องหมายไม่ราบเรียบ ตําแหน่งเริ่มต้นจะชี้ขึ้นด้านบนและการหมุนจะเป็นทิศทางที่เครื่องหมายหันหน้าเข้าหากล้องเสมอ

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

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

      

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

คุณสามารถควบคุมความทึบแสงของตัวทําเครื่องหมายได้โดยใช้เมธอด MarkOptions.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)
)

      

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

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

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

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

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