في علامة النشاط لملف AndroidManifest.xml، اتّبِع الخطوات التالية:
- أضِف
supportsPictureInPictureواضبطه علىtrueللإشارة إلى أنّك ستستخدم ميزة "نافذة ضمن النافذة" في تطبيقك. - أضِف
configChangesواضبطه علىorientation|screenLayout|screenSize|smallestScreenSizeلتحديد أنّ نشاطك يعالج تغييرات إعدادات التصميم. بهذه الطريقة، لن تتم إعادة تشغيل نشاطك عند حدوث تغييرات في التنسيق أثناء عمليات الانتقال إلى وضع "نافذة داخل النافذة".
<activity
android:name=".SnippetsActivity"
android:exported="true"
android:supportsPictureInPicture="true"
android:configChanges="orientation|screenLayout|screenSize|smallestScreenSize"
android:theme="@style/Theme.Snippets">
في رمز Compose، نفِّذ ما يلي:
- أضِف هذه الإضافة على الموقع الإلكتروني
Context. ستستخدم هذه الإضافة عدة مرات في الدليل للوصول إلى النشاط.internal fun Context.findActivity(): ComponentActivity { var context = this while (context is ContextWrapper) { if (context is ComponentActivity) return context context = context.baseContext } throw IllegalStateException("Picture in picture should be called in the context of an Activity") }
إضافة ميزة "نافذة ضمن النافذة" إلى تطبيق الإجازات على الإصدارات السابقة من Android 12
لإضافة ميزة "نافذة ضمن النافذة" في الإصدارات الأقدم من Android 12، استخدِم addOnUserLeaveHintProvider. اتّبِع الخطوات التالية لإضافة ميزة "نافذة ضمن النافذة" على الإصدارات الأقدم من Android 12:
- أضِف بوابة إصدار لكي لا يمكن الوصول إلى هذا الرمز إلا في الإصدارات من O إلى R.
- استخدِم
DisposableEffectمعContextكمفتاح. - داخل
DisposableEffect، حدِّد السلوك الذي سيتم اتّخاذه عند تفعيلonUserLeaveHintProviderباستخدام تعبير lambda. في دالة lambda، استدعِenterPictureInPictureMode()علىfindActivity()وأدخِلPictureInPictureParams.Builder().build(). - أضِف
addOnUserLeaveHintListenerباستخدامfindActivity()ومرِّر lambda. - في
onDispose، أضِفremoveOnUserLeaveHintListenerباستخدامfindActivity()وأدخِل تعبير lambda.
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 { 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
بعد إصدار Android 12، تتم إضافة PictureInPictureParams.Builder من خلال أداة تعديل يتم تمريرها إلى مشغّل الفيديو في التطبيق.
- أنشئ
modifierواستدعِonGloballyPositionedعليه. سيتم استخدام إحداثيات التصميم في خطوة لاحقة. - أنشئ متغيّرًا لـ
PictureInPictureParams.Builder(). - أضِف عبارة
ifللتحقّق مما إذا كانت حزمة SDK هي الإصدار S أو إصدار أحدث. إذا كان الأمر كذلك، أضِفsetAutoEnterEnabledإلى أداة الإنشاء واضبطها علىtrueلتفعيل وضع "نافذة ضمن النافذة" عند التمرير سريعًا. يوفّر ذلك رسومًا متحركة أكثر سلاسة من الانتقال إلىenterPictureInPictureMode. - استخدِم
findActivity()للاتصال بالرقمsetPictureInPictureParams(). اتّصِل بالرقمbuild()على الجهازbuilderوأدخِل الرقم.
val pipModifier = modifier.onGloballyPositioned { layoutCoordinates -> val builder = PictureInPictureParams.Builder() if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) { builder.setAutoEnterEnabled(true) } context.findActivity().setPictureInPictureParams(builder.build()) } VideoPlayer(pipModifier)
استخدِم setAspectRatio لضبط نسبة العرض إلى الارتفاع لنافذة "نافذة ضمن النافذة"
لضبط نسبة العرض إلى الارتفاع لنافذة "صورة في صورة"، يمكنك إما اختيار نسبة عرض إلى ارتفاع معيّنة أو استخدام عرض وارتفاع حجم فيديو المشغّل. إذا كنت تستخدم مشغّل media3، تأكَّد من أنّ المشغّل ليس فارغًا وأنّ حجم الفيديو في المشغّل لا يساوي VideoSize.UNKNOWN قبل ضبط نسبة العرض إلى الارتفاع.
val context = LocalContext.current val pipModifier = modifier.onGloballyPositioned { layoutCoordinates -> val builder = PictureInPictureParams.Builder() if (shouldEnterPipMode && player != null && player.videoSize != VideoSize.UNKNOWN) { val sourceRect = layoutCoordinates.boundsInWindow().toAndroidRectF().toRect() builder.setSourceRectHint(sourceRect) builder.setAspectRatio( Rational(player.videoSize.width, player.videoSize.height) ) } if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) { builder.setAutoEnterEnabled(shouldEnterPipMode) } context.findActivity().setPictureInPictureParams(builder.build()) } VideoPlayer(pipModifier)
إذا كنت تستخدم مشغّلاً مخصّصًا، اضبط نسبة العرض إلى الارتفاع على ارتفاع المشغّل وعرضه باستخدام بنية خاصة بالمشغّل. يُرجى العِلم أنّه إذا تم تغيير حجم المشغّل أثناء عملية التهيئة، وكان خارج النطاقات الصالحة لنسبة العرض إلى الارتفاع، سيتعطّل تطبيقك. قد تحتاج إلى إضافة عمليات تحقّق بشأن الحالات التي يمكن فيها احتساب نسبة العرض إلى الارتفاع، على غرار ما يتم إجراؤه في مشغّل media3.