หมุดและกล้อง
วางหมุดและเลื่อนกล้อง
หมุดและกล้อง เป็นบทเรียน 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พร้อมtitlesnippetและ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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ