0Pricing
Android Academy · บทเรียน

หมุดและกล้อง

วางหมุดและเลื่อนกล้อง

หมุดและกล้อง เป็นบทเรียน Android Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 3 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Android Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Android Academy มีบทเรียนทั้งหมด 4 บทเรียน

การปักหมุดบนแผนที่

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

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

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

ใน maps-compose เครื่องหมายคือ composable ที่วางไว้ภายใน แลมบ์ดาเนื้อหาของ GoogleMap แต่ละ Marker รับ MarkerState ซึ่งเก็บตำแหน่งของเครื่องหมายนั้น

import com.google.maps.android.compose.Marker
import com.google.maps.android.compose.rememberMarkerState

@Composable
fun MapWithMarker() {
    val position = LatLng(37.7749, -122.4194)
    GoogleMap(modifier = Modifier.fillMaxSize()) {
        Marker(
            state = rememberMarkerState(position = position),
            title = "San Francisco",
            snippet = "Welcome to SF"
        )
    }
}

ชื่อเรื่อง ข้อความสั้น และหน้าต่างข้อมูล

title และ snippet จะแสดงใน หน้าต่างข้อมูล เริ่มต้นเมื่อผู้ใช้แตะเครื่องหมาย การแตะจะแสดงชื่อเรื่องเป็นตัวหนาและแสดงข้อความสั้นไว้ด้านล่าง

หากต้องการควบคุมทั้งหมด คุณสามารถส่ง MarkerInfoWindow พร้อมเนื้อหา composable ของคุณเองได้

Marker(
    state = rememberMarkerState(position = LatLng(48.8584, 2.2945)),
    title = "Eiffel Tower",
    snippet = "Paris, France",
    // The info window pops up on tap by default
)

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

ส่ง BitmapDescriptor ผ่านพารามิเตอร์ icon เพื่อเปลี่ยนรูปลักษณ์ของเครื่องหมาย defaultMarker(hue) จะเปลี่ยนสีหมุดมาตรฐาน และคุณยังสามารถสร้างไอคอนจาก drawable ได้ด้วย

import com.google.android.gms.maps.model.BitmapDescriptorFactory

Marker(
    state = rememberMarkerState(position = LatLng(35.6895, 139.6917)),
    title = "Tokyo",
    icon = BitmapDescriptorFactory.defaultMarker(
        BitmapDescriptorFactory.HUE_AZURE
    )
)

เครื่องหมายจำนวนมากจากข้อมูล

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

data class Place(val name: String, val latLng: LatLng)

@Composable
fun PlacesMap(places: List<Place>) {
    GoogleMap(modifier = Modifier.fillMaxSize()) {
        places.forEach { place ->
            Marker(
                state = rememberMarkerState(position = place.latLng),
                title = place.name
            )
        }
    }
}

การจัดการการแตะเครื่องหมาย

แต่ละ Marker รับแลมบ์ดา onClick ให้ส่งคืน true เพื่อจัดการเหตุการณ์เองและระงับหน้าต่างข้อมูลเริ่มต้น หรือส่งคืน false เพื่อให้ทำงานตามพฤติกรรมเริ่มต้น

Marker(
    state = rememberMarkerState(position = LatLng(40.7128, -74.0060)),
    title = "New York",
    onClick = {
        // handle the tap, e.g. open a detail screen
        true // consume the event
    }
)

การเลื่อนกล้องทันที

หากต้องการย้ายพื้นที่มุมมองโดยไม่ใช้ภาพเคลื่อนไหว ให้กำหนดตำแหน่งกล้องโดยตรงบน CameraPositionState การเปลี่ยนนี้เป็นการตัดฉับ แผนที่จะย้ายไปยังตำแหน่งใหม่ทันที

val cameraPositionState = rememberCameraPositionState()

// Instant move
cameraPositionState.position = CameraPosition.fromLatLngZoom(
    LatLng(51.5074, -0.1278), // London
    14f
)

การทำให้กล้องเคลื่อนไหว

เพื่อให้ใช้งานได้อย่างลื่นไหล ให้ ทำให้ กล้องเคลื่อนไหวด้วย animate() เนื่องจากเป็นการเรียกแบบพักการทำงาน จึงต้องเปิดใช้งานจากขอบเขตโครูทีน ใช้ CameraUpdate เพื่ออธิบายเป้าหมาย

import com.google.android.gms.maps.CameraUpdateFactory

val scope = rememberCoroutineScope()
Button(onClick = {
    scope.launch {
        cameraPositionState.animate(
            CameraUpdateFactory.newLatLngZoom(
                LatLng(48.8566, 2.3522), 13f
            ),
            durationMs = 1000
        )
    }
}) { Text("Fly to Paris") }

การจัดเครื่องหมายหลายจุดให้อยู่ในมุมมอง

หากต้องการแสดงเครื่องหมายหลายจุดพร้อมกัน ให้สร้าง LatLngBounds ที่ครอบคลุมทุกจุด แล้วทำให้กล้องเคลื่อนไปยังขอบเขตนั้นด้วย newLatLngBounds พร้อมระบุระยะขอบเป็นพิกเซล

import com.google.android.gms.maps.model.LatLngBounds

val bounds = LatLngBounds.Builder().apply {
    places.forEach { include(it.latLng) }
}.build()

scope.launch {
    cameraPositionState.animate(
        CameraUpdateFactory.newLatLngBounds(bounds, 100) // 100px padding
    )
}

การจัดกลุ่มเครื่องหมายจำนวนมาก

เครื่องหมายหลายร้อยจุดอาจทำให้แผนที่ดูรก ไลบรารี maps-compose-utils มี Clustering ซึ่งจัดกลุ่มเครื่องหมายใกล้กันเป็นฟองเดียว และจะแยกกลุ่มเมื่อคุณซูมเข้า

import com.google.maps.android.compose.clustering.Clustering

@Composable
fun ClusteredMap(items: List<MyClusterItem>) {
    GoogleMap(modifier = Modifier.fillMaxSize()) {
        Clustering(items = items)
    }
}

การอ่านสถานะกล้อง

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

LaunchedEffect(cameraPositionState.isMoving) {
    if (!cameraPositionState.isMoving) {
        val center = cameraPositionState.position.target
        // fetch data near `center`
    }
}

ตรวจสอบความเข้าใจ

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

สรุปทบทวน

ตอนนี้คุณสามารถทำให้แผนที่มีข้อมูลและโต้ตอบได้แล้ว:

  • วาง composable Marker ไว้ภายในเนื้อหาของ GoogleMap พร้อม title snippet และ icon ที่กำหนดเอง
  • แสดงเครื่องหมายจากรายการข้อมูลและจัดการ onClick
  • เลื่อนกล้องทันทีผ่าน position หรือเลื่อนอย่างราบรื่นผ่าน animate()
  • จัดจุดหลายจุดให้อยู่ในมุมมองด้วย LatLngBounds และลดความรกด้วย Clustering

ถัดไป: การขอสิทธิ์เข้าถึงตำแหน่งอย่างถูกวิธี เพื่อให้ทั้งหมดนี้ทำงานบนอุปกรณ์จริง

คำถามที่พบบ่อย

บทเรียน “หมุดและกล้อง” ฟรีหรือไม่

ใช่ — ข้อความเต็มของ “หมุดและกล้อง” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Android Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Android Academy มีบทเรียนทั้งหมด 4 บทเรียน

คุณจะเรียนรู้อะไรในบทเรียน “หมุดและกล้อง”

วางหมุดและเลื่อนกล้อง คุณปฏิบัติ Android Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน

คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Android Academy หรือไม่

ไม่จำเป็นต้องมีประสบการณ์มาก่อน Android Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 3 จากทั้งหมด 4 บทเรียน

บทเรียน “หมุดและกล้อง” ใช้เวลานานแค่ไหน

บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย

ฉันเขียนและรันโค้ดในบทเรียน Android Academy นี้ได้ไหม

ได้ บทเรียน Android Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. การแสดงแผนที่
  2. การรับตำแหน่งของผู้ใช้
  3. หมุดและกล้อง
  4. การขอสิทธิ์ตำแหน่งอย่างถูกต้อง
← กลับไปที่ Android Academy