แอปไม่ควรเข้าสู่โหมด PiP ในสถานการณ์ต่อไปนี้
- หากวิดีโอหยุดหรือหยุดชั่วคราว
- หากคุณอยู่ในหน้าอื่นของแอปที่ไม่ใช่วิดีโอเพลเยอร์
หากต้องการควบคุมเวลาที่แอปเข้าสู่โหมด PiP ให้เพิ่มตัวแปรที่ติดตามสถานะของวิดีโอเพลเยอร์โดยใช้ mutableStateOf
สลับสถานะตามการเล่นวิดีโอ
หากต้องการสลับสถานะตามการเล่นของวิดีโอเพลเยอร์ ให้เพิ่ม Listener ในวิดีโอเพลเยอร์ สลับสถานะของตัวแปรสถานะตามสถานะการเล่นของผู้เล่น ดังนี้
player.addListener(object : Player.Listener { override fun onIsPlayingChanged(isPlaying: Boolean) { shouldEnterPipMode = isPlaying } })
สลับสถานะตามการปล่อยเพลเยอร์
เมื่อปล่อยเพลเยอร์แล้ว ให้ตั้งค่าตัวแปรสถานะเป็น false ดังนี้
fun releasePlayer() { shouldEnterPipMode = false }
ใช้สถานะเพื่อกำหนดว่าเข้าสู่โหมด PiP หรือไม่ (Android เวอร์ชันก่อน 12)
- เนื่องจากการเพิ่ม PiP ก่อนเวอร์ชัน 12 จะใช้
DisposableEffectคุณจึงต้องสร้างตัวแปรใหม่โดยrememberUpdatedStateโดยตั้งค่าnewValueเป็นตัวแปรสถานะ ซึ่งจะช่วยให้มั่นใจได้ว่าระบบจะใช้เวอร์ชันที่อัปเดตภายในDisposableEffect ใน Lambda ที่กำหนดลักษณะการทำงานเมื่อมีการทริกเกอร์
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 ด้วย
เพิ่ม API นี้ลงในเครื่องมือสร้าง PiP เพื่อระบุพื้นที่ของกิจกรรมที่มองเห็นได้หลังจากการเปลี่ยนเป็น PiP
- เพิ่ม
setSourceRectHint()ลงในbuilderเฉพาะในกรณีที่สถานะกำหนดว่าแอปควรเข้าสู่โหมด PiP ซึ่งจะช่วยหลีกเลี่ยงการคำนวณsourceRectเมื่อแอปไม่จำเป็นต้องเข้าสู่โหมด PIP - หากต้องการตั้งค่า
sourceRectให้ใช้layoutCoordinatesที่ได้จากฟังก์ชันonGloballyPositionedในตัวแก้ไข - เรียกใช้
setSourceRectHint()ในbuilderและส่งตัวแปร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)