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<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@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@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@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