Android 14 (API ระดับ 34) มีการปรับปรุง API การแสดง ภาพซ้อนภาพ (PiP) บางอย่างเพื่อให้รองรับการทำงานแบบมัลติทาสก์ แม้ว่าเราจะเปิดตัวการรองรับ PiP ใน Android 8.0 (API ระดับ 26) แต่ฟีเจอร์นี้ไม่ได้รับการรองรับอย่างกว้างขวางใน Android TV และไม่ได้รับการรองรับเลยใน Google TV ก่อน Android 13 การทำงานแบบมัลติทาสก์สำหรับทีวีใช้โหมด PiP เพื่อให้แอป 2 แอปแยกกันทำงานร่วมกันบนหน้าจอได้ โดยแอปหนึ่งทำงานแบบเต็มหน้าจอ และอีกแอปทำงานในโหมด PiP แอปที่ทำงานในโหมดใดโหมดหนึ่งเหล่านี้จะมีข้อกำหนดที่แตกต่างกัน
ลักษณะการทำงานเริ่มต้นคือแอป PiP จะซ้อนทับแอปแบบเต็มหน้าจอ นี่คือ ลักษณะการทำงานที่คล้ายกับลักษณะการทำงานของการแสดงภาพซ้อนภาพมาตรฐานของ Android
โปรดทราบว่าเมื่อผสานรวมการทำงานแบบมัลติทาสก์ แอปพลิเคชันของคุณต้องประกาศประเภทการใช้งานตามหลักเกณฑ์ด้านคุณภาพของแอป TV
เรียกใช้แอปในโหมด PiP
สำหรับอุปกรณ์ TV ที่ใช้ Android 14 (API ระดับ 34) ขึ้นไป ให้เรียกใช้แอปในโหมด PiP
โดยเรียก enterPictureInPictureMode() อุปกรณ์ TV ที่ใช้ Android เวอร์ชันก่อนหน้าไม่รองรับโหมด PiP
ต่อไปนี้คือตัวอย่างวิธีใช้ตรรกะของปุ่มเพื่อเข้าสู่โหมด PiP
Kotlin
override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) pictureInPictureButton.visibility = if (requireActivity().packageManager.hasSystemFeature(FEATURE_PICTURE_IN_PICTURE)) { pictureInPictureButton.setOnClickListener { val aspectRatio = Rational(view.width, view.height) val params = PictureInPictureParams.Builder() .setAspectRatio(aspectRatio) .build() val result = requireActivity().enterPictureInPictureMode(params) } View.VISIBLE } else { View.GONE } }
Java
@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
if (requireActivity().getPackageManager().hasSystemFeature(FEATURE_PICTURE_IN_PICTURE)) {
pictureInPictureButton.setVisibility(View.VISIBLE);
pictureInPictureButton.setOnClickListener(v -> {
Rational aspectRatio = new Rational(view.getWidth(), view.getHeight());
PictureInPictureParams params = new PictureInPictureParams.Builder()
.setAspectRatio(aspectRatio)
.setTitle("My Streaming App")
.setSubtitle("My On-Demand Content")
.build();
Boolean result = requireActivity().enterPictureInPictureMode(params);
});
} else {
pictureInPictureButton.setVisibility(View.GONE);
}
}
ระบบจะเพิ่มการดำเนินการก็ต่อเมื่ออุปกรณ์มีฟีเจอร์ระบบ
FEATURE_PICTURE_IN_PICTURE นอกจากนี้ เมื่อมีการทริกเกอร์การดำเนินการ ระบบจะตั้งค่าอัตราส่วนกว้างยาวของโหมด PiP ให้ตรงกับอัตราส่วนกว้างยาวของวิดีโอที่กำลังเล่น
อย่าลืมเพิ่มชื่อและคำบรรยายเพื่อแจ้งให้ผู้ใช้ทราบถึงวัตถุประสงค์การใช้งาน PIP โดยทั่วไป
ทำงานร่วมกับแอปที่ทำงานในโหมด PiP
เมื่อแอปของคุณทำงานเป็นแอปแบบเต็มหน้าจอ แอปอาจต้องปรับให้เข้ากับแอปอื่นๆ ที่ทำงานในโหมด PiP
API การเว้นพื้นที่
ในบางกรณี แอป PiP อาจซ้อนทับคอมโพเนนต์ UI ที่สำคัญภายในแอปแบบเต็มหน้าจอ เราจึงมี API การเว้นพื้นที่เพื่อให้แอปใช้ระบุคอมโพเนนต์ UI ที่สำคัญซึ่งไม่ควรซ้อนทับ ระบบจะพยายามปฏิบัติตามคำขอเพื่อหลีกเลี่ยงการครอบคลุมคอมโพเนนต์เหล่านี้โดยการเปลี่ยนตำแหน่งหน้าต่าง PiP
หากต้องการระบุว่าไม่ควรซ้อนทับมุมมอง ให้ใช้ preferKeepClear ในเลย์เอาต์ XML
ดังตัวอย่างต่อไปนี้
<TextView
android:id="@+id/important_text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:preferKeepClear="true"
android:text="@string/app_name"/>
นอกจากนี้ คุณยังทำเช่นนี้ได้โดยใช้ setPreferKeepClear() ผ่านโปรแกรม
Kotlin
private lateinit var binding: MyLayoutBinding
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = MyLayoutBinding.inflate(layoutInflater)
setContentView(binding.root)
binding.importantText.isPreferKeepClear = true
}
Java
private MyLayoutBinding binding;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
binding = MyLayoutBinding.inflate(getLayoutInflater());
setContentView(binding.getRoot());
binding.importantText.setPreferKeepClear(true);
}
ในบางครั้ง คุณอาจไม่จำเป็นต้องเว้นพื้นที่ View ทั้งหมด แต่
เพียงบางส่วนเท่านั้น คุณสามารถใช้ setPreferKeepClearRects() เพื่อ
ระบุภูมิภาคของ View ที่ไม่ควรซ้อนทับ UI ที่ไม่ได้ใช้ Views โดยกำเนิด เช่น Flutter, Jetpack Compose และ WebView อาจมีส่วนย่อยที่ต้องเว้นพื้นที่ คุณสามารถใช้ API นี้ในกรณีดังกล่าวได้
ประเภทการใช้งาน
แอปของคุณต้องประกาศแอตทริบิวต์ค่าข้อมูลเมตาของ
com.google.android.tv.pip.categoryที่สอดคล้องกับประเภทการใช้งานหลักหรือ
ประเภทการใช้งานสำหรับการแสดงภาพซ้อนภาพ <activity> ใดก็ตามที่ตั้งค่า
android:supportsPictureInPicture="true" ควรประกาศแอตทริบิวต์นี้ด้วย
ค่าที่เกี่ยวข้องจากตารางต่อไปนี้
ไม่อนุญาตให้ใช้ประเภทการใช้งานที่ไม่ได้อยู่ในหมวดหมู่ใดหมวดหมู่หนึ่งเหล่านี้ โดยเฉพาะอย่างยิ่งการเล่นเนื้อหาสื่อในโหมดการแสดงภาพซ้อนภาพบนทีวี
| ค่า | คำอธิบาย |
|---|---|
"communication" |
กรณีการใช้งานด้านการสื่อสาร เช่น วิดีโอคอลหรือการโทรด้วยเสียง |
"smartHome" |
การผสานรวมสมาร์ทโฮม เช่น กริ่งประตูหรือกล้องวงจรปิดสำหรับเด็กที่เชื่อมต่อ |
"health" |
กรณีการใช้งานด้านสุขภาพ เช่น การติดตามการออกกำลังกายหรือการตรวจสอบสุขภาพ |
"ticker" |
กรณีการใช้งานแถบเลื่อน เช่น คะแนนกีฬาแบบสดหรือแถบเลื่อนข่าวและหุ้น |
ค่าหลายค่าจะคั่นด้วยแถบแนวตั้ง (|) เช่น
<meta-data android:name="com.google.android.tv.pip.category" android:value="smartHome|health" />