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