لمحة عن ميزة "نافذة ضمن النافذة"

"نافذة ضمن النافذة" (PiP) هي نوع خاص من وضع النوافذ المتعدّدة يُستخدم في الغالب لتشغيل الفيديوهات. تتيح هذه الميزة للمستخدم مشاهدة فيديو في نافذة صغيرة مثبَّتة في إحدى زوايا الشاشة، بينما يتنقل بين التطبيقات الأخرى أو يتصفّح المحتوى على الشاشة الرئيسية.

تستفيد ميزة "نافذة ضمن النافذة" من واجهات برمجة التطبيقات المتعددة النوافذ المتاحة في الإصدار 7.0 من نظام التشغيل Android لتوفير نافذة تراكب الفيديو المثبّتة. لإضافة ميزة "نافذة ضمن النافذة" إلى تطبيقك، عليك تسجيل نشاطك، وتبديل النشاط إلى وضع "نافذة ضمن النافذة" حسب الحاجة، والتأكّد من إخفاء عناصر واجهة المستخدم واستمرار تشغيل الفيديو عندما يكون النشاط في وضع "نافذة ضمن النافذة".

تنفيذ ميزة "نافذة ضمن النافذة" باستخدام Jetpack

استخدِم مكتبة "نافذة ضمن النافذة" في Jetpack لتنفيذ تجربة "نافذة ضمن النافذة"، لأنّها تسهّل عملية الدمج وتقلّل المشاكل الشائعة داخل التطبيق. راجِع نموذج تطبيق المنصة للاطّلاع على مثال على كيفية استخدامه. ومع ذلك، إذا كنت تفضّل تنفيذ ميزة "نافذة ضمن النافذة" باستخدام واجهات برمجة التطبيقات الخاصة بالنظام الأساسي، يمكنك الرجوع إلى المستندات التالية.

التعامل مع واجهة المستخدم في وضع "نافذة ضمن النافذة"

عند الدخول إلى وضع "نافذة داخل النافذة"، تنتقل واجهة المستخدم بالكامل إلى نافذة "نافذة داخل النافذة" ما لم تحدّد كيف يجب أن تبدو واجهة المستخدم في وضع "نافذة داخل النافذة" وخارجه.

أولاً، عليك معرفة ما إذا كان تطبيقك في وضع "نافذة ضمن النافذة" أم لا. يمكنك استخدام 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()
}