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

برنامه شما نباید در شرایط زیر وارد حالت 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 (قبل از اندروید ۱۲)

  1. از آنجایی که اضافه کردن PiP نسخه قبل از ۱۲ از DisposableEffect استفاده می‌کند، باید یک متغیر جدید با rememberUpdatedState ایجاد کنید و newValue را به عنوان متغیر state خود تنظیم کنید. این کار تضمین می‌کند که نسخه به‌روزرسانی‌شده در 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 = 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 قابل مشاهده است را نشان دهد.

  1. فقط در صورتی که state تعریف کند که برنامه باید وارد حالت 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)