در زمان‌های درست وارد «تصویردرتصویر» شوید

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

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

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

تغییر وضعیت براساس اینکه ویدیو درحال پخش است یا نه

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

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

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

وقتی پخش‌کننده منتشر شد، متغیر وضعیت خود را روی false تنظیم کنید:

fun releasePlayer() {
    shouldEnterPipMode = false
}

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

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

  1. فقط درصورتی 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)