PiP'yi doğru zamanlarda girme

Uygulamanız aşağıdaki durumlarda PiP moduna girmemelidir:

  • Videonun durdurulup durdurulmadığı veya duraklatılıp duraklatılmadığı
  • Uygulamanın video oynatıcıdan farklı bir sayfasındaysanız.

Uygulamanızın PiP moduna ne zaman gireceğini kontrol etmek için mutableStateOf kullanarak video oynatıcının durumunu izleyen bir değişken ekleyin.

Videonun oynatılıp oynatılmadığına göre durumu değiştirme

Video oynatıcının oynatıp oynatmadığına göre durumu değiştirmek için video oynatıcıya bir dinleyici ekleyin. Durum değişkeninizin durumunu, oyuncunun oynayıp oynamadığına göre değiştirin:

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

Oynatıcının yayınlanıp yayınlanmadığına göre durumu değiştirme

Oynatıcı serbest bırakıldığında durum değişkeninizi false olarak ayarlayın:

fun releasePlayer() {
    shouldEnterPipMode = false
}

PiP moduna girilip girilmediğini tanımlamak için durumu kullanın (Android 12 öncesi)

  1. PiP pre-12 eklemek için DisposableEffect kullanıldığından, durum değişkeniniz olarak newValue ayarlanmış şekilde rememberUpdatedState ile yeni bir değişken oluşturmanız gerekir. Bu sayede, güncellenen sürüm DisposableEffect içinde kullanılır.
  2. OnUserLeaveHintListener tetiklendiğinde davranışın nasıl olacağını tanımlayan lambda'da, enterPictureInPictureMode() çağrısının etrafına durum değişkenini içeren bir if ifadesi ekleyin:

    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 moduna girilip girilmediğini tanımlamak için durumu kullanın (Android 12 sonrası)

Uygulamanızın yalnızca doğru zamanda PiP moduna girmesi için durum değişkeninizi setAutoEnterEnabled öğesine iletin:

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)

Sorunsuz bir animasyon için setSourceRectHint kullanın.

setSourceRectHint API'si, PiP moduna girerken daha akıcı bir animasyon oluşturur. Android 12 ve sonraki sürümlerde, PiP modundan çıkarken daha akıcı bir animasyon da oluşturur. PiP'ye geçişten sonra etkinliğin görünür olan alanını belirtmek için bu API'yi PiP oluşturucuya ekleyin.

  1. setSourceRectHint() öğesini builder öğesine yalnızca durum, uygulamanın PiP moduna girmesi gerektiğini tanımlıyorsa ekleyin. Bu sayede, uygulamanın PiP'ye girmesi gerekmediğinde sourceRect hesaplanmaz.
  2. sourceRect değerini ayarlamak için değiştiricideki onGloballyPositioned işlevinden verilen layoutCoordinates değerini kullanın.
  3. builder üzerinde setSourceRectHint() yöntemini çağırın ve sourceRect değişkenini iletin.

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)