בנושא הזה נסביר איך להגדיר מפה שנוספה לאפליקציה ל-Android באמצעות ה-SDK של מפות Google ל-Android.
סקירה
אחרי שמוסיפים מפה לאפליקציה, אפשר לקבוע את ההגדרות הראשוניות ואת זמן הריצה של המפה. צריך לקבוע את ההגדרות הראשוניות בהתאם להוספה של מאגר המפה (SupportMapFragment
או MapView
) באופן סטטי או דינמי. אם מאגר המפה נוסף באופן סטטי, אפשר לקבוע את ההגדרות הראשוניות של המפה בקובץ הפריסה.
אם הוא נוסף באופן דינמי, אפשר לקבוע את ההגדרות הראשוניות בקריאה החוזרת (callback) של OnCreate
באמצעות האובייקט GoogleMapOptions
.
לפרטים על הוספת מאגר תגים של מפות, ניתן לעיין במאמר הוספת מפה.
ההגדרות הראשוניות של המפה כוללות את הדברים הבאים:
- מיקום המצלמה, כולל: מיקום, זום, כיוון והטיה. אפשר לקבל פרטים על מיקום המצלמה בקטע מצלמה ותצוגה.
- סוג המפה.
- רכיבי ממשק המשתמש להצגה, כמו לחצני הזום והמצפן.
- התנועות להפעלה.
- האם מצב Lite מופעל.
בזמן הריצה אפשר לקבוע את ההגדרות האלה והגדרות נוספות מסוימות על ידי עדכון האובייקט GoogleMap
בקריאה החוזרת (callback) של onMapReady
. ההגדרות הנוספות נקבעות באמצעות השיטות של המחלקה GoogleMap
, כמו ההגדרות שקובעות את שכבת תעבורת הנתונים והמרווח הפנימי של המפה.
דוגמה
בקוד לדוגמה שבהמשך ובצילום המסך שלמעלה, המפה מוגדרת לפי ההגדרות הבאות.
ההגדרות הראשוניות נקבעות בקובץ הפריסה:
- מפעילים את אמצעי הבקרה לשינוי מרחק התצוגה.
- הפעלת הסיבוב של פקדי התנועות.
- מגדירים את הטיית המפה ל-30.
הגדרות זמן הריצה:
- מציבים את המצלמה במרכז של קיוטו יפן.
- הפעלת סוג המפה ההיברידית.
- הפעל את השכבה 'תנועה'.
הגדרות ראשוניות
<?xml version="1.0" encoding="utf-8"?> <fragment xmlns:android="http://schemas.android.com/apk/res/android" xmlns:map="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:name="com.google.android.gms.maps.SupportMapFragment" android:id="@+id/map" android:layout_width="match_parent" android:layout_height="match_parent" map:uiZoomControls="true" map:uiRotateGestures="true" map:cameraTilt="30" />
הגדרות זמן ריצה
package com.example.mapsetup; import androidx.appcompat.app.AppCompatActivity; import android.os.Bundle; import com.google.android.gms.maps.CameraUpdateFactory; import com.google.android.gms.maps.GoogleMap; import com.google.android.gms.maps.OnMapReadyCallback; import com.google.android.gms.maps.SupportMapFragment; import com.google.android.gms.maps.model.LatLng; import com.google.android.gms.maps.model.MarkerOptions; public class MainActivity extends AppCompatActivity implements OnMapReadyCallback { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager() .findFragmentById(R.id.map); mapFragment.getMapAsync(this); } // Update the map configuration at runtime. @Override public void onMapReady(GoogleMap googleMap) { // Set the map coordinates to Kyoto Japan. LatLng kyoto = new LatLng(35.00116, 135.7681); // Set the map type to Hybrid. googleMap.setMapType(GoogleMap.MAP_TYPE_HYBRID); // Add a marker on the map coordinates. googleMap.addMarker(new MarkerOptions() .position(kyoto) .title("Kyoto")); // Move the camera to the map coordinates and zoom in closer. googleMap.moveCamera(CameraUpdateFactory.newLatLng(kyoto)); googleMap.moveCamera(CameraUpdateFactory.zoomTo(15)); // Display traffic. googleMap.setTrafficEnabled(true); } }
לפני שמתחילים
לפני שמתחילים, אפשר להגדיר פרויקט ולהוסיף מפה בסיסית באמצעות האפשרויות הבאות:
יוצרים אפליקציה באמצעות התבנית של מפות Google ל-Android Studio. התבנית של מפות Google מגדירה את הפרויקט באופן אוטומטי ומוסיפה מפה בסיסית. מקטע משמש כקונטיינר המפה והוא מתווסף באופן סטטי. למידע נוסף עיינו בquickstart.
מגדירים ידנית את הפרויקט בשביל ה-SDK ומוסיפים מפה בסיסית. כך תוכלו להשתמש בכל תבנית של Android ולהוסיף מפה לאפליקציה קיימת.
הגדרת מפה אחרי הוספה שלה באופן סטטי
בקטע הזה מוסבר איך להגדיר את המצב הראשוני של המפה אם הוספתם אותה באופן סטטי לקובץ הפריסה.
ב-SDK של מפות Google ל-Android מוגדר קבוצה של מאפייני XML מותאמים אישית בשביל SupportMapFragment
או MapView
, שאפשר להשתמש בהם כדי להגדיר את המצב הראשוני של המפה ישירות מקובץ הפריסה. המאפיינים הבאים מוגדרים כרגע:
mapType
– סוג המפה להצגה. הערכים החוקיים כוללים:none
,normal
,hybrid
,satellite
ו-terrain
.cameraTargetLat
,cameraTargetLng
,cameraZoom
,cameraBearing
,cameraTilt
– המיקום הראשוני של המצלמה. למידע נוסף, עיינו במדריך בנושא המצלמה והתצוגות.uiZoomControls
,uiCompass
– מציין אם יוצגו אמצעי בקרה לשינוי מרחק התצוגה והמצפן. פרטים נוספים זמינים בכתובתUiSettings
.uiZoomGestures
,uiScrollGestures
,uiRotateGestures
,uiTiltGestures
— ההגדרה קובעת אם תנועות ספציפיות מופעלות. למידע נוסף, ראוUiSettings
.zOrderOnTop
– מציין אם פני השטח של תצוגת המפה מוצגים מעל חלון המפה, לחצני המפה ואובייקט כלשהו בחלון. פרטים נוספים זמינים בכתובת SurfaceView.setZOrderOnTop(boolean).useViewLifecycle
– בתוקף רק עם אובייקטSupportMapFragment
. מציינת אם מחזור החיים של המפה צריך להיות מקושר לתצוגת המקטע או למקטע עצמו. כאן יש פרטים נוספים.liteMode
–true
כדי להפעיל את מצב Lite. אחרת,false
.mapColorScheme
— מציין את ערכת הצבעים של מפת רגילה ומפת פני שטח. הערכים כוללים אתlight
(ברירת המחדל),dark
ו-follow_system
, כלומר משתמשים בהגדרת המערכת הנוכחית על סמך הגדרת המכשיר ל-UI_NIGHT_MODE_MASK
. למידע נוסף, ראו ערכת צבעים במפה.
כדי להשתמש במאפיינים המותאמים אישית האלה בקובץ הפריסה, צריך לכלול את הצהרת מרחב השמות הבאה. אפשר לבחור כל מרחב שמות, הוא לא חייב להיות map
:
xmlns:map="http://schemas.android.com/apk/res-auto"
לאחר מכן אפשר להוסיף את המאפיינים עם קידומת map:
לקובץ הפריסה.
קובץ הפריסה הבא מגדיר אובייקט SupportMapFragment
עם מאפייני מפה מותאמים אישית. אפשר להחיל את אותם מאפיינים גם על אובייקט MapView
.
<fragment xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:map="http://schemas.android.com/apk/res-auto"
android:name="com.google.android.gms.maps.SupportMapFragment"
android:id="@+id/map"
android:layout_width="match_parent"
android:layout_height="match_parent"
map:cameraBearing="112.5"
map:cameraTargetLat="-33.796923"
map:cameraTargetLng="150.922433"
map:cameraTilt="30"
map:cameraZoom="13"
map:mapType="normal"
map:mapColorScheme="dark"
map:uiCompass="false"
map:uiRotateGestures="true"
map:uiScrollGestures="false"
map:uiTiltGestures="true"
map:uiZoomControls="false"
map:uiZoomGestures="true"/>
הגדרת מפה אחרי הוספה שלה באופן דינמי
בקטע הזה מוסבר איך להגדיר את המצב הראשוני של המפה אם הוספתם אותה לאפליקציה באופן דינמי.
אם מוסיפים SupportMapFragment
או MapView
באופן דינמי, אפשר להגדיר את המצב הראשוני של המפה באובייקט GoogleMapOptions
. האפשרויות הזמינות הן אותן האפשרויות שזמינות בקובץ הפריסה.
אפשר ליצור GoogleMapOptions
באופן הבא:
Kotlin
val options = GoogleMapOptions()
Java
GoogleMapOptions options = new GoogleMapOptions();
ואז מגדירים אותו באופן הבא:
Kotlin
options.mapType(GoogleMap.MAP_TYPE_SATELLITE) .compassEnabled(false) .rotateGesturesEnabled(false) .tiltGesturesEnabled(false)
Java
options.mapType(GoogleMap.MAP_TYPE_SATELLITE) .compassEnabled(false) .rotateGesturesEnabled(false) .tiltGesturesEnabled(false);
כדי להחיל את האפשרויות האלה כשיוצרים מפה, מבצעים את אחת מהפעולות הבאות:
- אם משתמשים ב-
SupportMapFragment
, צריך להשתמש ב-method של היצרן הסטטיSupportMapFragment.newInstance(GoogleMapOptions options)
כדי לבנות את המקטע ולהעביר אותו בהגדרות. - אם אתם משתמשים ב-
MapView
, השתמשו ב-constructor שלMapView(Context, GoogleMapOptions)
ובהגדרות שקבעתם.
הגדרת שכבת התנועה
ניתן להציג נתוני תנועה במפה על ידי הפעלת שכבת התנועה. אפשר להפעיל ולהשבית את שכבת תעבורת הנתונים באמצעות קריאה ל-method setTrafficEnabled()
, ולקבוע אם שכבת תעבורת הנתונים פועלת כרגע על ידי קריאה לשיטה isTrafficEnabled()
. בצילום המסך הבא מוצגת מפה שבה שכבת התנועה מופעלת.
הגדרת סוג המפה
כדי להגדיר את סוג המפה, קוראים לשיטה setMapType
.
לדוגמה, כדי להציג מפת לוויין:
Kotlin
// Sets the map type to be "hybrid" map.mapType = GoogleMap.MAP_TYPE_HYBRID
Java
// Sets the map type to be "hybrid" map.setMapType(GoogleMap.MAP_TYPE_HYBRID);
התמונה הבאה משווה בין סוגי המפה הרגילה, ההיברידית ומפת פני השטח:
הגדרת בניינים בתלת ממד
בערים רבות, כשמסתכלים מקרוב, ניתן לראות בניינים בתלת ממד, כפי שניתן לראות בתמונה למטה של ונקובר, קנדה. אפשר להשבית את יצירת התלת-ממד באמצעות קריאה ל-GoogleMap.setBuildingsEnabled(false)
.
קביעת הגדרות של מפת הפנים
כשהמרחק מהתצוגה גבוה, מוצגים במפה תוכניות קומה של אזורים פנימיים כמו נמלי תעופה, מרכזי קניות, חנויות קמעונאיות גדולות ותחנות תחבורה ציבורית. תוכניות הקומה האלה, שנקראות מפות פנים, מוצגות לסוגי המפה ה 'רגילים' וה 'לוויין' (GoogleMap.MAP_TYPE_NORMAL
ו-GoogleMap.MAP_TYPE_SATELLITE
). הן מופעלות באופן אוטומטי כשהמשתמש מגדיל את התצוגה, והן נעלמות כשהמפה מוקטנת.
הודעה על הוצאה משימוש: בגרסה עתידית, מפות
פנים יהיו זמינות רק מסוג המפה normal
. החל מגרסה
הזו, לא תהיה תמיכה במפות פנים במפות satellite
,
terrain
או hybrid
. גם במקומות שבהם אין תמיכה
במקומות סגורים, isIndoorEnabled()
ימשיך להחזיר את הערך
שהוגדר דרך setIndoorEnabled()
, כמו שהוא עושה עכשיו. כברירת מחדל, הערך של setIndoorEnabled
הוא true
.
נתוני הגרסה יודיעו לך
שהתמיכה בפנים באזור לא תהיה זמינה בסוגי המפות האלה.
הנה סיכום של הפונקציונליות של מפות פנים ב-API:
- אפשר להשבית את מפות הפנים באמצעות
GoogleMap.setIndoorEnabled(false)
. מפות הפנים מופעלות כברירת מחדל. מפות הפנים מוצגות במפה אחת בכל פעם. כברירת מחדל, זוהי המפה הראשונה שנוספה לאפליקציה שלכם. כדי להציג מפות פנים במפה אחרת, צריך להשבית אותן במפה הראשונה ואז להפעיל אתsetIndoorEnabled(true)
במפה השנייה. - כדי להשבית את הכלי לבחירת רמת ברירת מחדל (כלי לבחירת רצפה), מפעילים את הפונקציה
GoogleMap.getUiSettings().setIndoorLevelPickerEnabled(false)
. למידע נוסף, ראו אינטראקציה עם המפה. OnIndoorStateChangeListener
— מגדיר מאזינים שמזהים מתי בניין מסוים נמצא בפוקוס או מופעל רמה במבנה. לפרטים נוספים, ראו אינטראקציה עם המפה.getFocusedBuilding
– אחזור הבניין שנמצא במיקוד. כדי למצוא את הרמה הפעילה, צריך לשלוח קריאה אלIndoorBuilding.getActiveLevelIndex()
.- עיצוב מפת הבסיס לא משפיע על מפות פנים.
הגדרת מרווח פנימי במפה
בסרטון הזה מוצגת דוגמה למרווח פנימי במפה.
מפת Google תוכננה למלא את כל האזור שמוגדר על ידי רכיב הקונטיינר שלו, בדרך כלל MapView
או SupportMapFragment
. יש כמה היבטים במראה ובהתנהגות של המפה שמוגדרים לפי מידות הקונטיינר שלה:
- יעד המצלמה ישקף את מרכז האזור המרופד.
- פקדי המפה ממוקמים ביחס לקצוות של המפה.
- מידע משפטי, כמו הצהרות על זכויות יוצרים או הלוגו של Google, מופיע בחלק התחתון של המפה.
אפשר להוסיף מרווח פנימי סביב שולי המפה באמצעות GoogleMap
.setPadding()
. המפה תמשיך למלא את כל הקונטיינר, אבל הטקסט והמיקום, תנועות המפה ותנועות המצלמה יפעלו כאילו היא מוצבת במקום קטן יותר. כתוצאה מכך, יתרחשו השינויים הבאים:
- תנועות המצלמה באמצעות קריאות API או לחיצות על לחצנים (למשל, מצפן, המיקום שלי, לחצני זום) הן ביחס לאזור המרופד.
- ה-method
getCameraPosition
מחזירה את המרכז של האזור המרופד. - באמצעות ה-method
Projection
ו-getVisibleRegion
מוחזרות האזור הריק. - הפקדים של ממשק המשתמש מיסטים מהקצה של הקונטיינר לפי מספר הפיקסלים שצוין.
הריפוד יכול להיות שימושי כשמתכננים ממשקי משתמש שחופפים לחלק מסוים מהמפה. בתמונה הבאה המפה מרופדת לאורך הקצה העליון והקצה הימני. פקדי מפה וטקסט משפטי גלויים יוצגו בקצוות של האזור המרופד בירוק, ואילו המפה תמשיך למלא את כל המאגר ומוצג בכחול. בדוגמה הזו, ניתן לצף תפריט מעל הצד הימני של המפה בלי להסתיר את פקדי המפה.
ערכת הצבעים של המפה
במפות מסוג 'נורמלי' ו'פני שטח', אפשר להגדיר את ערכת הצבעים של המפה באופן דינמי לכהה או בהיר, או להשתמש בהגדרת המערכת הנוכחית. לדוגמה, תוכלו להכהות או להבהיר את ערכת הצבעים של המפה בהתאם לשעה ביום או לשימוש במכשיר פנים או חוץ.
כברירת מחדל, המפה משתמשת במצב בהיר. הערך הנוכחי של הגדרת המערכת מבוסס על הגדרת המכשיר של UI_NIGHT_MODE_MASK
.
Kotlin
mapFragment = SupportMapFragment.newInstance(GoogleMapOptions().mapColorScheme(MapColorScheme.DARK).mapId(mapId2))
Java
mapFragment = SupportMapFragment.newInstance(new GoogleMapOptions().mapColorScheme(MapColorScheme.DARK).mapId(mapId2));
אפשר להחליף את המצב של ערכת הצבעים באמצעות method GoogleMap.setMapColorScheme()
כדי להגדיר את הסגנון הנוכחי למצב כהה או בהיר, או לפעול לפי הגדרות המערכת.
Kotlin
googleMap.setMapColorScheme(MapColorScheme.DARK) googleMap.setMapColorScheme(MapColorScheme.LIGHT) googleMap.setMapColorScheme(MapColorScheme.FOLLOW_SYSTEM)
Java
googleMap.setMapColorScheme(MapColorScheme.DARK); googleMap.setMapColorScheme(MapColorScheme.LIGHT); googleMap.setMapColorScheme(MapColorScheme.FOLLOW_SYSTEM);