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 ne zaman PiP moduna 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ılmamasına göre durumu değiştirme
Durumu, video oynatıcının oynayıp oynamadığına göre 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 } })
Oyuncu serbest bırakılıp bırakılmadığına bağlı olarak durumu değiştirin
Oyuncu 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 durum özelliğini kullanın (Android 12 öncesi)
- 12'den önceki sürümlerde PiP eklemek için
DisposableEffectkullanıldığı içinnewValuedurum değişkeniniz olarak ayarlayarakrememberUpdatedStateile yeni bir değişken oluşturmanız gerekir. Bu işlem, güncellenmiş sürümünDisposableEffectiçinde kullanılmasını sağlar. OnUserLeaveHintListenertetiklendiğinde davranışı tanımlayan lambda'ya,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 durum bilgisini kullanma (Android 12'den sonra)
Uygulamanızın yalnızca doğru zamanda PiP moduna girmesi için durum değişkeninizi setAutoEnterEnabled içine aktarın:
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 uygulamak için setSourceRectHint simgesini kullanın
setSourceRectHint API, PiP moduna geçiş için daha akıcı bir animasyon oluşturur. Android 12 ve sonraki sürümlerde, PiP modundan çıkmak için daha akıcı bir animasyon da oluşturur.
PiP'ye geçişten sonra etkinliğin görünür alanını belirtmek için bu API'yi PiP oluşturucuya ekleyin.
setSourceRectHint()değerinibuilderdeğerine yalnızca uygulamanın PiP moduna girmesini tanımlayan durum varsa ekleyin. Bu sayede, uygulamanın PiP'ye girmesi gerekmediğindesourceRecthesaplanması önlenir.sourceRectdeğerini ayarlamak için değiştiricidekionGloballyPositionedişlevinden verilenlayoutCoordinatesdeğerini 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)