بدءًا من الإصدار Android 8.0 (مستوى واجهة برمجة التطبيقات 26)، يسمح Android ببدء الأنشطة في وضع "نافذة ضمن النافذة" (PiP). ميزة "نافذة ضمن النافذة" هي نوع خاص من وضع النوافذ المتعددة يُستخدم لتشغيل الفيديوهات ومكالمات الفيديو والتنقّل. تتيح هذه الميزة للمستخدم تثبيت نافذة النشاط الحالية في إحدى زوايا الشاشة أثناء التنقّل بين التطبيقات أو تصفّح المحتوى على الشاشة الرئيسية.
تستفيد ميزة "نافذة ضمن النافذة" من واجهات برمجة التطبيقات المتعددة النوافذ المتوفّرة في الإصدار 7.0 من نظام التشغيل Android لتوفير نافذة تراكب الفيديو المثبّتة. لإضافة ميزة نافذة ضمن النافذة (PIP) إلى تطبيقك، عليك تسجيل الأنشطة التي تتيح استخدام ميزة نافذة ضمن النافذة (PIP)، وتبديل نشاطك إلى وضع نافذة ضمن النافذة (PIP) حسب الحاجة، والتأكّد من إخفاء عنصر في واجهة المستخدم ومواصلة تشغيل الفيديو عندما يكون النشاط في وضع نافذة ضمن النافذة (PIP).
تظهر نافذة "نافذة ضمن النافذة" في الطبقة العليا من الشاشة، في زاوية يختارها النظام.
يتوفّر وضع "نافذة ضمن النافذة" أيضًا على أجهزة Android TV OS المتوافقة التي تعمل بالإصدار 14 من Android (المستوى 34 لواجهة برمجة التطبيقات) أو الإصدارات الأحدث. على الرغم من وجود العديد من أوجه التشابه، هناك اعتبارات إضافية عند استخدام ميزة نافذة ضمن النافذة على التلفزيون.
كيفية تفاعل المستخدمين مع نافذة PiP
يمكن للمستخدمين سحب نافذة PiP إلى مكان آخر. اعتبارًا من الإصدار 12 من نظام التشغيل Android، يمكن للمستخدمين أيضًا:
انقر مرة واحدة على النافذة لعرض زر تبديل ملء الشاشة وزر الإغلاق وزر الإعدادات والإجراءات المخصّصة التي يوفّرها تطبيقك (على سبيل المثال، عناصر التحكّم في التشغيل).
انقر مرّتين على النافذة للتبديل بين حجم "نافذة ضمن النافذة" الحالي والحد الأقصى أو الأدنى لحجم "نافذة ضمن النافذة". على سبيل المثال، يؤدي النقر مرّتين على نافذة مكبّرة إلى تصغيرها، والعكس صحيح أيضًا.
يمكنك إخفاء النافذة من خلال سحبها إلى الحافة اليمنى أو اليسرى. لإظهار النافذة، انقر على الجزء المرئي منها أو اسحبها للخارج.
غيِّر حجم نافذة PiP باستخدام ميزة التصغير أو التكبير بإصبعَين.
يتحكّم تطبيقك في وقت دخول النشاط الحالي في وضع PiP. إليك بعض الأمثلة:
يمكن أن يدخل النشاط في وضع "نافذة ضمن النافذة" عندما ينقر المستخدم على زر الشاشة الرئيسية أو يمرّر سريعًا للأعلى للانتقال إلى الشاشة الرئيسية. هذه هي الطريقة التي تستمر بها خرائط Google في عرض الاتجاهات أثناء تشغيل المستخدم لنشاط آخر في نفس الوقت.
يمكن لتطبيقك نقل فيديو إلى وضع PiP عندما ينتقل المستخدم من الفيديو لتصفّح محتوى آخر.
يمكن لتطبيقك تبديل الفيديو إلى وضع "نافذة ضمن النافذة" أثناء مشاهدة المستخدم لنهاية حلقة من المحتوى. تعرض الشاشة الرئيسية معلومات ترويجية أو ملخّصة عن الحلقة التالية في المسلسل.
يمكن أن يوفّر تطبيقك طريقة للمستخدمين لإضافة محتوى إضافي إلى قائمة المحتوى التالي أثناء مشاهدة فيديو. يستمر تشغيل الفيديو في وضع PiP بينما تعرض الشاشة الرئيسية نشاط اختيار المحتوى.
الإعلان عن إتاحة ميزة "نافذة ضمن النافذة"
لا يتيح النظام تلقائيًا ميزة "نافذة ضمن النافذة" للتطبيقات. إذا أردت إتاحة ميزة "نافذة ضمن النافذة" في تطبيقك، سجِّل نشاط الفيديو في ملف البيان من خلال ضبط android:supportsPictureInPicture على true. بالإضافة إلى ذلك، حدِّد أنّ نشاطك يتعامل مع تغييرات إعدادات التنسيق حتى لا تتم إعادة تشغيل نشاطك عند حدوث تغييرات في التنسيق أثناء عمليات الانتقال إلى وضع "نافذة ضمن النافذة".
<activity android:name="VideoActivity"
android:supportsPictureInPicture="true"
android:configChanges=
"screenSize|smallestScreenSize|screenLayout|orientation"
...
تنفيذ ميزة "نافذة ضمن النافذة" باستخدام Jetpack
استخدِم مكتبة "نافذة ضمن النافذة" في Jetpack لتنفيذ تجربة "نافذة ضمن النافذة"، لأنّها تسهّل عملية الدمج وتقلّل المشاكل الشائعة داخل التطبيق. راجِع نموذج تطبيق المنصة للاطّلاع على مثال على كيفية استخدامه. ومع ذلك، إذا كنت تفضّل تنفيذ ميزة "نافذة ضمن النافذة" باستخدام واجهات برمجة التطبيقات الخاصة بالنظام الأساسي، يمكنك الرجوع إلى المستندات التالية.
تبديل نشاطك إلى وضع "نافذة ضمن النافذة"
بدءًا من الإصدار 12 من نظام التشغيل Android، يمكنك تبديل نشاطك إلى وضع "نافذة ضمن النافذة" من خلال ضبط
العلامة setAutoEnterEnabled على true. باستخدام هذا الإعداد، يتم تبديل النشاط تلقائيًا إلى وضع "نافذة ضمن النافذة" حسب الحاجة بدون الحاجة إلى استدعاء enterPictureInPictureMode() بشكل صريح في onUserLeaveHint. وهذا له فائدة إضافية تتمثل في توفير انتقالات أكثر سلاسة. لمعرفة التفاصيل، يُرجى الاطّلاع على جعل عمليات الانتقال إلى وضع "نافذة ضمن النافذة" أكثر سلاسة من خلال التنقّل بالإيماءات.
إذا كنت تستهدف الإصدار 11 من Android أو الإصدارات الأقدم، يجب أن يستدعي النشاط
enterPictureInPictureMode() للتبديل إلى وضع "نافذة ضمن النافذة". على سبيل المثال، يعمل الرمز التالي على تبديل نشاط إلى وضع "نافذة ضمن النافذة" عندما ينقر المستخدم على زر مخصّص في واجهة مستخدم التطبيق:
override fun onActionClicked(action: Action) {
if (action.id.toInt() == R.id.lb_control_picture_in_picture) {
activity?.enterPictureInPictureMode()
return
}
}
قد تحتاج إلى تضمين منطق يحوّل نشاطًا إلى وضع "نافذة ضمن النافذة" بدلاً من الانتقال إلى الخلفية. على سبيل المثال، يتم تبديل "خرائط Google" إلى وضع "نافذة ضمن النافذة" إذا ضغط المستخدم على زر الشاشة الرئيسية أو زر التطبيقات المستخدَمة مؤخرًا أثناء تنقّل التطبيق. يمكنك
التعامل مع هذه الحالة من خلال إلغاء onUserLeaveHint():
override fun onUserLeaveHint() {
if (iWantToBeInPipModeNow()) {
enterPictureInPictureMode()
}
}
إجراء مقترَح: توفير تجربة انتقال سلسة للمستخدمين إلى وضع "نافذة ضمن النافذة"
أضاف Android 12 تحسينات تجميلية كبيرة على الانتقالات المتحركة بين النوافذ في وضع ملء الشاشة ووضع "نافذة ضمن النافذة". ننصحك بشدة بتنفيذ جميع التغييرات السارية، وبعد ذلك، سيتم تطبيق هذه التغييرات تلقائيًا على الشاشات الكبيرة، مثل الأجهزة القابلة للطي والأجهزة اللوحية، بدون الحاجة إلى أي عمل إضافي.
إذا لم يتضمّن تطبيقك التحديثات السارية، ستظل عمليات الانتقال في وضع "نافذة ضمن النافذة" تعمل، ولكن ستكون الصور المتحركة أقل دقة. على سبيل المثال، قد يؤدي الانتقال من وضع ملء الشاشة إلى وضع "نافذة ضمن النافذة" إلى اختفاء نافذة PiP أثناء الانتقال قبل أن تظهر مرة أخرى عند اكتمال الانتقال.
وتشمل هذه التغييرات ما يلي:
- انتقال أكثر سلاسة إلى وضع "نافذة ضمن النافذة" من التنقّل بالإيماءات
- ضبط
sourceRectHintمناسب للدخول إلى وضع "نافذة ضمن النافذة" والخروج منه - إيقاف ميزة "تغيير الحجم بسلاسة" للمحتوى غير الفيديو
يمكنك الرجوع إلى نموذج PictureInPicture في Android Kotlin كمرجع لتفعيل تجربة انتقال سلسة.
جعل الانتقال إلى وضع "نافذة ضمن النافذة" أكثر سلاسة من التنقّل بالإيماءات
بدءًا من الإصدار Android 12، توفّر العلامة setAutoEnterEnabled رسومًا متحركة أكثر سلاسة للانتقال إلى محتوى الفيديو في وضع "نافذة ضمن النافذة" باستخدام ميزة "التنقّل بالإيماءات"، على سبيل المثال، عند التمرير سريعًا للأعلى للانتقال إلى الشاشة الرئيسية من وضع ملء الشاشة.
أكمِل الخطوات التالية لإجراء هذا التغيير:
- استخدِم
setAutoEnterEnabledلإنشاءPictureInPictureParams.Builder:
setPictureInPictureParams(PictureInPictureParams.Builder()
.setAspectRatio(aspectRatio)
.setSourceRectHint(sourceRectHint)
.setAutoEnterEnabled(true)
.build())
Note: When `setAutoEnterEnabled` is enabled, you don't need to explicitly
call [`enterPictureInPictureMode`][5] in [`onUserLeaveHint`][6].
اتصل بـ "
setPictureInPictureParams" باستخدام أحدث إصدار منPictureInPictureParamsفي وقت مبكر. لا ينتظر التطبيق دالة ردّ الاتصالonUserLeaveHint(كما كان يحدث في Android 11).على سبيل المثال، قد تحتاج إلى استدعاء
setPictureInPictureParamsفي أول عملية تشغيل وأي عملية تشغيل تالية في حال تغيير نسبة العرض إلى الارتفاع.اتصل بـ
setAutoEnterEnabled(false)، ولكن عند الضرورة فقط. على سبيل المثال، قد لا تريد الدخول إلى وضع "نافذة ضمن النافذة" إذا كان التشغيل الحالي في حالة إيقاف مؤقت.
ضبط sourceRectHint مناسب للدخول إلى وضع "نافذة ضمن النافذة" والخروج منه
بدءًا من طرح ميزة "نافذة ضمن النافذة" في الإصدار Android 8.0، يشير setSourceRectHint إلى مساحة النشاط المرئية بعد الانتقال إلى وضع "نافذة ضمن النافذة"، مثل حدود عرض الفيديو في مشغّل الفيديو.
في Android 12، يستخدم النظام sourceRectHint لتنفيذ حركة أكثر سلاسة عند الدخول إلى وضع "نافذة ضمن النافذة" والخروج منه.
لضبط sourceRectHint بشكل صحيح للدخول إلى وضع "نافذة ضمن النافذة" والخروج منه:
- أنشئ
PictureInPictureParamsباستخدام الحدود المناسبة مثلsourceRectHint. ننصح أيضًا بإرفاق مستمع لتغيير التنسيق بمشغّل الفيديو:
val mOnLayoutChangeListener =
OnLayoutChangeListener { v: View?, left: Int,
top: Int, right: Int, bottom: Int, oldLeft: Int, oldTop:
Int, oldRight: Int, oldBottom: Int ->
val sourceRectHint = Rect()
mYourVideoView.getGlobalVisibleRect(sourceRectHint)
val builder = PictureInPictureParams.Builder()
.setSourceRectHint(sourceRectHint)
setPictureInPictureParams(builder.build())
}
mYourVideoView.addOnLayoutChangeListener(mOnLayoutChangeListener)
- عند الضرورة، يمكنك تعديل
sourceRectHintقبل أن يبدأ النظام في الانتقال إلى وضع الخروج. عندما يكون النظام على وشك الخروج من وضع PiP، يتم وضع هيكلية طرق العرض للنشاط في الإعدادات المقصودة (على سبيل المثال، ملء الشاشة). يمكن للتطبيق إرفاق مستمع لتغيير التنسيق بعرضه الجذر أو العرض المستهدف (مثل عرض مشغّل الفيديو) لرصد الحدث وتحديثsourceRectHintقبل بدء الحركة.
// Listener is called immediately after the user exits PiP but before animating.
playerView.addOnLayoutChangeListener { _, left, top, right, bottom,
oldLeft, oldTop, oldRight, oldBottom ->
if (left != oldLeft
|| right != oldRight
|| top != oldTop
|| bottom != oldBottom) {
// The playerView's bounds changed, update the source hint rect to
// reflect its new bounds.
val sourceRectHint = Rect()
playerView.getGlobalVisibleRect(sourceRectHint)
setPictureInPictureParams(
PictureInPictureParams.Builder()
.setSourceRectHint(sourceRectHint)
.build()
)
}
}
إيقاف تغيير الحجم بسلاسة للمحتوى غير الفيديو
يضيف الإصدار 12 من نظام التشغيل Android العلامة setSeamlessResizeEnabled التي توفّر تأثيرًا حركيًا أكثر سلاسة للتلاشي التدريجي عند تغيير حجم المحتوى غير الفيديو في نافذة "نافذة ضمن النافذة". في السابق، كان تغيير حجم المحتوى غير الفيديو في نافذة PiP قد يؤدي إلى ظهور
عناصر مرئية غير متناسقة.
لتفعيل ميزة تغيير الحجم بسلاسة لمحتوى الفيديو، اتّبِع الخطوات التالية:
setPictureInPictureParams(PictureInPictureParams.Builder()
.setSeamlessResizeEnabled(true)
.build())
التعامل مع واجهة المستخدم أثناء استخدام ميزة "نافذة ضمن النافذة"
عندما يدخل النشاط في وضع "نافذة ضمن النافذة" (PiP) أو يخرج منه، يستدعي النظام Activity.onPictureInPictureModeChanged() أو Fragment.onPictureInPictureModeChanged().
يقدّم Android 15 تغييرات تضمن انتقالاً أكثر سلاسة عند الدخول إلى وضع "نافذة ضمن النافذة". ويُعدّ ذلك مفيدًا للتطبيقات التي تتضمّن عناصر في واجهة المستخدم تظهر فوق واجهة المستخدم الرئيسية، والتي يتم عرضها في وضع "نافذة ضمن النافذة".
يستخدم المطوّرون دالة الاستدعاء onPictureInPictureModeChanged() لتحديد
المنطق الذي يبدّل مستوى ظهور عناصر واجهة المستخدم التي تظهر على الشاشة. يتم تشغيل دالة ردّ النداء هذه عند اكتمال حركة الدخول إلى وضع "نافذة ضمن النافذة" أو الخروج منه. اعتبارًا من الإصدار Android 15، تتضمّن فئة PictureInPictureUiState حالة جديدة.
من خلال حالة واجهة المستخدم الجديدة هذه، تلاحظ التطبيقات التي تستهدف Android 15 أنّه يتم استدعاء دالة الاستدعاء Activity#onPictureInPictureUiStateChanged() باستخدام isTransitioningToPip() فور بدء الصورة المتحركة لميزة "نافذة ضمن النافذة". هناك العديد من عناصر واجهة المستخدم التي لا تكون ذات صلة بالتطبيق عندما يكون في وضع "نافذة ضمن النافذة"، مثل طرق العرض أو التنسيق التي تتضمّن معلومات مثل الاقتراحات والفيديو القادم والتقييمات والعناوين. عندما ينتقل التطبيق إلى وضع "نافذة ضمن النافذة"، استخدِم دالة الاستدعاء onPictureInPictureUiStateChanged() لإخفاء هذه العناصر في واجهة المستخدم. عندما ينتقل التطبيق إلى وضع ملء الشاشة من نافذة PiP، استخدِم دالة الاستدعاء onPictureInPictureModeChanged() لإظهار هذه العناصر، كما هو موضّح في الأمثلة التالية:
override fun onPictureInPictureUiStateChanged(pipState: PictureInPictureUiState) {
if (pipState.isTransitioningToPip()) {
// Hide UI elements.
}
}
override fun onPictureInPictureModeChanged(
isInPictureInPictureMode: Boolean,
newConfig: Configuration
) {
super.onPictureInPictureModeChanged(isInPictureInPictureMode, newConfig)
if (!isInPictureInPictureMode) {
// Unhide UI elements.
}
}
يساعد هذا التبديل السريع لإظهار عناصر واجهة المستخدم غير ذات الصلة (لنافذة "نافذة ضمن النافذة") في ضمان سلاسة حركة الدخول إلى وضع "نافذة ضمن النافذة" وخلوّها من الوميض.
يمكنك تجاوز عمليات الاستدعاء هذه لإعادة رسم عناصر في واجهة المستخدم الخاصة بالنشاط. يُرجى العِلم أنّه في وضع "نافذة ضمن النافذة"، يظهر نشاطك في نافذة صغيرة. لا يمكن للمستخدمين التفاعل مع عناصر واجهة المستخدم في تطبيقك عندما يكون التطبيق في وضع "نافذة ضمن النافذة"، وقد يصعب رؤية تفاصيل عناصر واجهة المستخدم الصغيرة. أنشطة تشغيل الفيديو مع الحد الأدنى من واجهة المستخدم توفر أفضل تجربة للمستخدم.
إذا كان تطبيقك يحتاج إلى توفير إجراءات مخصّصة لميزة "نافذة ضمن النافذة"، يمكنك الاطّلاع على إضافة عناصر التحكّم في هذه الصفحة. أزِل العناصر الأخرى في واجهة المستخدم قبل أن يدخل نشاطك في وضع "نافذة ضمن النافذة" واستعِدها عندما يصبح نشاطك في وضع ملء الشاشة مرة أخرى.
إضافة عناصر تحكّم
يمكن أن تعرض نافذة PiP عناصر التحكّم عندما يفتح المستخدم قائمة النافذة (من خلال النقر على النافذة على جهاز جوّال أو اختيار القائمة من جهاز التحكّم عن بُعد في التلفزيون).
إذا كان التطبيق يتضمّن جلسة وسائط نشطة، ستظهر عناصر التحكّم في التشغيل والإيقاف المؤقت والتالي والسابق.
يمكنك أيضًا تحديد الإجراءات المخصّصة بشكل صريح من خلال إنشاء
PictureInPictureParams باستخدام
PictureInPictureParams.Builder.setActions() قبل الدخول في وضع "نافذة ضمن النافذة"،
وتمرير المَعلمات عند الدخول في وضع "نافذة ضمن النافذة" باستخدام
enterPictureInPictureMode(android.app.PictureInPictureParams) أو
setPictureInPictureParams(android.app.PictureInPictureParams). يُرجى توخّي الحذر. إذا حاولت إضافة أكثر من getMaxNumPictureInPictureActions()،
ستحصل على الحد الأقصى فقط.
مواصلة تشغيل الفيديو في وضع "نافذة ضمن النافذة"
عندما ينتقل نشاطك إلى وضع "نافذة ضمن النافذة"، يضع النظام النشاط في حالة الإيقاف المؤقت ويستدعي الإجراء onPause() الخاص بالنشاط. يجب ألا يتم إيقاف تشغيل الفيديو مؤقتًا، بل يجب أن يستمر تشغيله إذا تم إيقاف النشاط مؤقتًا أثناء الانتقال إلى وضع "نافذة ضمن النافذة".
في الإصدار 7.0 من نظام التشغيل Android (المستوى 24 من واجهة برمجة التطبيقات) والإصدارات الأحدث، يجب إيقاف تشغيل الفيديو مؤقتًا واستئنافه عندما يستدعي النظام onStop() وonStart() لنشاطك. بهذه الطريقة، يمكنك تجنُّب التحقّق مما إذا كان تطبيقك في وضع "نافذة ضمن النافذة" في onPause() ومواصلة التشغيل بشكل صريح.
إذا لم تضبط العلامة setAutoEnterEnabled على true وكنت بحاجة إلى إيقاف التشغيل مؤقتًا في تنفيذ onPause()، تحقَّق من وضع "نافذة ضمن النافذة" من خلال استدعاء isInPictureInPictureMode() والتعامل مع التشغيل بشكل مناسب. على سبيل المثال:
override fun onPause() {
super.onPause()
// If called while in PiP mode, don't pause playback.
if (isInPictureInPictureMode) {
// Continue playback.
} else {
// Use existing playback logic for paused activity behavior.
}
}
عندما ينتقل نشاطك من وضع PiP إلى وضع ملء الشاشة، يستأنف النظام نشاطك ويستدعي الإجراء onResume().
استخدام نشاط تشغيل واحد لوضع "نافذة ضمن النافذة"
في تطبيقك، قد يختار المستخدم فيديو جديدًا عند تصفّح المحتوى على الشاشة الرئيسية، بينما يكون نشاط تشغيل الفيديو في وضع PiP. شغِّل الفيديو الجديد في نشاط التشغيل الحالي في وضع ملء الشاشة، بدلاً من بدء نشاط جديد قد يربك المستخدم.
لضمان استخدام نشاط واحد لطلبات تشغيل الفيديو والتبديل
إلى وضع "نافذة ضمن النافذة" أو الخروج منه حسب الحاجة، اضبط السمة android:launchMode للنشاط على
singleTask في ملف البيان:
<activity android:name="VideoActivity"
...
android:supportsPictureInPicture="true"
android:launchMode="singleTask"
...
في نشاطك، يمكنك إلغاء onNewIntent() والتعامل مع الفيديو الجديد،
وإيقاف تشغيل أي فيديو حالي إذا لزم الأمر.
إتاحة ميزة "نافذة ضمن النافذة" لتطبيقات الكاميرا
لتفعيل ميزة "نافذة ضمن النافذة" لتطبيقات الكاميرا، يجب التأكّد من أنّ الكاميرا تظل نشطة في
وضع "نافذة ضمن النافذة" من خلال عدم إغلاق الكاميرا عند استدعاء onPause():
override fun onPause() {
super.onPause()
// Don't close the camera if the app is entering PiP mode
if (!isInPictureInPictureMode) {
closeCamera()
}
}
كما هو الحال مع حالات الاستخدام الأخرى، يمكنك إخفاء عناصر واجهة المستخدم غير الأساسية (مثل عناصر التحكّم والتراكبات)، وإضافة إجراءات مخصّصة للتحكّم في الكاميرا (على سبيل المثال، إيقاف التسجيل أو قلب الكاميرا).
احتساب sourceRectHint لضمان سلاسة الانتقال
يُعدّ توفير sourceRectHint دقيق يتضمّن إحداثيات الشاشة الدقيقة لعدسة الكاميرا أمرًا ضروريًا للحصول على تأثير دخول سلس. يمكنك الحصول على الحدود من طريقة عرض المعاينة باستخدام getGlobalVisibleRect() على النحو التالي:
val previewView = findViewById<View>(R.id.preview_view)
val globalRect = Rect()
// Ensure the view is laid out before calling getGlobalVisibleRect() to get valid screen coordinates.
previewView.getGlobalVisibleRect(globalRect)
val params = PictureInPictureParams.Builder()
.setSourceRectHint(globalRect)
.build()
setPictureInPictureParams(params)
اعتبارات أخرى
قد تكون ميزة "نافذة ضمن النافذة" غير مفعَّلة على الأجهزة التي تتضمّن ذاكرة وصول عشوائي (RAM) منخفضة. قبل أن يستخدم تطبيقك ميزة "نافذة ضمن النافذة"،
تأكَّد من توفّرها من خلال استدعاء
hasSystemFeature(PackageManager.FEATURE_PICTURE_IN_PICTURE).
تم تصميم ميزة "نافذة ضمن النافذة" للأنشطة التي تشغّل الفيديو في وضع ملء الشاشة. عند تبديل نشاطك إلى وضع "نافذة ضمن النافذة"، تجنَّب عرض أي شيء باستثناء محتوى الفيديو. تتبَّع وقت دخول نشاطك في وضع "نافذة ضمن النافذة" وأخفِ عناصر واجهة المستخدم، كما هو موضّح في التعامل مع واجهة المستخدم أثناء وضع "نافذة ضمن النافذة".
عندما يكون النشاط في وضع "نافذة ضمن النافذة"، لا يتم التركيز على الإدخال تلقائيًا. لتلقّي أحداث الإدخال أثناء استخدام وضع "نافذة ضمن النافذة"، استخدِم MediaSession.setCallback().
لمزيد من المعلومات حول استخدام setCallback()، يُرجى الاطّلاع على مقالة
عرض بطاقة "التعرّف التلقائي على الموسيقى".
عندما يكون تطبيقك في وضع PiP، يمكن أن يتسبب تشغيل الفيديو في نافذة PiP في حدوث تداخل صوتي مع تطبيق آخر، مثل تطبيق مشغّل الموسيقى أو تطبيق البحث الصوتي. لتجنّب ذلك، اطلب التركيز على الصوت عند بدء تشغيل الفيديو، وتعامل مع إشعارات تغيير التركيز على الصوت، كما هو موضّح في إدارة التركيز على الصوت. إذا تلقّيت إشعارًا بفقدان التركيز على الصوت في وضع "نافذة ضمن النافذة"، أوقِف تشغيل الفيديو مؤقتًا أو أوقِفه نهائيًا.
عندما يكون تطبيقك على وشك الدخول في وضع "نافذة ضمن النافذة"، يُرجى العِلم أنّ النشاط العلوي فقط هو الذي يدخل في هذا الوضع. في بعض الحالات، مثل الأجهزة المتعددة النوافذ، من الممكن أن يظهر النشاط الأساسي الآن ويصبح مرئيًا مرة أخرى إلى جانب نشاط "نافذة ضمن النافذة". يجب التعامل مع هذه الحالة وفقًا لذلك، بما في ذلك
النشاط الأساسي الذي يتلقّى ردّ اتصال onResume() أو onPause().
ومن الممكن أيضًا أن يتفاعل المستخدم مع النشاط.
على سبيل المثال، إذا كان لديك نشاط قائمة فيديوهات معروض ونشاط تشغيل الفيديو في وضع "نافذة ضمن النافذة"، قد يختار المستخدم فيديو جديدًا من القائمة ويجب تعديل نشاط "نافذة ضمن النافذة" وفقًا لذلك.
رمز نموذجي إضافي
لتنزيل نموذج تطبيق مكتوب بلغة Kotlin، يُرجى الاطّلاع على نموذج PictureInPicture على Android (Kotlin).