"نافذة ضمن النافذة" هو نوع خاص من وضع النوافذ المتعدّدة يُستخدم في الغالب لتشغيل الفيديوهات. تتيح هذه الميزة للمستخدم مشاهدة فيديو في نافذة صغيرة مثبَّتة في إحدى زوايا الشاشة أثناء التنقل بين التطبيقات أو تصفّح المحتوى على الشاشة الرئيسية.
تستفيد ميزة "نافذة ضمن النافذة" من واجهات برمجة التطبيقات المتعددة النوافذ المتوفّرة في الإصدار 7.0 من نظام التشغيل Android لتوفير نافذة تراكب الفيديو المثبّتة. لإضافة ميزة نافذة ضمن النافذة (PIP) إلى تطبيقك، عليك تسجيل النشاط، والتبديل إلى وضع نافذة ضمن النافذة (PIP) حسب الحاجة، والتأكّد من إخفاء عنصر في واجهة المستخدم واستمرار تشغيل الفيديو عندما يكون النشاط في وضع نافذة ضمن النافذة (PIP).
تنفيذ ميزة "نافذة ضمن النافذة" باستخدام Jetpack
استخدِم مكتبة "نافذة ضمن النافذة" في Jetpack لتنفيذ تجربة "نافذة ضمن النافذة"، لأنّها تسهّل عملية الدمج وتقلّل المشاكل الشائعة داخل التطبيق. راجِع نموذج تطبيق المنصة للاطّلاع على مثال على كيفية استخدامه. ومع ذلك، إذا كنت تفضّل تنفيذ ميزة "نافذة ضمن النافذة" باستخدام واجهات برمجة التطبيقات الخاصة بالنظام الأساسي، يمكنك الرجوع إلى المستندات التالية.
التعامل مع واجهة المستخدم في وضع "نافذة ضمن النافذة"
عند الدخول إلى وضع PiP، تدخل واجهة المستخدم بالكامل في تطبيقك إلى نافذة PiP ما لم تحدّد كيف يجب أن تظهر واجهة المستخدم داخل وضع PiP وخارجه.
أولاً، عليك معرفة ما إذا كان تطبيقك في وضع "نافذة ضمن النافذة" أم لا. يمكنك استخدام
OnPictureInPictureModeChangedProvider لتحقيق ذلك.
يتحقّق الرمز التالي مما إذا كان تطبيقك في وضع "نافذة ضمن النافذة".
@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() لتحديد عناصر واجهة المستخدم التي تظهر
عندما يدخل التطبيق في وضع "نافذة ضمن النافذة":
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() }