PiP را در زمان های صحیح وارد کنید

برنامه شما نباید در شرایط زیر وارد حالت PiP شود:

  • اگر ویدیو متوقف یا متوقف شود.
  • اگر در صفحه ای متفاوت از برنامه پخش کننده ویدیو هستید.

برای کنترل زمانی که برنامه شما وارد حالت PiP می شود، متغیری اضافه کنید که وضعیت پخش کننده ویدیو را با استفاده از mutableStateOf ردیابی کند.

وضعیت را بر اساس پخش ویدیو تغییر دهید

برای تغییر وضعیت بر اساس اینکه پخش کننده ویدیو در حال پخش است، یک شنونده در پخش کننده ویدیو اضافه کنید. وضعیت متغیر حالت خود را بر اساس اینکه بازیکن بازی می کند یا نه تغییر دهید:

player.addListener(object : Player.Listener {
    override fun onIsPlayingChanged(isPlaying: Boolean) {
        shouldEnterPipMode = isPlaying
    }
})

وضعیت را بر اساس آزاد شدن بازیکن تغییر دهید

وقتی پخش کننده آزاد شد، متغیر حالت خود را روی false قرار دهید:

fun releasePlayer() {
    shouldEnterPipMode = false
}

استفاده از حالت برای تعیین اینکه آیا حالت PiP وارد شده است (قبل از اندروید 12)

  1. از آنجایی که افزودن PiP pre-12 از یک DisposableEffect استفاده می‌کند، باید یک متغیر جدید توسط rememberUpdatedState با newValue مجموعه‌ای به‌عنوان متغیر حالت ایجاد کنید. این اطمینان حاصل می کند که نسخه به روز شده در DisposableEffect استفاده می شود.
  2. در لامبدا که رفتار را هنگام راه‌اندازی 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 قابل مشاهده است را نشان دهید.

  1. فقط در صورتی که حالت تعریف می کند که برنامه باید وارد حالت PiP شود، setSourceRectHint() را به builder اضافه کنید. این از محاسبه sourceRect در زمانی که برنامه نیازی به وارد کردن PiP ندارد جلوگیری می کند.
  2. برای تنظیم مقدار sourceRect ، از layoutCoordinates که از تابع onGloballyPositioned در اصلاح کننده داده شده است استفاده کنید.
  3. 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)