'תמונה בתוך תמונה' (PiP) הוא סוג מיוחד של מצב 'חלונות מרובים', שמשמשים בעיקר להפעלת סרטונים. הוא מאפשר למשתמשים לצפות בסרטון בחלון קטן שמוצמד לפינה של המסך, בזמן שהם עוברים בין אפליקציות או גולשים בתוכן במסך הראשי.
התכונה 'תמונה בתוך תמונה' משתמשת בממשקי ה-API של ריבוי חלונות שזמינים ב-Android 7.0 כדי לספק את חלון שכבת-העל של הסרטון המוצמדת. כדי להוסיף את התכונה 'תמונה בתוך תמונה' לאפליקציה, צריך לרשום את הפעילות, להעביר את הפעילות למצב 'תמונה בתוך תמונה' לפי הצורך ולוודא שרכיבי ממשק המשתמש מוסתרים והפעלת הסרטון ממשיכה כשהפעילות במצב 'תמונה בתוך תמונה'.
טיפול בממשק המשתמש במצב PIP
כשנכנסים למצב PIP, כל ממשק המשתמש של האפליקציה נכנס לחלון ה-PIP, אלא אם מציינים איך ממשק המשתמש אמור להיראות במצב PIP ובמצב רגיל.
קודם כול, צריך לדעת מתי האפליקציה נמצאת במצב PiP ומתי לא. כדי לעשות זאת, אפשר להשתמש בפקודה OnPictureInPictureModeChangedProvider
.
הקוד הבא מאפשר לבדוק אם האפליקציה נמצאת במצב PiP.
@Composable fun rememberIsInPipMode(): Boolean { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { val activity = LocalContext.current.findActivity() var pipMode by remember { mutableStateOf(activity.isInPictureInPictureMode) } DisposableEffect(activity) { val observer = Consumer<PictureInPictureModeChangedInfo> { info -> pipMode = info.isInPictureInPictureMode } activity.addOnPictureInPictureModeChangedListener( observer ) onDispose { activity.removeOnPictureInPictureModeChangedListener(observer) } } return pipMode } else { return false } }
עכשיו אפשר להשתמש ב-rememberIsInPipMode()
כדי להחליף את רכיבי ממשק המשתמש שיוצגו כשהאפליקציה עוברת למצב PiP:
val inPipMode = rememberIsInPipMode() Column(modifier = modifier) { // This text will only show up when the app is not in PiP mode if (!inPipMode) { Text( text = "Picture in Picture", ) } VideoPlayer() }