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
DisposableEffect
kullanıldığı içinnewValue
durum değişkeniniz olarak ayarlayarakrememberUpdatedState
ile yeni bir değişken oluşturmanız gerekir. Bu işlem, güncellenmiş sürümünDisposableEffect
içinde kullanılmasını sağlar. OnUserLeaveHintListener
tetiklendiğinde davranışı tanımlayan lambda'ya,enterPictureInPictureMode()
çağrısının etrafına durum değişkenini içeren birif
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: () -> Unit = { 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ğerinibuilder
değerine yalnızca uygulamanın PiP moduna girmesini tanımlayan durum varsa ekleyin. Bu sayede, uygulamanın PiP'ye girmesi gerekmediğindesourceRect
hesaplanması önlenir.sourceRect
değerini ayarlamak için değiştiricidekionGloballyPositioned
işlevinden verilenlayoutCoordinates
değerini kullanın.builder
üzerindesetSourceRectHint()
işlevini çağırın vesourceRect
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)