• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1page.title=Ảnh trong ảnh
2page.keywords=preview,sdk,PIP,Picture-in-picture
3page.tags=androidn
4
5@jd:body
6
7<div id="tb-wrapper">
8<div id="tb">
9
10<h2>Trong tài liệu này</h2>
11<ol>
12  <li><a href="#declaring">Khai báo Hoạt động hỗ trợ
13Ảnh trong ảnh</a></li>
14  <li><a href="#pip_button">Chuyển Hoạt động sang Ảnh trong ảnh</a>
15</li>
16  <li><a href="#handling_ui">Xử lý UI trong chế độ Ảnh trong ảnh</a>
17</li>
18  <li><a href="#continuing_playback">Tiếp tục phát lại video ở chế độ
19Ảnh trong ảnh</a></li>
20  <li><a href="#best">Thực hành Tốt nhất</a></li>
21</ol>
22
23<h2>Xem thêm</h2>
24<ol>
25  <li><a href="{@docRoot}preview/features/multi-window.html">Hỗ trợ
26đa cửa sổ</a></li>
27</ol>
28
29</div>
30</div>
31
32<p>Trong Android N, người dùng Android TV đã có thể xem video
33trong 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
34các ứng dụng. Chế độ Ảnh trong ảnh (PIP) cho phép ứng dụng chạy một hoạt động
35video trong cửa sổ được ghim trong khi một hoạt động khác tiếp tục chạy
36ngầ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,
37giúp cho người dùng năng suất hơn.</p>
38
39<p>Ứ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ề
40thời điểm chuyển vào chế độ PIP:</p>
41
42<ul>
43<li>Ứng dụng của bạn có thể chuyển một video vào chế độ PIP khi người dùng điều hướng
44rời khỏi video đó để duyệt nội dung khác.</li>
45<li>Ứng dụng của bạn có thể chuyển một video sang chế độ PIP khi người dùng xem đoạn cuối
46 của một tập nội dung. Màn hình chính sẽ hiển thị thông tin quảng cáo
47hoặc tóm tắt về tập tiếp theo trong loạt video đó.</li>
48<li>Ứng dụng của bạn có thể mang lại cho người dùng một cách để xếp hàng các nội dung bổ sung khi
49họ đang xem một video. Video đó sẽ tiếp tục được phát trong chế độ PIP trong khi màn hình
50chính hiển thị hoạt động chọn nội dung.</li>
51</ul>
52
53<p>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
54bố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
55, 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ổ
56PIP bằng cách bấm giữ nút <b>Home</b> trên điều khiển từ xa. Nếu một video
57khác bắt đầu phát trên màn hình chính, cửa sổ PIP sẽ tự động
58được đóng. Người dùng cũng có thể đóng cửa sổ PIP thông qua nút Recents.</p>
59
60<img src="{@docRoot}images/android-7.0/pip-active.png" />
61<p class="img-caption"><strong>Hình 1.</strong> Một video Ảnh trong ảnh
62được hiển thị ở góc màn hình khi người dùng duyệt nội dung
63trên màn hình chính.</p>
64
65<p>PIP sử dụng các API đa cửa sổ có trong Android N để
66tạo cửa sổ video nằm chồng được ghim. Để thêm chế độ PIP vào ứng dụng bạn cần
67đăng ký các hoạt động hỗ trợ PIP, chuyển hoạt động của bạn sang chế độ PIP khi
68cầ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
69hoạt động đó ở trong chế độ PIP.</p>
70
71<h2 id="declaring">Khai báo Hoạt động hỗ trợ Ảnh trong ảnh</h2>
72
73<p>Theo mặc định, hệ thống không tự động hỗ trợ PIP cho các ứng dụng.
74Nếu bạn muốn hỗ trợ chế độ PIP trong ứng dụng của mình, hãy đăng ký hoạt động
75video trong bản kê khai bằng cách đặt
76<code>android:supportsPictureInPicture</code> và
77<code>android:resizeableActivity</code> thành <code>true</code>. Ngoài ra, hãy chỉ định
78hoạt động của bạn xử lý các thay đổi cấu hình bố trí để hoạt động đó
79khô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.</p>
80
81<pre>
82&lt;activity android:name="VideoActivity"
83    android:resizeableActivity="true"
84    android:supportsPictureInPicture="true"
85    android:configChanges=
86        "screenSize|smallestScreenSize|screenLayout|orientation"
87    ...
88</pre>
89
90<p>Khi đăng ký hoạt động của bạn, hãy nhớ rằng trong chế độ PIP, hoạt động
91củ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
92phá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
93có 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
94khi đượ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
95trong cửa sổ PIP.</p>
96
97<h2 id="pip_button">Chuyển Hoạt động sang Ảnh trong ảnh</h2>
98
99Khi bạn cần chuyển hoạt động của mình sang chế độ PIP, hãy gọi
100<code>Activity.enterPictureInPicture()</code>. Ví dụ sau sẽ chuyển
101sang chế độ PIP khi người dùng chọn một nút PIP riêng trên thanh điều khiển
102media:</p>
103
104<pre>
105&#64;Override
106public void onActionClicked(Action action) {
107    if (action.getId() == R.id.lb_control_picture_in_picture) {
108        getActivity().enterPictureInPicture();
109        return;
110    }
111    ...
112</pre>
113
114<p>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
115sang chế độ PIP khi điều khiển phát lại video.</p>
116
117<img src="{@docRoot}images/android-7.0/pip-button.png" />
118<p class="img-caption"><strong>Hình 1.</strong> Một nút Ảnh trong ảnh
119trên thanh điều khiển media.</p>
120
121<p>Android N có một lớp
122<code>PlaybackControlsRow.PictureInPictureAction</code> mới định nghĩa
123các hành động ở chế độ PIP trên thanh điều khiển và sử dụng biểu tượng PIP.</p>
124
125<h2 id="handling_ui">Xử lý UI trong chế độ Ảnh trong ảnh</h2>
126
127<p>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
128video. Hãy xóa các phần tử UI trước khi hoạt động của bạn vào chế độ PIP,
129và 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.
130Ghi đè phương thức <code>Activity.onPictureInPictureChanged()</code> hoặc
131<code>Fragment.onPictureInPictureChanged()</code> và bật hoặc
132tắt các phần tử UI khi cần thiết, ví dụ:</p>
133
134<pre>
135&#64;Override
136public void onPictureInPictureChanged(boolean inPictureInPicture) {
137    if (inPictureInPicture) {
138        // Hide the controls in picture-in-picture mode.
139        ...
140    } else {
141        // Restore the playback UI based on the playback status.
142        ...
143    }
144}
145</pre>
146
147<h2 id="continuing_playback">Tiếp tục phát lại video ở chế độ
148Ảnh trong ảnh</h2>
149
150<p>Khi hoạt động của bạn chuyển sang chế độ PIP thì hệ thống sẽ coi hoạt động đó đang ở trong
151trạng thái tạm dừng và sẽ gọi phương thức <code>onPause()</code> của hoạt động. Việc phát lại
152video không nên được tạm dừng và cần được tiếp tục phát nếu hoạt động
153bị tạm dừng do chế độ PIP. Hãy kiểm tra chế độ PIP trong phương thức
154<code>onPause()</code> của hoạt động và xử lý việc phát lại cho phù hợp, ví
155dụ:</p>
156
157<pre>
158&#64;Override
159public void onPause() {
160    // If called due to PIP, do not pause playback
161    if (inPictureInPicture()) {
162        // Continue playback
163        ...
164    }
165    // If paused but not in PIP, pause playback if necessary
166    ...
167}
168</pre>
169
170<p>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ì
171hệ thống sẽ tiếp tục hoạt động của bạn và gọi phương thức <code>onResume()</code>.</p>
172
173<h2 id="best">Thực hành Tốt nhất</h2>
174
175<p>PIP được dành cho các hoạt động phát lại video toàn màn hình. Khi chuyển
176hoạ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.
177Theo 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ả
178trong <a href="#handling_ui">Xử lý UI trong chế độ Ảnh trong ảnh</a>.</p>
179
180<p>Vì cửa sổ PIP được hiển thị dưới dạng cửa sổ nổi ở góc
181mà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
182ở bất kỳ vùng nào có thể bị che khuất bởi cửa sổ PIP.</p>
183
184<p>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. Để
185tiếp nhận các sự kiện nhập vào khi ở chế độ PIP, hãy sử dụng
186<code>MediaSession.setMediaButtonReceiver()</code>.</p>
187