يجب ألا يدخل تطبيقك في وضع PiP في الحالات التالية:
- إذا تم إيقاف الفيديو أو إيقافه مؤقتًا
- إذا كنت في صفحة مختلفة من التطبيق غير صفحة مشغّل الفيديو
للتحكّم في وقت دخول تطبيقك في وضع "نافذة ضمن النافذة"، أضِف متغيّرًا يتتبّع حالة مشغّل الفيديو باستخدام mutableStateOf.
تبديل الحالة استنادًا إلى ما إذا كان الفيديو قيد التشغيل
لتبديل الحالة استنادًا إلى ما إذا كان مشغّل الفيديو قيد التشغيل، أضِف مستمعًا على مشغّل الفيديو. يمكنك تبديل حالة متغير الحالة بناءً على ما إذا كان اللاعب يلعب أم لا:
player.addListener(object : Player.Listener { override fun onIsPlayingChanged(isPlaying: Boolean) { shouldEnterPipMode = isPlaying } })
تبديل الحالة استنادًا إلى ما إذا تم إصدار المشغّل
عندما يحرّر اللاعب الزر، اضبط متغيّر الحالة على false:
fun releasePlayer() { shouldEnterPipMode = false }
استخدام الحالة لتحديد ما إذا تم الدخول إلى وضع "نافذة ضمن النافذة" (الإصدارات الأقدم من Android 12)
- بما أنّ إضافة ميزة "نافذة ضمن النافذة" في الإصدارات الأقدم من Android 12 تستخدم
DisposableEffect، عليك إنشاء متغيّر جديد من خلالrememberUpdatedStateمع ضبطnewValueكمتغيّر الحالة. سيضمن ذلك استخدام الإصدار المحدَّث فيDisposableEffect. في دالة Lambda التي تحدّد السلوك عند تفعيل
OnUserLeaveHintListener، أضِف عبارةifمع متغيّر الحالة حول طلبenterPictureInPictureMode():val currentShouldEnterPipMode by rememberUpdatedState(newValue = shouldEnterPipMode) if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O && Build.VERSION.SDK_INT < Build.VERSION_CODES.S ) { val context = LocalContext.current DisposableEffect(context) { val onUserLeaveBehavior = Runnable { if (currentShouldEnterPipMode) { context.findActivity() .enterPictureInPictureMode(PictureInPictureParams.Builder().build()) } } context.findActivity().addOnUserLeaveHintListener( onUserLeaveBehavior ) onDispose { context.findActivity().removeOnUserLeaveHintListener( onUserLeaveBehavior ) } } } else { Log.i("PiP info", "API does not support PiP") }
استخدام الحالة لتحديد ما إذا تم الدخول إلى وضع "نافذة ضمن النافذة" (الإصدارات الأحدث من Android 12)
مرِّر متغيّر الحالة إلى setAutoEnterEnabled لكي يدخل تطبيقك في وضع "نافذة ضمن النافذة" في الوقت المناسب فقط:
val pipModifier = modifier.onGloballyPositioned { layoutCoordinates -> val builder = PictureInPictureParams.Builder() // Add autoEnterEnabled for versions S and up if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) { builder.setAutoEnterEnabled(shouldEnterPipMode) } context.findActivity().setPictureInPictureParams(builder.build()) } VideoPlayer(pipModifier)
استخدام setSourceRectHint للحصول على صورة متحركة سلسة
تنشئ واجهة برمجة التطبيقات setSourceRectHint صورة متحركة أكثر سلاسة للدخول إلى وضع "نافذة ضمن النافذة". في الإصدار 12 من Android والإصدارات الأحدث، تنشئ هذه الميزة أيضًا حركة أكثر سلاسة للخروج من وضع "نافذة ضمن النافذة".
أضِف واجهة برمجة التطبيقات هذه إلى أداة إنشاء PiP للإشارة إلى منطقة النشاط التي تظهر بعد الانتقال إلى PiP.
- يجب إضافة
setSourceRectHint()إلىbuilderفقط إذا كانت الحالة تحدّد أنّ التطبيق يجب أن يدخل في وضع "نافذة ضمن النافذة". يؤدي ذلك إلى تجنُّب احتسابsourceRectعندما لا يحتاج التطبيق إلى الدخول في وضع "نافذة ضمن النافذة". - لضبط قيمة
sourceRect، استخدِمlayoutCoordinatesالتي يتم توفيرها من دالةonGloballyPositionedفي المُعدِّل. - استدعِ
setSourceRectHint()فيbuilderومرِّر المتغيّرsourceRect.
val context = LocalContext.current val pipModifier = modifier.onGloballyPositioned { layoutCoordinates -> val builder = PictureInPictureParams.Builder() if (shouldEnterPipMode) { val sourceRect = layoutCoordinates.boundsInWindow().toAndroidRectF().toRect() builder.setSourceRectHint(sourceRect) } if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) { builder.setAutoEnterEnabled(shouldEnterPipMode) } context.findActivity().setPictureInPictureParams(builder.build()) } VideoPlayer(pipModifier)