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)
- PiP pre-12 eklemek için
DisposableEffectkullanıldığından, durum değişkeniniz olaraknewValueayarlanmış şekilderememberUpdatedStateile yeni bir değişken oluşturmanız gerekir. Bu sayede, güncellenen sürümDisposableEffectiçinde kullanılır. OnUserLeaveHintListenertetiklendiğ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 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 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.
setSourceRectHint()öğesinibuilderöğesine yalnızca durum, uygulamanın PiP moduna girmesi gerektiğini tanımlıyorsa ekleyin. Bu sayede, uygulamanın PiP'ye girmesi gerekmediğindesourceRecthesaplanmaz.sourceRectdeğerini ayarlamak için değiştiricidekionGloballyPositionedişlevinden verilenlayoutCoordinatesdeğerini kullanın.builderüzerindesetSourceRectHint()yöntemini ç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)