يجب ألّا يدخل تطبيقك وضع "صورة في صورة" في الحالات التالية:
- إذا تم إيقاف الفيديو أو إيقافه مؤقتًا
- إذا كنت في صفحة مختلفة من التطبيق غير صفحة مشغّل الفيديو
للتحكّم في حالات دخول تطبيقك إلى وضع "نافذة ضمن النافذة"، أضِف متغيّرًا يتتبّع حالة
مشغّل الفيديو باستخدام mutableStateOf
.
تبديل الحالة استنادًا إلى ما إذا كان الفيديو يتم تشغيله
لتبديل الحالة استنادًا إلى ما إذا كان مشغّل الفيديو قيد التشغيل، أضِف مستمعًا في مشغّل الفيديو. بدِّل حالة متغيّر الحالة استنادًا إلى ما إذا كان اللاعب يلعب أم لا:
player.addListener(object : Player.Listener { override fun onIsPlayingChanged(isPlaying: Boolean) { shouldEnterPipMode = isPlaying } })
تبديل الحالة استنادًا إلى ما إذا كان المشغّل قد تم تحريره
عند تحرير اللاعب، اضبط متغيّر الحالة على false
:
fun releasePlayer() { shouldEnterPipMode = false }
استخدام الحالة لتحديد ما إذا تم الدخول إلى وضع "صورة في صورة" (في الإصدارات الأقدم من Android 12)
- بما أنّ إضافة وضع "صورة في صورة" في الإصدارات الأقدم من 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: () -> Unit = { 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") }
استخدام الحالة لتحديد ما إذا تم الدخول إلى وضع "صورة في صورة" (بعد الإصدار 12 من Android)
نقْل متغيّر الحالة إلى setAutoEnterEnabled
لكي يدخل تطبيقك
وضع PiP في الوقت المناسب فقط:
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 والإصدارات الأحدث، يتم أيضًا إنشاء حركة أكثر سلاسة للخروج من وضع "صورة في صورة".
أضِف واجهة برمجة التطبيقات هذه إلى أداة إنشاء وضع الصورة في الصورة للإشارة إلى منطقة النشاط التي
تكون مرئية بعد الانتقال إلى وضع الصورة في الصورة.
- لا تُضِف
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)