নিম্নলিখিত পরিস্থিতিতে আপনার অ্যাপ PiP মোডে প্রবেশ করা উচিত নয়:
- ভিডিও বন্ধ বা পজ করা থাকলে।
- আপনি যদি ভিডিও প্লেয়ারের পরিবর্তে অ্যাপের অন্য কোনও পৃষ্ঠায় থাকেন।
আপনার অ্যাপ কখন PiP মোডে প্রবেশ করবে তা কন্ট্রোল করতে, এমন একটি ভেরিয়েবল যোগ করুন যা mutableStateOf ব্যবহার করে ভিডিও প্লেয়ারের স্টেট
ট্র্যাক করে।
ভিডিও চলছে কিনা তার উপর ভিত্তি করে টগল করা
ভিডিও প্লেয়ার চলছে কিনা তার উপর ভিত্তি করে স্ট্যাটাস টগল করতে, ভিডিও প্লেয়ারে একটি লিসনার যোগ করুন। প্লেয়ার চলছে কিনা তার উপর ভিত্তি করে আপনার স্টেট ভেরিয়েবলের স্টেট টগল করুন:
player.addListener(object : Player.Listener { override fun onIsPlayingChanged(isPlaying: Boolean) { shouldEnterPipMode = isPlaying } })
প্লেয়ার রিলিজ করা হয়েছে কিনা তার উপর ভিত্তি করে টগল করা
প্লেয়ার রিলিজ করা হলে, আপনার স্টেট ভেরিয়েবলকে false হিসেবে সেট করুন:
fun releasePlayer() { shouldEnterPipMode = false }
PiP মোড চালু করা হয়েছে কিনা তা নির্ধারণ করতে স্টেট ব্যবহার করুন (Android 12-এর আগের ভার্সন)
- PiP প্রি-১২ যোগ করার জন্য
DisposableEffectব্যবহার করা হয়, তাই আপনাকেrememberUpdatedState-এর মাধ্যমে একটি নতুন ভেরিয়েবল তৈরি করতে হবে, যারnewValueআপনার স্টেট ভেরিয়েবল হিসেবে সেট করা থাকবে। এর ফলে নিশ্চিত হওয়া যাবে যেDisposableEffect-এর মধ্যে আপডেট করা ভার্সন ব্যবহার করা হচ্ছে। OnUserLeaveHintListenerট্রিগার করা হলে যে ল্যাম্বডা আচরণ নির্ধারণ করে, তার মধ্যেifস্টেটমেন্ট যোগ করুন। এই স্টেটমেন্টে,enterPictureInPictureMode()-এ কল করার সময় স্টেট ভেরিয়েবল ব্যবহার করুন: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-তে ট্রানজিশনের পরে অ্যাক্টিভিটির যে অংশটি দেখা যাবে তা বোঝাতে
PiP বিল্ডারে এই API যোগ করুন।
setSourceRectHint()শুধুমাত্র তখনইbuilder-এ যোগ করুন, যদি স্টেট থেকে বোঝা যায় যে অ্যাপকে 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)