العلامات والكاميرا
ضع العلامات وحرّك الكاميرا
العلامات والكاميرا درس مجاني في Android Academy على CoddyKit. هذا هو الدرس 3 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Android Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Android Academy 4 دروس في المجموع.
وضع العلامات على الخريطة
الخريطة الفارغة ليست سوى مربعات. تحوّل العلامات الخريطة إلى معلومات — دبوس لمتجر أو مطعم أو وجهة المستخدم. كما تحرّك الكاميرا إطار العرض إلى المكان الذي تحتاج إليه القصة.
في هذا الدرس ستضيف العلامات وتخصّصها وتجمعها في عناقيد، ثم تحرّك الكاميرا بسلاسة بين الأماكن.
إضافة علامة
في maps-compose، تكون العلامات مكوّنات قابلة للتركيب تضعها داخل لامبدا محتوى 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 مع محتوى مكوّن قابل للتركيب من إنشائك.
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(). فهي دالة تعليق، لذا شغّلها من نطاق coroutine. استخدم 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`
}
}اختبار سريع
تريد أن تنزلق الكاميرا بسلاسة إلى موقع جديد خلال ثانية واحدة بدلًا من الانتقال إليه مباشرةً. ما الخيار الصحيح؟
مراجعة
يمكنك الآن جعل الخريطة مفيدة وديناميكية:
- ضع مكوّنات
Markerالقابلة للتركيب داخل محتوىGoogleMap، معtitleوsnippetوiconمخصّص. - اعرض العلامات من قائمة بيانات وتعامل مع
onClick. - حرّك الكاميرا فورًا عبر
position، أو بسلاسة عبرanimate(). - لائم عدة نقاط باستخدام
LatLngBoundsوقلّل الازدحام باستخدامClustering.
التالي: طلب أذونات الموقع بالطريقة الصحيحة حتى يعمل كل ذلك على الأجهزة الحقيقية.
الأسئلة الشائعة
هل درس «العلامات والكاميرا» مجاني؟
نعم — نص درس «العلامات والكاميرا» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Android Academy، انتقل إلى CoddyKit PRO. تتضمن دورة Android Academy 4 دروس في المجموع.
ماذا ستتعلم في «العلامات والكاميرا»؟
ضع العلامات وحرّك الكاميرا تتمرن على Android Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ Android Academy؟
لا تُشترط خبرة سابقة. Android Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 3 من أصل 4.
كم من الوقت يستغرق درس «العلامات والكاميرا»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس Android Academy هذا؟
نعم. كل درس في Android Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- عرض خريطة
- الحصول على موقع المستخدم
- العلامات والكاميرا
- أذونات الموقع بالطريقة الصحيحة