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

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

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

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

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

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

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

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

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

fun releasePlayer() {
    shouldEnterPipMode = false
}

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

  1. ازآنجایی‌که افزودن «تصویردرتصویر» در نسخه‌های قبل‌از ۱۲ از 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")
    }

از وضعیت برای تعریف اینکه آیا حالت «تصویردرتصویر» وارد شده است یا نه (پس‌از Android 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 پویانمایی روان‌تری برای ورود به حالت «تصویردرتصویر» ایجاد می‌کند. در Android 12 و نسخه‌های بالاتر، این ویژگی پویانمایی روان‌تری برای خروج از حالت «تصویردرتصویر» ایجاد می‌کند. این API را به سازنده PiP اضافه کنید تا ناحیه فعالیت را که پس‌از انتقال به PiP قابل‌مشاهده است نشان دهید.

  1. فقط درصورتی setSourceRectHint() را به builder اضافه کنید که وضعیت تعریف کند برنامه باید وارد حالت «تصویردرتصویر» شود. این کار از محاسبه sourceRect زمانی که برنامه نیازی به ورود به حالت «تصویردرتصویر» ندارد جلوگیری می‌کند.
  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)