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