নিম্নলিখিত পরিস্থিতিগুলিতে আপনার অ্যাপের PiP মোডে প্রবেশ করা উচিত নয়:
- যদি ভিডিওটি থামানো বা বিরতি দেওয়া হয়।
- আপনি যদি ভিডিও প্লেয়ার থেকে অ্যাপের অন্য কোনো পৃষ্ঠায় থাকেন।
আপনার অ্যাপ কখন PiP মোডে প্রবেশ করবে তা নিয়ন্ত্রণ করতে, mutableStateOf ব্যবহার করে ভিডিও প্লেয়ারের অবস্থা ট্র্যাক করার জন্য একটি ভেরিয়েবল যোগ করুন।
ভিডিও চলছে কিনা তার উপর ভিত্তি করে অবস্থা পরিবর্তন করুন।
ভিডিও প্লেয়ারটি চলছে কি না তার উপর ভিত্তি করে স্টেট টগল করতে, ভিডিও প্লেয়ারটিতে একটি লিসেনার যোগ করুন। প্লেয়ারটি চলছে কি না তার উপর ভিত্তি করে আপনার স্টেট ভ্যারিয়েবলের অবস্থা টগল করুন:
player.addListener(object : Player.Listener { override fun onIsPlayingChanged(isPlaying: Boolean) { shouldEnterPipMode = isPlaying } })
প্লেয়ার ছেড়ে দেওয়া হলে অবস্থা পরিবর্তন করুন।
যখন প্লেয়ারটি ছেড়ে দেওয়া হয়, তখন আপনার স্টেট ভেরিয়েবলটির মান false সেট করুন:
fun releasePlayer() { shouldEnterPipMode = false }
PiP মোডে প্রবেশ করা হয়েছে কিনা তা নির্ধারণ করতে স্টেট ব্যবহার করুন (অ্যান্ড্রয়েড ১২-এর পূর্ববর্তী সংস্করণ)
- যেহেতু 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 মোডে প্রবেশ করা হয়েছে কিনা তা নির্ধারণ করতে স্টেট ব্যবহার করুন (অ্যান্ড্রয়েড ১২-এর পরে)।
আপনার স্টেট ভেরিয়েবলটি 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 মোডে প্রবেশ করবে। এর ফলে, যখন অ্যাপটির PiP মোডে প্রবেশ করার প্রয়োজন হয় না, তখনsourceRectগণনা করা এড়ানো যায়। -
sourceRectমান নির্ধারণ করতে, মডিফায়ারেরonGloballyPositionedফাংশন থেকে প্রাপ্তlayoutCoordinatesব্যবহার করুন। -
buildersetSourceRectHint()কল করুন এবং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)