Các thiết bị TV cần một thiết bị phần cứng phụ để tương tác với các ứng dụng – một bộ điều khiển từ xa cơ bản, điều khiển từ xa có con trỏ hoặc tay điều khiển trò chơi. Để mang lại trải nghiệm nhất quán cho người dùng, ứng dụng của bạn phải hỗ trợ phương thức nhập bằng bàn phím di chuyển (D-pad), xử lý trường hợp bộ điều khiển chuyển sang chế độ ngoại tuyến và hỗ trợ phương thức nhập từ nhiều loại bộ điều khiển, bao gồm cả điều khiển từ xa có con trỏ.
Các nút điều khiển tối thiểu trên d-pad
Bộ điều khiển mặc định cho thiết bị TV là một D-pad. Nhìn chung, ứng dụng của bạn phải hoạt động được bằng một bộ điều khiển từ xa chỉ có các nút lên, xuống, trái, phải, chọn, Quay lại và Màn hình chính. Nếu ứng dụng của bạn là một trò chơi thường yêu cầu tay điều khiển trò chơi có các nút điều khiển bổ sung, hãy cố gắng hỗ trợ lối chơi chỉ bằng các nút điều khiển D-pad này. Nếu không, hãy cảnh báo người dùng rằng họ cần có bộ điều khiển và cho phép họ thoát khỏi trò chơi một cách an toàn bằng bộ điều khiển D-pad.
Để biết thêm thông tin về cách điều hướng bằng bộ điều khiển D-pad cho thiết bị TV, hãy xem phần Điều hướng trên TV.
Xử lý trường hợp bộ điều khiển bị ngắt kết nối
Bộ điều khiển cho TV thường là thiết bị Bluetooth. Thiết bị này có thể cố gắng tiết kiệm pin bằng cách định kỳ chuyển sang chế độ ngủ và ngắt kết nối với thiết bị TV. Điều này có nghĩa là ứng dụng có thể bị gián đoạn hoặc khởi động lại nếu không được định cấu hình để xử lý các sự kiện kết nối lại này. Những sự kiện này có thể xảy ra trong bất kỳ trường hợp nào sau đây:
- Trong khi một video dài vài phút đang phát, d-pad hoặc tay điều khiển trò chơi có thể chuyển sang chế độ ngủ, ngắt kết nối với thiết bị TV và kết nối lại sau.
- Trong khi chơi, một người chơi mới có thể tham gia trò chơi bằng tay điều khiển trò chơi chưa được kết nối.
- Trong khi chơi, người chơi có thể rời khỏi trò chơi và ngắt kết nối tay điều khiển trò chơi.
Mọi hoạt động của ứng dụng truyền hình chịu sự kiện ngắt kết nối và kết nối lại đều phải được định cấu hình để xử lý các sự kiện kết nối lại trong tệp kê khai ứng dụng. Đoạn mã mẫu sau đây minh hoạ cách cho phép một hoạt động xử lý các thay đổi về cấu hình, bao gồm cả việc kết nối, ngắt kết nối hoặc kết nối lại bàn phím hoặc thiết bị điều hướng:
<activity
android:name="com.example.android.TvActivity"
android:label="@string/app_name"
android:configChanges="keyboard|keyboardHidden|navigation"
android:theme="@style/Theme.Leanback">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LEANBACK_LAUNCHER" />
</intent-filter>
...
</activity>
Thay đổi cấu hình này cho phép ứng dụng tiếp tục chạy thông qua một sự kiện kết nối lại thay vì được khởi động lại bởi khung Android (điều này không mang lại trải nghiệm tốt cho người dùng).
Xử lý các biến thể của dữ liệu đầu vào bằng d-pad
Người dùng thiết bị TV có thể có nhiều loại bộ điều khiển mà họ sử dụng với TV. Ví dụ: người dùng có thể có một bộ điều khiển D-pad cơ bản, một con trỏ điều khiển từ xa hoặc một tay điều khiển trò chơi. Mã khoá do tay điều khiển trò chơi cung cấp khi được dùng cho các chức năng của D-pad có thể khác với mã khoá do D-pad cơ bản gửi.
Xử lý các biến thể của phương thức nhập bằng D-pad để người dùng không phải chuyển đổi bộ điều khiển để vận hành ứng dụng của bạn. Để biết thêm thông tin về cách xử lý các biến thể của phương thức nhập, hãy xem phần Xử lý phương thức nhập bằng phím định hướng.
Hỗ trợ thiết bị điều khiển từ xa bằng con trỏ
Một số thiết bị TV hỗ trợ điều khiển từ xa có con trỏ, chẳng hạn như chuột trên không hoặc điều khiển từ xa có bàn di chuột (bàn di chuột) nhạy cảm với thao tác chạm. Việc hỗ trợ thiết bị điều khiển từ xa bằng con trỏ cho phép người dùng tương tác với ứng dụng của bạn bằng cách sử dụng các cử chỉ trỏ và nhấp, di chuột, vuốt và kéo, mang lại trải nghiệm mượt mà hơn trên phần cứng tương thích trong khi vẫn duy trì khả năng tương thích hoàn toàn với D-pad.
Khai báo khả năng hỗ trợ thiết bị trỏ từ xa trong tệp kê khai
Để cho biết rằng ứng dụng của bạn có thể điều hướng bằng con trỏ và thao tác chạm, hãy định cấu hình tệp kê khai ứng dụng bằng siêu dữ liệu android.software.leanback.supports_touch được đặt thành true:
<manifest ...>
<!-- Signal whether the app is adaptive or built just for TV -->
<uses-feature
android:name="android.software.leanback"
android:required="true|false" />
<!-- Ensure the app can be installed on conventional TVs -->
<uses-feature
android:name="android.hardware.touchscreen"
android:required="false" />
<!-- Signal whether the app supports pointer remotes -->
<meta-data
android:name="android.software.leanback.supports_touch"
android:value="true" />
<application ...>
...
</application>
</manifest>
Hỗ trợ các hành động tương tác như nhấp, di chuột và cuộn
Khi hỗ trợ điều khiển từ xa bằng con trỏ, hãy đảm bảo các thành phần giao diện người dùng của bạn phản hồi thích hợp với con trỏ và thao tác chạm trong các hoạt động tương tác sau:
- Nhấp và chọn: tất cả các phần tử trên giao diện người dùng có thể lấy tiêu điểm và chọn đều phải nhấp được bằng điều khiển từ xa có con trỏ, khớp với hành vi chọn bằng D-pad (
KEYCODE_DPAD_CENTER).- Jetpack Compose: sử dụng đối tượng sửa đổi
Modifier.clickable()hoặcpointerInput. Để biết thêm thông tin, hãy xem phần Nhấn và giữ. - Lượt xem: xử lý các sự kiện nhấp chuột trên lượt xem. Để biết thêm thông tin chi tiết, hãy xem phần Tổng quan về sự kiện đầu vào.
- Jetpack Compose: sử dụng đối tượng sửa đổi
- Trạng thái di chuột trực quan: cung cấp hiệu ứng di chuột trực quan rõ ràng để cho biết thời điểm con trỏ nằm trên một mục có thể chọn.
- Jetpack Compose: sử dụng
Modifier.hoverable()hoặc quan sát các trạng thái di chuột bằngInteractionSource. Để biết thêm thông tin chi tiết, hãy xem bài viết Xử lý hoạt động tương tác của người dùng. - Khung hiển thị: xác định trạng thái di chuột bằng cách sử dụng đối tượng có thể vẽ trong danh sách trạng thái với
android:state_hovered="true".
- Jetpack Compose: sử dụng
- Vuốt và hất để di chuyển: thao tác di chuyển theo chiều ngang và chiều dọc được kích hoạt bằng cử chỉ vuốt hoặc hất trên nút D-pad cảm ứng ở giữa phải hoạt động mượt mà trên tất cả nội dung có thể di chuyển.
- Kéo để cuộn: người dùng phải có thể kéo để cuộn theo chiều dọc (lên và xuống) hoặc theo chiều ngang (trái và phải) trên các vùng chứa có thể cuộn.
- Jetpack Compose: theo mặc định, các vùng chứa có thể cuộn tiêu chuẩn hỗ trợ thao tác cuộn bằng con trỏ và thao tác cuộn bằng cách chạm. Để biết thông tin về cách triển khai tuỳ chỉnh, hãy xem bài viết Phương thức nhập bằng con trỏ trong Compose.
- Khung hiển thị: theo mặc định, các khung hiển thị có thể cuộn tiêu chuẩn hỗ trợ thao tác cuộn bằng cách chạm. Để biết cách xử lý dữ liệu đầu vào tuỳ chỉnh, hãy xem phần Thao tác chạm và nhập.
- Thao tác tua trong quá trình phát nội dung nghe nhìn: trong quá trình phát nội dung nghe nhìn (chẳng hạn như chương trình truyền hình và phim), người dùng phải có thể tương tác với thanh tiến trình phát (thanh tua) bằng cách trỏ và nhấp để chuyển đến một dấu thời gian trong quá khứ hoặc tương lai, cũng như kéo (tua) dọc theo thanh tiến trình để chuyển đến một thời điểm cụ thể.
Xử lý sự kiện nút
Khi người dùng nhấp vào một nút trên bộ điều khiển, ứng dụng của bạn sẽ nhận được một sự kiện có KeyEvent. Hành vi dự kiến của nút có thể là một sự kiện đa phương tiện (chẳng hạn như phát, tạm dừng hoặc dừng) hoặc có thể là một sự kiện thuộc loại TV (chẳng hạn như chọn hoặc điều hướng). Để mang lại trải nghiệm tốt cho người dùng, hãy chỉ định hành vi nhất quán cho các nút trên bộ điều khiển.
Sự kiện trên giao diện người dùng của TV
Chỉ định hành vi giao diện người dùng TV cho các nút tạo ra các loại KeyEvent như minh hoạ trong bảng sau:
KeyEvent |
Hành vi |
|---|---|
KEYCODE_BUTTON_B, KEYCODE_BACK |
Quay lại |
KEYCODE_BUTTON_SELECT, KEYCODE_BUTTON_A, KEYCODE_ENTER, KEYCODE_DPAD_CENTER, KEYCODE_NUMPAD_ENTER |
Lựa chọn |
KEYCODE_DPAD_UP, KEYCODE_DPAD_DOWN, KEYCODE_DPAD_LEFT, KEYCODE_DPAD_RIGHT |
Điều hướng |
Sự kiện nội dung nghe nhìn
Khi người dùng đang xem nội dung nghe nhìn, hãy chỉ định hành vi cho các nút tạo ra các loại KeyEvent như trong bảng sau. Nếu ứng dụng của bạn đang điều khiển MediaSession, hãy dùng MediaControllerAdapter để gọi một trong các phương thức MediaControllerCompat.TransportControls xuất hiện trong bảng. Xin lưu ý rằng các nút chọn đóng vai trò là nút Phát hoặc Tạm dừng trong ngữ cảnh này.
KeyEvent |
Lệnh gọi TransportControls | Hành vi |
|---|---|---|
BUTTON_SELECT, BUTTON_A, ENTER, DPAD_CENTER, KEYCODE_NUMPAD_ENTER |
play() |
Phát |
BUTTON_START, BUTTON_SELECT, BUTTON_A, ENTER, DPAD_CENTER, KEYCODE_NUMPAD_ENTER |
pause() |
Tạm dừng |
BUTTON_R1 |
skipToNext() |
Chuyển tới mục tiếp theo |
BUTTON_L1 |
skipToPrevious() |
Chuyển về mục trước |
DPAD_RIGHT, BUTTON_R2, AXIS_RTRIGGER, AXIS_THROTTLE |
fastForward() |
Tua đi |
DPAD_LEFT, BUTTON_L2, AXIS_LTRIGGER, AXIS_BRAKE |
rewind() |
Tua lại |
| Không áp dụng | stop() |
Dừng |
Cung cấp hành vi phù hợp cho nút Quay lại
Nút Quay lại không bao giờ được hoạt động như một nút bật/tắt. Ví dụ: đừng dùng thao tác này để vừa mở vừa đóng một trình đơn. Chỉ dùng nút này để di chuyển ngược lại theo kiểu đường dẫn qua các màn hình trước mà trình phát đã truy cập.
Vì nút Quay lại chỉ thực hiện thao tác điều hướng tuyến tính, lùi lại, nên bạn có thể dùng nút này để thoát khỏi một trình đơn trong ứng dụng do một nút khác mở và quay lại ứng dụng. Thao tác nhấn nút Quay lại liên tục phải luôn dẫn đến màn hình chính của Android TV. Ví dụ: chơi trò chơi > màn hình tạm dừng trò chơi > màn hình chính của trò chơi > màn hình chính của Android TV hoặc phát chương trình truyền hình > màn hình chính của ứng dụng truyền hình
Màn hình chính của Android TV.
Để biết thêm thông tin về thiết kế cho hoạt động điều hướng, hãy xem phần Thiết kế hoạt động điều hướng Quay lại và Lên. Để tìm hiểu về cách triển khai, hãy tham khảo bài viết Cung cấp tính năng điều hướng quay lại phù hợp.
Xử lý bộ điều khiển cho trò chơi
Khi xây dựng trò chơi cho Android TV, hãy thiết kế sơ đồ điều khiển để hoạt động với cả điều khiển từ xa TV tiêu chuẩn và tay điều khiển trò chơi chuyên dụng.
Hỗ trợ các nút điều khiển trên d-pad
Lập kế hoạch cho sơ đồ điều khiển dựa trên chế độ điều khiển D-pad, vì bộ điều khiển này là chế độ mặc định cho các thiết bị Android TV. Người chơi cần có thể sử dụng D-pad cho mọi khía cạnh của trò chơi, không chỉ điều khiển lối chơi cốt lõi mà còn điều hướng các trình đơn và quảng cáo. Vì lý do này, hãy đảm bảo rằng trò chơi trên Android TV của bạn không đề cập đến giao diện cảm ứng bằng những ngôn từ như "Nhấn vào đây để tiếp tục".
Cách bạn định hình hoạt động tương tác của người chơi với bộ điều khiển có thể là yếu tố then chốt để mang lại trải nghiệm tuyệt vời cho người dùng. Hãy cân nhắc các phương pháp hay nhất sau đây:
- Thông báo trước các yêu cầu về tay điều khiển: sử dụng nội dung mô tả trên Google Play để thông báo cho người chơi mọi kỳ vọng về tay điều khiển. Nếu một trò chơi phù hợp hơn với tay cầm có cần điều khiển so với tay cầm chỉ có D-pad, hãy nêu rõ điều này. Người chơi sử dụng bộ điều khiển không phù hợp cho một trò chơi có thể có trải nghiệm không tốt và đánh giá trò chơi của bạn ở mức thấp.
- Sử dụng chế độ liên kết nút nhất quán: chế độ liên kết nút trực quan là yếu tố then chốt để mang lại trải nghiệm tốt cho người dùng. Ví dụ: tuân thủ các quy tắc được chấp nhận bằng cách sử dụng nút A để chấp nhận và nút B để huỷ. Bạn cũng có thể mang đến sự linh hoạt bằng cách cho phép người dùng gán lại các nút. Để biết thêm thông tin về việc ánh xạ nút, hãy xem phần Xử lý các thao tác của bộ điều khiển.
- Phát hiện các chức năng của bộ điều khiển và điều chỉnh cho phù hợp: truy vấn bộ điều khiển về các chức năng của bộ điều khiển để tối ưu hoá sự phù hợp giữa bộ điều khiển và trò chơi. Ví dụ: bạn có thể muốn người chơi điều khiển một đối tượng bằng cách vẫy tay điều khiển trong không trung, nhưng nếu tay điều khiển của người chơi thiếu phần cứng gia tốc kế và con quay hồi chuyển, thì thao tác vẫy sẽ không hoạt động. Truy vấn bộ điều khiển và nếu không hỗ trợ tính năng phát hiện chuyển động, hãy chuyển sang một phương án thay thế, có sẵn trong sơ đồ điều khiển. Để biết thêm thông tin về cách truy vấn các chức năng của bộ điều khiển, hãy xem phần Hỗ trợ bộ điều khiển trên các phiên bản Android.
Sử dụng các nút thích hợp
Không phải tay điều khiển trò chơi nào cũng có nút Bắt đầu, Tìm kiếm hoặc Trình đơn. Đảm bảo giao diện người dùng của bạn không phụ thuộc vào việc sử dụng các nút này.
Xử lý nhiều bộ điều khiển
Khi nhiều người chơi đang chơi một trò chơi, mỗi người chơi có tay điều khiển riêng, thì bạn cần phải liên kết từng cặp người chơi – tay điều khiển. Để biết thông tin về cách triển khai quy trình nhận dạng số tay điều khiển, hãy xem phần getControllerNumber().
Xử lý trường hợp bộ điều khiển bị ngắt kết nối
Khi người chơi ngắt kết nối tay điều khiển trong lúc chơi, hãy tạm dừng trò chơi và hiện một hộp thoại nhắc người chơi đã ngắt kết nối kết nối lại tay điều khiển.
Ngoài ra, hãy cung cấp các mẹo khắc phục sự cố trong hộp thoại. Ví dụ: yêu cầu người chơi "Kiểm tra kết nối Bluetooth". Để biết thêm thông tin về cách triển khai tính năng hỗ trợ thiết bị đầu vào, hãy xem bài viết Xử lý thao tác của bộ điều khiển và Tổng quan về Bluetooth.
Hiện hướng dẫn về bộ điều khiển
Nếu trò chơi của bạn cung cấp hướng dẫn bằng hình ảnh về cách điều khiển trò chơi, hãy sử dụng hình ảnh tay điều khiển không có nội dung thương hiệu và chỉ bao gồm các nút tương thích với Android.
Để xem hình ảnh mẫu về một tay điều khiển tương thích với Android, hãy tải Mẫu tay cầm chơi game Android TV (ZIP) xuống. Bộ này bao gồm một tay điều khiển màu trắng trên nền đen và một tay điều khiển màu đen trên nền trắng (như trong hình 1) dưới dạng tệp PNG và tệp Adobe® Illustrator®.