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