برنامه شما نباید در شرایط زیر وارد حالت PiP شود:
- اگر ویدیو متوقف یا متوقف شود.
- اگر در صفحه ای متفاوت از برنامه پخش کننده ویدیو هستید.
برای کنترل زمانی که برنامه شما وارد حالت PiP می شود، متغیری اضافه کنید که وضعیت پخش کننده ویدیو را با استفاده از mutableStateOf
ردیابی کند.
وضعیت را بر اساس پخش ویدیو تغییر دهید
برای تغییر وضعیت بر اساس اینکه پخش کننده ویدیو در حال پخش است، یک شنونده در پخش کننده ویدیو اضافه کنید. وضعیت متغیر حالت خود را بر اساس اینکه بازیکن بازی می کند یا نه تغییر دهید:
player.addListener(object : Player.Listener { override fun onIsPlayingChanged(isPlaying: Boolean) { shouldEnterPipMode = isPlaying } })
وضعیت را بر اساس آزاد شدن بازیکن تغییر دهید
وقتی پخش کننده آزاد شد، متغیر حالت خود را روی false
قرار دهید:
fun releasePlayer() { shouldEnterPipMode = false }
استفاده از حالت برای تعیین اینکه آیا حالت PiP وارد شده است (قبل از اندروید 12)
- از آنجایی که افزودن PiP pre-12 از یک
DisposableEffect
استفاده میکند، باید یک متغیر جدید توسطrememberUpdatedState
باnewValue
مجموعهای بهعنوان متغیر حالت ایجاد کنید. این اطمینان حاصل می کند که نسخه به روز شده درDisposableEffect
استفاده می شود. در لامبدا که رفتار را هنگام راهاندازی
OnUserLeaveHintListener
تعریف میکند، یک دستورif
با متغیر state در اطراف فراخوانی به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") }
استفاده از حالت برای تعیین اینکه آیا حالت PiP وارد شده است (پس از اندروید 12)
متغیر حالت خود را به 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
API یک انیمیشن روانتر برای ورود به حالت PiP ایجاد میکند. در Android 12+، همچنین انیمیشن روان تری برای خروج از حالت PiP ایجاد می کند. این API را به سازنده PiP اضافه کنید تا ناحیه فعالیتی که پس از انتقال به PiP قابل مشاهده است را نشان دهید.
- فقط در صورتی که حالت تعریف می کند که برنامه باید وارد حالت PiP شود،
setSourceRectHint()
را بهbuilder
اضافه کنید. این از محاسبهsourceRect
در زمانی که برنامه نیازی به وارد کردن PiP ندارد جلوگیری می کند. - برای تنظیم مقدار
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)