इन स्थितियों में, आपका ऐप्लिकेशन PiP मोड में नहीं जाना चाहिए:
- अगर वीडियो रोका गया हो या उसे पॉज़ किया गया हो.
- अगर आप वीडियो प्लेयर के अलावा, ऐप्लिकेशन के किसी दूसरे पेज पर हों.
यह कंट्रोल करने के लिए कि आपका ऐप्लिकेशन कब PiP मोड में जाए, एक वैरिएबल जोड़ें. यह वैरिएबल, वीडियो प्लेयर की स्थिति को ट्रैक करता है. इसके लिए, mutableStateOfका इस्तेमाल करें.
वीडियो चल रहा है या नहीं, इसके आधार पर स्थिति को टॉगल करना
वीडियो प्लेयर चल रहा है या नहीं, इसके आधार पर स्थिति को टॉगल करने के लिए, वीडियो प्लेयर पर एक लिसनर जोड़ें. प्लेयर चल रहा है या नहीं, इसके आधार पर अपने स्टेट वैरिएबल की स्थिति को टॉगल करें:
player.addListener(object : Player.Listener { override fun onIsPlayingChanged(isPlaying: Boolean) { shouldEnterPipMode = isPlaying } })
प्लेयर रिलीज़ किया गया है या नहीं, इसके आधार पर स्थिति को टॉगल करना
प्लेयर रिलीज़ होने पर, अपने स्टेट वैरिएबल को false पर सेट करें:
fun releasePlayer() { shouldEnterPipMode = false }
यह तय करने के लिए कि PiP मोड में कब जाना है, स्टेट का इस्तेमाल करना (Android 12 से पहले के वर्शन के लिए)
- Android 12 से पहले के वर्शन में PiP मोड जोड़ने के लिए,
DisposableEffectका इस्तेमाल किया जाता है. इसलिए, आपकोrememberUpdatedStateका इस्तेमाल करके एक नया वैरिएबल बनाना होगा. इसमेंnewValueको अपने स्टेट वैरिएबल के तौर पर सेट करना होगा. इससे यह पक्का होगा किDisposableEffectमें अपडेट किया गया वर्शन इस्तेमाल किया जाए. OnUserLeaveHintListenerट्रिगर होने पर, व्यवहार तय करने वाले लैम्डा में,enterPictureInPictureMode()पर कॉल के आस-पास स्टेट वैरिएबल के साथ एकifस्टेटमेंट जोड़ें: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 मोड में कब जाना है, स्टेट का इस्तेमाल करना (Android 12 और इसके बाद के वर्शन के लिए)
setAutoEnterEnabled में अपना स्टेट वैरिएबल पास करें, ताकि आपका ऐप्लिकेशन सिर्फ़ सही समय पर PiP मोड में जाए:
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)
स्मूद ऐनिमेशन के लिए, setSourceRectHint का इस्तेमाल करना
setSourceRectHint API की मदद से, PiP
मोड में जाने के लिए ज़्यादा स्मूद ऐनिमेशन बनाया जा सकता है. Android 12 और इसके बाद के वर्शन में, इससे PiP मोड से बाहर निकलने के लिए भी ज़्यादा स्मूद ऐनिमेशन बनाया जा सकता है.
PiP बिल्डर में यह API जोड़ें, ताकि यह बताया जा सके कि PiP मोड में ट्रांज़िशन के बाद, गतिविधि का कौनसा हिस्सा दिखता है.
builderमें सिर्फ़ तबsetSourceRectHint()जोड़ें, जब स्टेट से यह पता चलता हो कि ऐप्लिकेशन को PiP मोड में जाना चाहिए. इससे,sourceRectकी वैल्यू तब कैलकुलेट नहीं करनी पड़ती, जब ऐप्लिकेशन को PiP मोड में जाने की ज़रूरत नहीं होती.sourceRectकी वैल्यू सेट करने के लिए,layoutCoordinatesका इस्तेमाल करें. ये वैल्यू, मॉडिफ़ायर पर मौजूदonGloballyPositionedफ़ंक्शन से मिलती हैं.builderपरsetSourceRectHint()को कॉल करें और इसमेंsourceRectवैरिएबल पास करें.
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)