در برچسب فعالیت فایل AndroidManifest.xml، موارد زیر را انجام دهید:
supportsPictureInPictureرا اضافه کنید و آن را رویtrueتنظیم کنید تا اعلام کنید که از تصویردرتصویر (PiP) در برنامهتان استفاده خواهید کرد.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") }
افزودن PiP در برنامه خروج برای نسخههای قبلاز Android 12
برای افزودن PiP برای نسخههای قبلاز Android 12، از addOnUserLeaveHintProvider استفاده کنید. برای افزودن PiP در نسخههای قبلاز Android 12، این مراحل را دنبال کنید:
- یک دروازه نسخه اضافه کنید تا این کد فقط در نسخههای O تا R قابلدسترسی باشد.
- از
DisposableEffectباContextبهعنوان کلید استفاده کنید. - در
DisposableEffect، رفتار را برای زمانی کهonUserLeaveHintProviderبااستفاده از لامبدا راهاندازی میشود تعریف کنید. در lambda،enterPictureInPictureMode()را درfindActivity()فراخوانی کنید وPictureInPictureParams.Builder().build()را وارد کنید. addOnUserLeaveHintListenerرا بااستفاده ازfindActivity()اضافه کنید و در lambda ارسال کنید.- در
onDispose،removeOnUserLeaveHintListenerرا بااستفاده ازfindActivity()اضافه کنید و لامبدا را ارسال کنید.
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") }
افزودن PiP در برنامه خروج برای نسخههای بعداز Android 12
پساز Android 12، PictureInPictureParams.Builder ازطریق اصلاحکنندهای که به پخشکننده ویدیو برنامه ارسال میشود اضافه میشود.
modifierایجاد کنید وonGloballyPositionedرا در آن فراخوانی کنید. مختصات چیدمان در مرحله بعدی استفاده خواهد شد.- متغیری برای
PictureInPictureParams.Builder()ایجاد کنید. - یک عبارت
ifاضافه کنید تا بررسی شود که آیا کیت توسعه نرمافزار 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.