תמונה בתוך תמונה

תכונת תמונה-בתמונה (PIP) עבור מכשירי כף יד אנדרואיד מאפשרת למשתמשים לשנות את גודל האפליקציה עם פעילות מתמשכת לתוך חלון קטן. PIP שימושי במיוחד עבור אפליקציות וידאו מכיוון שהתוכן ממשיך להתנגן בזמן שהמשתמש חופשי לבצע פעולות אחרות. משתמשים יכולים לתמרן את מיקומו של חלון זה דרך ה-SystemUI ולקיים אינטראקציה עם האפליקציה שנמצאת כעת בתמונה-בתמונה עם (עד שלוש) פעולות המסופקות על ידי אפליקציה.

PIP דורש הסכמה מפורשת מיישומים התומכים בו ופועל על בסיס כל פעילות. (לאפליקציה בודדת יכולה להיות מספר פעילויות, שרק אחת מהן נמצאת ב-PIP.) פעילויות מבקשות להזין תמונה-בתמונה על ידי קריאה ל- enterPictureInPictureMode() , ולקבל התקשרות חוזרת לפעילות בצורה של onPictureInPictureModeChanged() .

שיטת setPictureInPictureParams() מאפשרת לפעילויות לשלוט ביחס הגובה-רוחב שלהן תוך כדי PIP ופעולות מותאמות אישית, המאפשרות למשתמשים ליצור אינטראקציה עם הפעילות מבלי להרחיב אותה. ב-PIP, הפעילות נמצאת במצב מושהה, אך עיבוד, ואינה מקבלת ישירות קלט מגע או מיקוד בחלון. רק משימה בודדת יכולה להיות ב-PIP בכל פעם.

מידע נוסף זמין בתיעוד 'תמונה בתוך תמונה' של מפתח Android.

דרישות המכשיר

כדי לתמוך ב-PIP, הפעל את תכונת המערכת PackageManager#FEATURE_PICTURE_IN_PICTURE ב- /android/frameworks/base/core/java/android/content/pm/PackageManager.java frameworks/base/core/java/android/content/pm/PackageManager.java. מכשירים התומכים ב-PIP חייבים להיות בעלי מסך שגדול מ-220dp ברוחב הקטן ביותר שלו. בדומה למסך מפוצל מרובה חלונות, PIP מאפשר לרוץ פעילויות מרובות על המסך בו זמנית. לכן, להתקנים צריכים להיות מספיק CPU ו-RAM כדי לתמוך במקרה שימוש זה.

יישום

רוב ניהול מחזור החיים של הפעילות נעשה במערכת בין ActivityManager ו- WindowManager . יישום ממשק המשתמש הייחוס נמצא בחבילת SystemUI .

שינויים במערכת לא אמורים להשפיע על ההתנהגות הפנימית שלה כפי שהוגדרה על ידי מבחני חבילת בדיקת התאימות (CTS) . ההיגיון של המערכת עבור PIP סובב בעיקר סביב ניהול משימות ופעילויות בתוך המחסנית ה"מוצמדת". להלן סקירת כיתה מהירה:

  • ActivityRecord : עוקב אחר מצב תמונה-בתמונה של כל פעילות. כדי למנוע ממשתמשים להזין PIP בנסיבות מסוימות, כגון ממסך הנעילה או במהלך VR, הוסף מקרים ל- checkEnterPictureInPictureState() .
  • ActivityManagerService : הממשק העיקרי מהפעילות לבקשת הזנת PIP והממשק לקריאות מ- WindowManager ו- SystemUI לשינוי מצב פעילות PIP.
  • ActivityStackSupervisor : נקרא מ- ActivityManagerService כדי להעביר משימות אל או מחוץ למחסנית המוצמדת, תוך עדכון של WindowManager לפי הצורך.
  • PinnedStackWindowController : ממשק WindowManager מ- ActivityManager .
  • PinnedStackController : מדווח על שינויים במערכת ל- SystemUI , כגון IME מוצג/מוסתר, יחס רוחב-גובה השתנה או פעולות שהשתנו.
  • BoundsAnimationController : הנפשה של חלונות פעילות PIP באופן שאינו מפעיל שינוי תצורה בזמן שינוי גודל.
  • PipSnapAlgorithm : מחלקה משותפת המשמשת הן במערכת והן ב-SystemUI השולטת בהתנהגות ההצמדה של חלון ה-PIP ליד קצוות המסך.

הפניה SystemUI מספקת יישום מלא של PIP התומך בהצגת פעולות מותאמות אישית למשתמשים ובמניפולציה כללית, כגון הרחבה ופיטורין. יצרני מכשירים יכולים להתבסס על שינויים אלה, כל עוד הם אינם משפיעים על ההתנהגויות הפנימיות כפי שהוגדרו על ידי ה-CDD. להלן סקירת כיתה מהירה:

  • PipManager : רכיב SystemUI שמופעל עם SystemUI .
  • PipTouchHandler : מטפל המגע, השולט במחוות שמתפעלות את ה-PIP. זה משמש רק כאשר צרכן הקלט עבור ה-PIP פעיל (ראה InputConsumerController ). ניתן להוסיף כאן מחוות חדשות.
  • PipMotionHelper : מחלקת נוחות שעוקבת אחר מיקום ה-PIP והאזור המותר על המסך. מתקשר אל ActivityManagerService כדי לעדכן או להנפש את המיקום והגודל של ה-PIP.
  • PipMenuActivityController : מתחיל פעילות המציגה את הפעולות שמסופקות על ידי הפעילות כרגע ב-PIP. פעילות זו היא פעילות שכבת-על, ומסירה את צרכן הקלט השכבה כדי לאפשר לו להיות אינטראקטיבי.
  • PipMenuActivity : היישום עבור פעילות התפריט.
  • PipMediaController : המאזין שמעדכן את SystemUI כאשר הפעלת המדיה משתנה באופן שעשוי להשפיע על פעולות ברירת המחדל ב-PIP.
  • PipNotificationController : הבקר המבטיח שהתראה פעילה בזמן שמשתמש משתמש בתכונת PIP.
  • PipDismissViewController : שכבת העל המוצגת למשתמשים כשהם מתחילים ליצור אינטראקציה עם ה-PIP כדי לציין שניתן לבטל אותו.

מיקום ברירת מחדל

ישנם משאבי מערכת שונים השולטים במיקום ברירת המחדל של ה-PIP:

  • config_defaultPictureInPictureGravity : מספר הכבידה השלם , השולט בפינה להצבת ה-PIP, כגון BOTTOM|RIGHT .
  • config_defaultPictureInPictureScreenEdgeInsets : ההיסטים מצידי המסך כדי למקם את ה-PIP.
  • config_pictureInPictureDefaultSizePercent ו- config_pictureInPictureDefaultAspectRatio : השילוב של אחוז מרוחב המסך ויחס הגובה-רוחב שולט בגודל ה-PIP. גודל ברירת המחדל המחושב של PIP לא צריך להיות קטן מ- @dimen/default_minimal_size_pip_resizable_task , כפי שהוגדר על ידי CTS וה-CDD.
  • config_pictureInPictureSnapMode : התנהגות ההצמדה כפי שהוגדרה ב- PipSnapAlgorithm .

יישומי מכשיר אינם אמורים לשנות את יחסי הגובה-רוחב המינימליים והמקסימליים המוגדרים ב-CDD וב-CTS.

הרשאות

"פעולת היישום" לכל חבילה ( OP_PICTURE_IN_PICTURE ) ב- AppOpsManager ( main/core/java/android/app/AppOpsManager.java ), מאפשרת למשתמשים לשלוט ב-PIP ברמת כל אפליקציה דרך הגדרות המערכת. יישומי מכשיר צריכים לכבד את הסימון הזה כאשר פעילות מבקשת להיכנס למצב תמונה בתוך תמונה.

בדיקה

כדי לבדוק יישומי PIP, הפעל את כל הבדיקות הקשורות לתמונה-בתמונה שנמצאו במבחני CTS בצד המארח תחת /cts/hostsidetests/services/activitymanager , במיוחד ב- ActivityManagerPinnedStackTests.java .