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