সঠিক সময়ে PiP লিখুন

নিম্নলিখিত পরিস্থিতিতে আপনার অ্যাপের PiP মোডে প্রবেশ করা উচিত নয়:

  • ভিডিও বন্ধ বা পজ করা হলে।
  • আপনি যদি ভিডিও প্লেয়ারের চেয়ে অ্যাপের অন্য পৃষ্ঠায় থাকেন।

আপনার অ্যাপ কখন PiP মোডে প্রবেশ করে তা নিয়ন্ত্রণ করতে, একটি পরিবর্তনশীল যোগ করুন যা একটি mutableStateOf ব্যবহার করে ভিডিও প্লেয়ারের অবস্থা ট্র্যাক করে।

ভিডিও চলছে কিনা তার উপর ভিত্তি করে স্থিতি টগল করুন

ভিডিও প্লেয়ার বাজছে কিনা তার উপর ভিত্তি করে স্থিতি টগল করতে, ভিডিও প্লেয়ারে একজন শ্রোতা যোগ করুন। প্লেয়ার খেলছে কি না তার উপর ভিত্তি করে আপনার স্টেট ভেরিয়েবলের অবস্থা টগল করুন:

player.addListener(object : Player.Listener {
    override fun onIsPlayingChanged(isPlaying: Boolean) {
        shouldEnterPipMode = isPlaying
    }
})

প্লেয়ার রিলিজ হয়েছে কিনা তার উপর ভিত্তি করে টগল স্টেট

প্লেয়ার রিলিজ হলে, আপনার স্টেট ভেরিয়েবলকে false সেট করুন:

fun releasePlayer() {
    shouldEnterPipMode = false
}

PiP মোড প্রবেশ করা হয়েছে কিনা তা নির্ধারণ করতে রাজ্য ব্যবহার করুন (প্রি-অ্যান্ড্রয়েড 12)

  1. যেহেতু PiP প্রি-12 যোগ করার জন্য একটি DisposableEffect ব্যবহার করা হয়, তাই আপনাকে আপনার স্টেট ভেরিয়েবল হিসাবে newValue সেট করে rememberUpdatedState দ্বারা একটি নতুন ভেরিয়েবল তৈরি করতে হবে। এটি নিশ্চিত করবে যে আপডেট করা সংস্করণটি DisposableEffect মধ্যে ব্যবহার করা হয়েছে।
  2. যখন 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")
    }

PiP মোড প্রবেশ করা হয়েছে কিনা তা নির্ধারণ করতে রাষ্ট্র ব্যবহার করুন (অ্যান্ড্রয়েড 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 যোগ করুন।

  1. শুধুমাত্র builder setSourceRectHint() যোগ করুন যদি রাজ্য সংজ্ঞায়িত করে যে অ্যাপটি PiP মোডে প্রবেশ করবে। যখন অ্যাপটিকে PiP-এ প্রবেশ করার প্রয়োজন হয় না তখন এটি sourceRect গণনা করা এড়িয়ে যায়।
  2. sourceRect মান সেট করতে, মডিফায়ারে onGloballyPositioned ফাংশন থেকে দেওয়া layoutCoordinates ব্যবহার করুন।
  3. 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)