page.title=Ảnh trong ảnh page.keywords=preview,sdk,PIP,Picture-in-picture page.tags=androidn @jd:body
Trong Android N, người dùng Android TV đã có thể xem video trong một cửa sổ được ghim vào một góc màn hình khi điều hướng bên trong các ứng dụng. Chế độ Ảnh trong ảnh (PIP) cho phép ứng dụng chạy một hoạt động video trong cửa sổ được ghim trong khi một hoạt động khác tiếp tục chạy ngầm. Cửa sổ PIP cho phép người dùng thực hiện nhiều việc khi đang sử dụng ứng dụng của bạn, giúp cho người dùng năng suất hơn.
Ứng dụng của bạn có thể quyết định khi nào thì kích hoạt chế độ PIP. Sau đây là một vài ví dụ về thời điểm chuyển vào chế độ PIP:
Cửa sổ PIP có kích thước 240x135 dp và được hiển thị trên lớp trên cùng ở một trong bốn góc của màn hình được hệ thống chọn. Người dùng có thể gọi ra một menu PIP , cho phép họ bật tắt cửa sổ PIP lên toàn màn hình hoặc đóng cửa sổ PIP bằng cách bấm giữ nút Home trên điều khiển từ xa. Nếu một video khác bắt đầu phát trên màn hình chính, cửa sổ PIP sẽ tự động được đóng. Người dùng cũng có thể đóng cửa sổ PIP thông qua nút Recents.
Hình 1. Một video Ảnh trong ảnh được hiển thị ở góc màn hình khi người dùng duyệt nội dung trên màn hình chính.
PIP sử dụng các API đa cửa sổ có trong Android N để tạo cửa sổ video nằm chồng được ghim. Để thêm chế độ PIP vào ứng dụng bạn cần đăng ký các hoạt động hỗ trợ PIP, chuyển hoạt động của bạn sang chế độ PIP khi cần và đảm bảo cho các phần tử UI sẽ bị ẩn đi và phát lại video vẫn tiếp tục khi hoạt động đó ở trong chế độ PIP.
Theo mặc định, hệ thống không tự động hỗ trợ PIP cho các ứng dụng.
Nếu bạn muốn hỗ trợ chế độ PIP trong ứng dụng của mình, hãy đăng ký hoạt động
video trong bản kê khai bằng cách đặt
android:supportsPictureInPicture
và
android:resizeableActivity
thành true
. Ngoài ra, hãy chỉ định
hoạt động của bạn xử lý các thay đổi cấu hình bố trí để hoạt động đó
không khởi chạy lại khi có các thay đổi về bố trí trong quá trình chuyển tiếp chế độ PIP.
<activity android:name="VideoActivity" android:resizeableActivity="true" android:supportsPictureInPicture="true" android:configChanges= "screenSize|smallestScreenSize|screenLayout|orientation" ...
Khi đăng ký hoạt động của bạn, hãy nhớ rằng trong chế độ PIP, hoạt động của bạn sẽ được hiển thị trong một cửa sổ nhỏ nằm chồng trên màn hình TV. Các hoạt động phát lại video với UI tối giản sẽ đem đến trải nghiệm người dùng tốt nhất. Các hoạt động có chứa những phần tử UI nhỏ có thể không đem lại trải nghiệm người dùng đạt yêu cầu khi được chuyển sang chế độ PIP bởi người dùng không thể thấy các chi tiết của phần tử UI trong cửa sổ PIP.
Activity.enterPictureInPicture()
. Ví dụ sau sẽ chuyển
sang chế độ PIP khi người dùng chọn một nút PIP riêng trên thanh điều khiển
media:
@Override public void onActionClicked(Action action) { if (action.getId() == R.id.lb_control_picture_in_picture) { getActivity().enterPictureInPicture(); return; } ...
Thêm một nút PIP vào thanh điều khiển media của bạn sẽ cho phép người dùng dễ dàng chuyển sang chế độ PIP khi điều khiển phát lại video.
Hình 1. Một nút Ảnh trong ảnh trên thanh điều khiển media.
Android N có một lớp
PlaybackControlsRow.PictureInPictureAction
mới định nghĩa
các hành động ở chế độ PIP trên thanh điều khiển và sử dụng biểu tượng PIP.
Khi hoạt động của bạn vào trong chế độ PIP thì hoạt động đó chỉ nên hiển thị phát lại
video. Hãy xóa các phần tử UI trước khi hoạt động của bạn vào chế độ PIP,
và khôi phục các phần tử này khi hoạt động quay lại chế độ toàn màn hình.
Ghi đè phương thức Activity.onPictureInPictureChanged()
hoặc
Fragment.onPictureInPictureChanged()
và bật hoặc
tắt các phần tử UI khi cần thiết, ví dụ:
@Override public void onPictureInPictureChanged(boolean inPictureInPicture) { if (inPictureInPicture) { // Hide the controls in picture-in-picture mode. ... } else { // Restore the playback UI based on the playback status. ... } }
Khi hoạt động của bạn chuyển sang chế độ PIP thì hệ thống sẽ coi hoạt động đó đang ở trong
trạng thái tạm dừng và sẽ gọi phương thức onPause()
của hoạt động. Việc phát lại
video không nên được tạm dừng và cần được tiếp tục phát nếu hoạt động
bị tạm dừng do chế độ PIP. Hãy kiểm tra chế độ PIP trong phương thức
onPause()
của hoạt động và xử lý việc phát lại cho phù hợp, ví
dụ:
@Override public void onPause() { // If called due to PIP, do not pause playback if (inPictureInPicture()) { // Continue playback ... } // If paused but not in PIP, pause playback if necessary ... }
Khi hoạt động của bạn chuyển ra khỏi chế độ PIP để quay trở về chế độ toàn màn hình thì
hệ thống sẽ tiếp tục hoạt động của bạn và gọi phương thức onResume()
.
PIP được dành cho các hoạt động phát lại video toàn màn hình. Khi chuyển hoạt động của bạn vào chế độ PIP, hãy tránh hiển thị bất kỳ nội dung nào ngoài video. Theo dõi khi hoạt động của bạn vào chế độ PIP và ẩn đi các phần tử UI, như mô tả trong Xử lý UI trong chế độ Ảnh trong ảnh.
Vì cửa sổ PIP được hiển thị dưới dạng cửa sổ nổi ở góc màn hình do đó bạn cần tránh hiển thị các thông tin quan trọng trong màn hình chính ở bất kỳ vùng nào có thể bị che khuất bởi cửa sổ PIP.
Theo mặc định, khi một hoạt động đang ở trong chế độ PIP thì nó sẽ không nhận tiêu điểm nhập vào. Để
tiếp nhận các sự kiện nhập vào khi ở chế độ PIP, hãy sử dụng
MediaSession.setMediaButtonReceiver()
.