PiP'yi doğru zamanlarda girme

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

  • Video durdurulmuş veya duraklatılmışsa
  • 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.

Video oynatılıp oynatılmadığına bağlı olarak durumu değiştirme

Durumu, video oynatıcının oynatılıp oynatılmadığına göre değiştirmek için video oynatıcıya bir dinleyici ekleyin. Oyuncunun oynayıp oynamadığına göre durum değişkeninizin durumunu değiştirin:

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

Oyuncunun serbest bırakılıp bırakılmadığına bağlı olarak 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 kullanma (Android 12 öncesi)

  1. 12'den önceki sürümlerde PiP eklemek için DisposableEffect kullanıldığından, newValue durum değişkeniniz olarak ayarlanmış şekilde rememberUpdatedState ile yeni bir değişken oluşturmanız gerekir. Bu işlem, güncellenen sürümün DisposableEffect içinde kullanılmasını sağlar.
  2. OnUserLeaveHintListener tetiklendiğinde davranışı tanımlayan lambda'da, enterPictureInPictureMode() çağrısı etrafına durum değişkeniyle birlikte 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 kullanma (Android 12 ve sonraki sürümler)

Uygulamanızın yalnızca doğru zamanda PiP moduna girmesi için durum değişkeninizi setAutoEnterEnabled içine 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)

Akıcı bir animasyon için setSourceRectHint kullanın

setSourceRectHint API, 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. Bu API'yi PiP oluşturucuya ekleyerek PiP'ye geçişin ardından görünür olan etkinlik alanını belirtin.

  1. Yalnızca eyalet, uygulamanın PiP moduna girmesi gerektiğini tanımlıyorsa setSourceRectHint() özelliğini builder özelliğine ekleyin. Bu sayede, uygulamanın PiP moduna girmesi gerekmediğinde sourceRect hesaplanmaz.
  2. sourceRect değerini ayarlamak için değiştiricideki onGloballyPositioned işlevinden verilen layoutCoordinates değerlerini kullanın.
  3. builder üzerinde setSourceRectHint() işlevini ç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)