برنامه شما نباید در شرایط زیر وارد حالت 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 = Runnable { 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)