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

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

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

Implement PiP with Jetpack

Use the Jetpack Picture-in-Picture library to implement picture-in-picture experience as it streamlines integration and reduces common in-app issues. Refer to our platform sample app to see an example of its usage. However, if you prefer to implement PiP using the platform APIs, refer to the following documentation.

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

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

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