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)
- 12'den önceki sürümlerde PiP eklemek için
DisposableEffectkullanıldığından,newValuedurum değişkeniniz olarak ayarlanmış şekilderememberUpdatedStateile yeni bir değişken oluşturmanız gerekir. Bu işlem, güncellenen sürümünDisposableEffectiçinde kullanılmasını sağlar. OnUserLeaveHintListenertetiklendiğinde davranışı tanımlayan lambda'da,enterPictureInPictureMode()çağrısı etrafına durum değişkeniyle birlikte birififadesi 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.
- Yalnızca eyalet, uygulamanın PiP moduna girmesi gerektiğini tanımlıyorsa
setSourceRectHint()özelliğinibuilderözelliğine ekleyin. Bu sayede, uygulamanın PiP moduna girmesi gerekmediğindesourceRecthesaplanmaz. sourceRectdeğerini ayarlamak için değiştiricidekionGloballyPositionedişlevinden verilenlayoutCoordinatesdeğerlerini kullanın.builderüzerindesetSourceRectHint()işlevini çağırın vesourceRectdeğ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)