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

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

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

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

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

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