ניתן להטות ולסובב את המפות ב-SDK של מפות ל-Android בקלות שמאפשרות למשתמשים להתאים את המפה בכיוון הגיוני עבורם. בכל רמת זום ניתן להזיז את המפה או לשנות אותה עם זמן אחזור קצר מאוד, הודות לטביעת הרגל הקטנה יותר של קטעי מפה מבוססי וקטורים.
דוגמאות קוד
מאגר ApiDemos ב-GitHub כולל דוגמה מדגים את תכונות המצלמה:
- CameraDemoActivity – Kotlin: שינוי מיקום המצלמה
- CameraDemoActivity – Java: שינוי מיקום המצלמה
מבוא
בדומה למפות Google באינטרנט, ה-SDK של מפות Google ל-Android מייצג את פני השטח של העולם (כדור) על מסך המכשיר שלך (מישור שטוח) באמצעות הפונקציה הקרנת Marcator. בכיוון מזרח ומערב, המפה חוזרת על עצמה ללא הגבלה, כי העולם עוטף את עצמו ללא הפרעות. ב הכיוון הצפוני והדרומי של המפה מוגבל ל-85 מעלות צפונה בערך. ו-85 מעלות דרומה.
הערה: להיטל Mercator יש רוחב סופי. לאורך אבל גובה אינסופי של גובה. אנחנו "חותכים" מפה בסיסית באמצעות הקרנה של Mercator בערך של 85 מעלות (+/- 85 מעלות) עד להפוך את צורת המפה שמתקבלת לריבוע, מה שמאפשר לוגיקה קלה יותר לאריח בחירה.
ה-SDK של מפות Google ל-Android מאפשר לשנות את נקודת המבט של המשתמש על ידי שינוי המצלמה של המפה.
שינויים במצלמה לא יבצעו שינויים בסמנים, בשכבות-על או בפריטים אחרים של הגרפיקה שהוספת, למרות שאולי תרצה לשנות את ההוספות כדי שיתאימו טוב יותר עם התצוגה החדשה.
מאחר שניתן להקשיב לתנועות של משתמשים במפה, אפשר לשנות את המפה ב
תגובה לבקשות משתמשים. לדוגמה, שיטת הקריאה החוזרת
OnMapClickListener.onMapClick()
מגיב על
בהקשה אחת על המפה. כי השיטה מקבלת את קווי האורך והרוחב
של מיקום ההקשה, אפשר להגיב על ידי הזזה או שינוי מרחק התצוגה לנקודה הזו.
יש שיטות דומות לתגובה להקשות על בועה של סמן, או
לתגובה לתנועת גרירה על סמן.
אפשר גם להאזין לתנועות המצלמה, כדי שהאפליקציה תקבל התראה כשהמצלמה מתחילה לזוז, זזה כרגע או מפסיקה עובר. פרטים נוספים זמינים במדריך לאירועי שינוי מצלמה.
מיקום המצלמה
המודל של תצוגת המפה הוא מצלמה שמביטה למטה במישור שטוח. המיקום של המצלמה (וכתוצאה מכך עיבוד המפה) מוגדר על ידי המאפיינים הבאים: target (הגדרות של קו רוחב/קו אורך), נושא, הטיה, ולשנות את מרחק התצוגה.
טירגוט (מיקום)
יעד המצלמה הוא המיקום של מרכז המפה, מוגדר בתור קווי אורך ורוחב.
קו הרוחב יכול להיות בין -85 לבין 85 מעלות, כולל. ערכים מעל הפונקציה תותאם לערך הקרוב ביותר בטווח הזה או מתחת לטווח הזה. לדוגמה, ציון קו רוחב של 100 תגדיר את הערך כ-85. קו אורך בין -180 ל-180 מעלות, כולל. ערכים מעל או מתחת לערך הזה יהיה מוקף בטווח (180-, 180). עבור לדוגמה, הערכים 480, 840 ו-1200 יעטפו ב-120 מעלות.כיוון (כיוון)
מיב המצלמה מציין את כיוון המצפן, נמדד במעלות מצפון אמיתי, תואם לקצה העליון של המפה. אם משרטטים קו אנכי ממרכז המפה עד לקצה העליון של המפה, הכיוון תואם לכותרת המצלמה (נמדד במעלות) באופן יחסי לצפון האמיתי.
אם הערך של 0 הוא 0, החלק העליון של המפה מפנה לכיוון הצפון האמיתי. ערך כיוון 90 מציין את החלק העליון של נקודות המפה עקב מזרח (90 מעלות במצפן). ערך 180 פירושו החלק העליון של הנקודות במפה לתשלום דרומה.
ה-API של מפות Google מאפשר לכם לשנות את כיוון הניווט של המפה. למשל, מישהו שנוהג במכונית בדרך כלל מפנה מפת כביש כדי ליישר אותה עם כיוון הנסיעה שלהם, בעוד שמטיילים משתמשים במפה בדרך כלל מכוונים את המפה כך שקו אנכי פונה צפונה.
הטיה (זווית צפייה)
ההטיה מגדירה את מיקום המצלמה על קשת ישירות מעל במרכז, נמדד במעלות נאדיר (הכיוון פונה ישירות מתחת למצלמה). הערך 0 תואם למכוונים במצלמה ישר למטה. ערכים שגדולים מ-0 מתאימים למצלמה שפונה לכיוון האופק באמצעות מספר המעלות שצוין. כשמשנים את זווית הצפייה, המפה מופיעה פרספקטיבה עם ישויות רחוקות מופיעות קטן יותר, ותכונות קרובות מופיעות גדולות יותר. הבאים ואיורים ממחישים זאת.
בתמונות שלמטה, זווית הצפייה היא 0 מעלות. בתמונה הראשונה מוצג תכמה זה; מיקום 1 הוא מיקום המצלמה ומיקום 2 הוא המיקום הנוכחי במפה. המפה שמתקבלת מוצגת מתחתיה.
בתמונות שלמטה, זווית הצפייה היא 45 מעלות. שימו לב שהמצלמה נע באמצע קשת בין קשת ישרה (0 מעלות) לבין הקרקע (90 מעלות), למיקום 3. המצלמה עדיין מופנית לנקודת המרכז של המפה, אבל האזור הקו מיוצג על ידי הקו במיקום 4 יוצג עכשיו.
המפה בצילום המסך הזה עדיין ממורכזת באותה נקודה המפה המקורית, אך תכונות נוספות הופיעו בחלק העליון של המפה. לפי המיקום שלך להגדיל את הזווית מעבר ל-45 מעלות, מיקומים בין המצלמה והמפה נראה גדול יותר באופן יחסי, בעוד שפריטים שנמצאים מעבר למיקום המפה ייראה קטן יותר בצורה פרופורציונלית, באופן שיוצר אפקט תלת ממדי.
מרחק מתצוגה
רמת הזום של המצלמה קובעת את קנה המידה של המפה. בזום גדול יותר רמות פירוט נוספות על המסך, וברמות זום קטנות יותר חלק גדול יותר מהעולם. ברמת זום 0, קנה המידה של כך שהרוחב של העולם כולו הוא כ-256dp (פיקסלים שלא תלויים בדחיסות).
הגדלת רמת הזום ב-1 מכפילה את רוחב העולם במסך. לכן ברמת הזום N, רוחב העולם הוא בערך 256 * 2N dp. לדוגמה, ברמת זום 2, העולם כולו הוא פחות או יותר רוחב של 1024dp.
רמת הזום לא חייבת להיות מספר שלם. הטווח של מרחק התצוגה הרמות שמותרות במפה תלויות במספר גורמים, כולל יעד, סוג המפה וגודל המסך. כל מספר שנמצא מחוץ לטווח יומר הערך החוקי הקרוב ביותר, שיכול להיות רמת הזום המינימלית רמת זום מקסימלית. ברשימה הבאה מוצגת רמת הפירוט המשוערת תוכלו לראות את הנתונים הבאים בכל אחת מרמות הזום:
- 1: עולם
- 5: פני השטח/יבשת
- 10: עיר
- 15: רחובות
- 20: מבנים
הזזת המצלמה
ה-API של מפות Google מאפשר לכם לשנות את החלק בעולם הגלוי מפה אפשר לעשות את זה על ידי שינוי מיקום המצלמה (בניגוד למצב של הזזת המפה).
כשמחליפים את המצלמה, אפשר להוסיף אנימציה תנועת המצלמה. האנימציה עוברת אינטרפולציה בין המצלמה הנוכחית ואת מאפייני המצלמה החדשים. אפשר גם לשלוט משך האנימציה.
כדי לשנות את מיקום המצלמה, צריך לציין את היעד
מזיזים את המצלמה באמצעות CameraUpdate
. API של מפות Google
מאפשר ליצור סוגים רבים ושונים של CameraUpdate
באמצעות
CameraUpdateFactory
. אלו האפשרויות הזמינות:
שינוי רמת הזום והגדרת זום מינימלי/מקסימלי
CameraUpdateFactory.zoomIn()
ו-
CameraUpdateFactory.zoomOut()
נותן לך CameraUpdate
שמשנה את רמת הזום ב-1.0, תוך שמירה על
כל שאר המאפיינים זהים.
CameraUpdateFactory.zoomTo(float)
נותן ערך של CameraUpdate
שמשנה את מרחק התצוגה לערך הנתון,
תוך שמירה על כל שאר הנכסים ללא שינוי.
CameraUpdateFactory.zoomBy(float)
וגם
CameraUpdateFactory.zoomBy(float, Point)
נותן לך CameraUpdate
עולה (או יורד, אם הערך הוא
שלילי) רמת הזום בערך הנתון. האחרון מתקן את הנקודה הנתונה
במסך כך שיישאר באותו מיקום (קו רוחב/קו אורך)
ולכן הוא עשוי לשנות את מיקום המצלמה כדי לעשות זאת.
מומלץ להגדיר רמה מינימלית ו/או מקסימלית מועדפת לשינוי מרחק התצוגה. לדוגמה, המאפיין הזה עוזר לכם לשלוט בחוויית המשתמש אם באפליקציה מוצג אזור מוגדר סביב נקודת עניין, או אם משתמשים במשבצת מותאמת אישית ליצור שכבת-על עם קבוצה מוגבלת של רמות זום.
Kotlin
private lateinit var map: GoogleMap map.setMinZoomPreference(6.0f) map.setMaxZoomPreference(14.0f)
Java
private GoogleMap map; map.setMinZoomPreference(6.0f); map.setMaxZoomPreference(14.0f);
שימו לב שיש שיקולים טכניים שעשויים למנוע מה-API כך שמשתמשים יכולים להגדיל את התצוגה נמוכה או גבוהה מדי. לדוגמה: לוויין או פני שטח עשוי להיות מרחק מקסימלי נמוך יותר מאשר פקדי המפה הבסיסית.
שינוי מיקום המצלמה
יש שתי שיטות נוחות לשינויי מיקום נפוצים.
CameraUpdateFactory.newLatLng(LatLng)
נותן ערך CameraUpdate
שמשנה את קו הרוחב וקו האורך של המצלמה
תוך שימור כל שאר המאפיינים.
CameraUpdateFactory.newLatLngZoom(LatLng, float)
נותן CameraUpdate
שמשנה את מיקום המצלמה
קו רוחב, קו אורך וזום, תוך שימור כל שאר המאפיינים.
לקבלת גמישות מלאה בשינוי מיקום המצלמה,
CameraUpdateFactory.newCameraPosition(CameraPosition)
שמעניק CameraUpdate
שמזיז את המצלמה
את המיקום הנתון. אפשר לקבל CameraPosition
באופן ישיר, באמצעות
new CameraPosition()
או עם CameraPosition.Builder
באמצעות
new CameraPosition.Builder()
הזזה (גלילה)
CameraUpdateFactory.scrollBy(float, float)
נותן לך CameraUpdate
משנה את קווי האורך והרוחב של המצלמה, כך שהמפה זזה
את מספר הפיקסלים שצוין. ערך x חיובי גורם למצלמה לעבור אל
מימין, כדי שנראה שהמפה זזה שמאלה. y חיובי
גורם למצלמה לנוע למטה, כך שנראה שהמפה זזה
למעלה. לעומת זאת, ערכי x שלילי גורמים למצלמה לנוע שמאלה, כך
שנראה שהמפה זזה ימינה וערכי y שליליים גורמים
להזיז את המצלמה למעלה. הגלילה ביחס לסביבה הנוכחית של המצלמה
לכיוון מסוים. לדוגמה, אם למצלמה יש כיוון של 90 מעלות, אז לכיוון מזרח
הוא 'למעלה'.
גבולות
הגדרת גבולות המפה
לפעמים כדאי להעביר את
מצלמה כך שאזור עניין שלם ייראה בצורה הטובה ביותר.
רמת הזום. לדוגמה, אם אתם מציגים את כל תחנות הדלק בתוך
במרחק של 5 ק"מ מהמיקום הנוכחי של המשתמש, כדאי להזיז את המצלמה
שהם גלויים לכולם במסך. לשם כך, קודם צריך לחשב את
LatLngBounds
שרוצים שיוצג במסך. שלך
לאחר מכן הוא יכול להשתמש בפונקציה CameraUpdateFactory.newLatLngBounds(LatLngBounds bounds, int
padding)
כדי לקבל אובייקט CameraUpdate
שמשנה את המצלמה
כך ש-LatLngBounds
הנתון יתאים לגמרי במפה, לוקח
צריך להביא בחשבון את המרווח הפנימי (בפיקסלים) שצוין. הערך שהוחזר: CameraUpdate
מבטיח שהפער (בפיקסלים) בין הגבולות הנתונים לקצה
המפה תהיה בגודל של המרווח הפנימי שצוין לפחות. שימו לב שההטיה
כיוון התצוגה של המפה יהיה 0.
Kotlin
val australiaBounds = LatLngBounds( LatLng((-44.0), 113.0), // SW bounds LatLng((-10.0), 154.0) // NE bounds ) map.moveCamera(CameraUpdateFactory.newLatLngBounds(australiaBounds, 0))
Java
LatLngBounds australiaBounds = new LatLngBounds( new LatLng(-44, 113), // SW bounds new LatLng(-10, 154) // NE bounds ); map.moveCamera(CameraUpdateFactory.newLatLngBounds(australiaBounds, 0));
מרכוז המפה בתוך אזור
במקרים מסוימים, כדאי למרכז את המצלמה בתוך גבולות במקום
כולל הגבולות הקיצוניים. לדוגמה, כדי למקם את המצלמה במרכזה של מדינה מסוימת
תוך שמירה על זום קבוע. במקרה כזה, אפשר להשתמש בשיטה דומה,
באמצעות יצירה של LatLngBounds
CameraUpdateFactory.newLatLngZoom(LatLng latLng, float zoom)
עם
LatLngBounds
.אמצעי תשלום אחד (getCenter()
). השיטה getCenter() תחזיר את הערך
המרכז הגיאוגרפי של LatLngBounds
.
Kotlin
val australiaBounds = LatLngBounds( LatLng((-44.0), 113.0), // SW bounds LatLng((-10.0), 154.0) // NE bounds ) map.moveCamera(CameraUpdateFactory.newLatLngZoom(australiaBounds.center, 10f))
Java
LatLngBounds australiaBounds = new LatLngBounds( new LatLng(-44, 113), // SW bounds new LatLng(-10, 154) // NE bounds ); map.moveCamera(CameraUpdateFactory.newLatLngZoom(australiaBounds.getCenter(), 10));
עומס יתר של השיטה, newLatLngBounds(boundary, width, height,
padding)
מאפשרת לציין רוחב וגובה בפיקסלים עבור
מתוך כוונה שהם תואמים למידות של
מפה המלבן ממוקם כך שהמרכז שלו זהה לזה של
תצוגת המפה (כך שאם המאפיינים שצוינו זהים לאלה של
בתצוגת המפה, ואז המלבן חופף לתצוגת המפה).
הפקודה CameraUpdate
תזיז את המצלמה כך
LatLngBounds
במרכז המסך בתוך המלבן הנתון
מרחק התצוגה הגבוה ביותר האפשרי, תוך התייחסות למרווח הפנימי הנדרש.
הערה: מומלץ להשתמש רק בשיטה הפשוטה יותר.
newLatLngBounds(boundary, padding)
כדי ליצור CameraUpdate
אם הוא ישמש להעברה
המצלמה אחרי שהמפה עברה פריסה. במהלך הפריסה, ה-API
מחשב את גבולות התצוגה של המפה לפי הצורך
להקרין את התיבה התוחמת. לשם השוואה, אפשר להשתמש
CameraUpdate
הוחזרו בשיטה המורכבת יותר
newLatLngBounds(boundary, width, height, padding)
בכל עת, עוד לפני שהמפה עברה פריסה, מפני שה-API
מחשבת את גבולות התצוגה מהארגומנטים שאתם מעבירים.
הגבלת התנועה האופקית של המשתמש לאזור נתון
בתרחישים שלמעלה, אתם מגדירים את גבולות המפה אבל המשתמש ואז לגלול או להזיז את המפה מחוץ לגבולות האלה. במקום זאת, להגביל את גבולות מרכז הרוחב/האורך של נקודת המוקד במפה (המצלמה ), כך שהמשתמשים יוכלו לגלול ולהזיז רק את הגבולות האלה. לדוגמה, יישום קמעונאי עבור מרכז קניות או שדה תעופה עשוי להגביל את המפה גבולות מסוימים, כך שהמשתמשים יוכלו לגלול ולנוע בתוך הגבולות האלה.
Kotlin
// Create a LatLngBounds that includes the city of Adelaide in Australia. val adelaideBounds = LatLngBounds( LatLng(-35.0, 138.58), // SW bounds LatLng(-34.9, 138.61) // NE bounds ) // Constrain the camera target to the Adelaide bounds. map.setLatLngBoundsForCameraTarget(adelaideBounds)
Java
// Create a LatLngBounds that includes the city of Adelaide in Australia. LatLngBounds adelaideBounds = new LatLngBounds( new LatLng(-35.0, 138.58), // SW bounds new LatLng(-34.9, 138.61) // NE bounds ); // Constrain the camera target to the Adelaide bounds. map.setLatLngBoundsForCameraTarget(adelaideBounds);
בתרשים הבא מתואר תרחיש שבו יעד המצלמה מוגבל לאזור שהוא מעט גדול יותר מאזור התצוגה. המשתמש יכול גוללים ומזיזים, בתנאי שיעד המצלמה נשאר בתוך האזור התחום. הצלב מייצג את יעד המצלמה:
המפה תמיד ממלאת את אזור התצוגה, גם אם התוצאה היא באזור התצוגה אזורים שנמצאים מחוץ לגבולות המוגדרים. לדוגמה, אם תמקם את יעד המצלמה בפינה של האזור התחום, האזור שמעבר לפינה גלויים באזור התצוגה, אבל המשתמשים לא יכולים לגלול עוד לתוך האזור. התרשים הבא ממחיש את התרחיש הזה. הצלב מייצג את המצלמה target:
בתרשים הבא, ליעד המצלמה יש גבולות מוגבלים מאוד, ומציעים למשתמש מעט מאוד הזדמנויות לגלול או להזיז את המפה. הצלב מייצג את יעד המצלמה:
התצוגה של המצלמה מתעדכנת
כדי להחיל CameraUpdate
על המפה, אפשר להזיז
מצלמה באופן מיידי או הוספת אנימציה למצלמה בצורה חלקה. כדי להזיז את המצלמה
באופן מיידי בעזרת CameraUpdate
, אפשר להתקשר
GoogleMap.moveCamera(CameraUpdate)
.
ניתן להפוך את חוויית המשתמש לנעימה יותר, במיוחד בתנועות קצרות.
על ידי אנימציית השינוי. כדי לעשות זאת במקום להתקשר
GoogleMap.moveCamera
לשלוח קריאה
GoogleMap.animateCamera
.
המפה תעבור בצורה חלקה למאפיינים החדשים. בצורה המפורטת ביותר של השיטה הזו,
GoogleMap.animateCamera(cameraUpdate, duration, callback)
,
כוללת שלושה ארגומנטים:
cameraUpdate
- ה
CameraUpdate
שמתאר לאן להזיז את המצלמה. callback
- אובייקט שמטמיע
GoogleMap.CancellableCallback
. הממשק הכללי הזה לטיפול במשימות מגדיר שתי שיטות 'onCancel() ' ו-'onFinished() '. באנימציה, השיטות נקראות בנסיבות הבאות:onFinish()
- מופעלת אם האנימציה תושלם ללא הפרעה.
onCancel()
-
מופעל אם האנימציה מופסקת על ידי התקשרות
stopAnimation()
או התחלת תנועת מצלמה חדשה.מצב כזה יכול לקרות גם
GoogleMap.stopAnimation()
.
duration
- משך הזמן הרצוי של האנימציה, באלפיות שנייה, כ
int
.
קטעי הקוד הבאים ממחישים כמה מהדרכים הנפוצות להעברת מצלמה.
Kotlin
val sydney = LatLng(-33.88, 151.21) val mountainView = LatLng(37.4, -122.1) // Move the camera instantly to Sydney with a zoom of 15. map.moveCamera(CameraUpdateFactory.newLatLngZoom(sydney, 15f)) // Zoom in, animating the camera. map.animateCamera(CameraUpdateFactory.zoomIn()) // Zoom out to zoom level 10, animating with a duration of 2 seconds. map.animateCamera(CameraUpdateFactory.zoomTo(10f), 2000, null) // Construct a CameraPosition focusing on Mountain View and animate the camera to that position. val cameraPosition = CameraPosition.Builder() .target(mountainView) // Sets the center of the map to Mountain View .zoom(17f) // Sets the zoom .bearing(90f) // Sets the orientation of the camera to east .tilt(30f) // Sets the tilt of the camera to 30 degrees .build() // Creates a CameraPosition from the builder map.animateCamera(CameraUpdateFactory.newCameraPosition(cameraPosition))
Java
LatLng sydney = new LatLng(-33.88,151.21); LatLng mountainView = new LatLng(37.4, -122.1); // Move the camera instantly to Sydney with a zoom of 15. map.moveCamera(CameraUpdateFactory.newLatLngZoom(sydney, 15)); // Zoom in, animating the camera. map.animateCamera(CameraUpdateFactory.zoomIn()); // Zoom out to zoom level 10, animating with a duration of 2 seconds. map.animateCamera(CameraUpdateFactory.zoomTo(10), 2000, null); // Construct a CameraPosition focusing on Mountain View and animate the camera to that position. CameraPosition cameraPosition = new CameraPosition.Builder() .target(mountainView ) // Sets the center of the map to Mountain View .zoom(17) // Sets the zoom .bearing(90) // Sets the orientation of the camera to east .tilt(30) // Sets the tilt of the camera to 30 degrees .build(); // Creates a CameraPosition from the builder map.animateCamera(CameraUpdateFactory.newCameraPosition(cameraPosition));