Trên các thiết bị ChromeOS, nhiều người dùng tương tác với các ứng dụng bằng bàn phím, chuột, bàn di chuột, bút cảm ứng hoặc tay điều khiển trò chơi. Mặc dù các thiết bị đầu vào này cũng được dùng trên điện thoại Android, nhưng chúng không phổ biến và thường bị nhà phát triển bỏ qua.
Các nhà phát triển muốn ứng dụng của họ hoạt động hiệu quả với dữ liệu đầu vào trên ChromeOS và các thiết bị Android màn hình lớn khác nên xem xét những điểm tối ưu hoá sau:
- Thêm và kiểm thử khả năng hỗ trợ bàn phím cơ bản, chẳng hạn như điều hướng bằng bàn phím bằng các phím mũi tên và phím tab, phím Enter để xác nhận mục nhập văn bản và phím Cách để phát/tạm dừng trong các ứng dụng đa phương tiện.
-
Thêm phím tắt tiêu chuẩn nếu có, ví dụ:
ctrl+zđể hoàn tác,ctrl+sđể lưu. - Thử nghiệm các hoạt động tương tác cơ bản với chuột theo cách nhấp chuột phải để mở trình đơn theo bối cảnh, thay đổi biểu tượng khi di chuột và con lăn chuột/sự kiện cuộn trên bàn di chuột trên chế độ xem tuỳ chỉnh.
- Thử nghiệm các thiết bị đầu vào dành riêng cho ứng dụng, chẳng hạn như bút cảm ứng cho ứng dụng vẽ, tay điều khiển trò chơi cho trò chơi và bộ điều khiển MIDI cho ứng dụng nhạc.
- Cân nhắc việc hỗ trợ phương thức nhập nâng cao để có thể giúp ứng dụng trở nên nổi bật trong môi trường máy tính: bàn di chuột khi thích hợp cho các ứng dụng DJ, ẩn con trỏ chuột trong các trò chơi và các phím tắt mở rộng cho người dùng thành thạo.
Bàn phím
Cách ứng dụng phản hồi dữ liệu nhập bằng bàn phím góp phần mang lại trải nghiệm tốt trên máy tính. Có 3 cách nhập bằng bàn phím: Di chuyển, Tổ hợp phím và Phím tắt.
Di chuyển
Tính năng di chuyển trên bàn phím hiếm khi được triển khai trong các ứng dụng tập trung vào thao tác chạm, nhưng người dùng mong đợi điều này khi họ sử dụng ứng dụng bằng bàn phím. Đây cũng có thể là yếu tố cần thiết cho người dùng có nhu cầu hỗ trợ tiếp cận tính năng trên cả điện thoại và máy tính.
Đối với nhiều ứng dụng, phím mũi tên và thao tác trên thẻ là tất cả những gì cần thiết và hầu hết được xử lý tự động bằng khung Android. Ví dụ: chế độ xem của Button có thể lấy tiêu điểm theo mặc định và hoạt động điều hướng bằng bàn phím thường sẽ hoạt động mà không cần thêm mã nào. Để bật tính năng di chuyển trên bàn phím cho các khung hiển thị không thể lấy tiêu điểm theo mặc định, nhà phát triển nên đánh dấu các khung hiển thị đó là có thể lấy tiêu điểm. Bạn có thể thực hiện việc này theo phương thức lập trình hoặc trong XML, như sau. Hãy xem tài liệu về Xử lý tiêu điểm để biết thêm thông tin.
yourView.isFocusable = true
Ngoài ra, bạn có thể thiết lập thuộc tính focusable trong tệp bố cục:
android:focusable="true"
Khi tiêu điểm được bật, khung Android sẽ tạo một mục ánh xạ điều hướng cho mọi khung hiển thị có thể lấy tiêu điểm dựa vào vị trí của chúng. Phương thức này thường hoạt động như dự kiến và bạn không cần làm gì thêm. Khi mối liên kết mặc định không chính xác đối với nhu cầu của ứng dụng, mối liên kết đó có thể được ghi đè như sau:
// Arrow keys yourView.nextFocusLeftId = R.id.view_to_left yourView.nextFocusRightId = R.id.view_to_right yourView.nextFocusTopId = R.id.view_above yourView.nextFocusBottomId = R.id.view_below // Tab key yourView.nextFocusForwardId = R.id.next_view
Bạn nên thử truy cập chỉ bằng bàn phím vào mọi chức năng trong ứng dụng của mình trước mỗi bản phát hành. Bạn có thể truy cập các thao tác phổ biến nhất mà không cần sử dụng chuột hoặc chạm.
Lưu ý: Hãy nhớ rằng hỗ trợ bàn phím có thể rất cần thiết cho những người dùng có nhu cầu hỗ trợ tiếp cận tính năng.
Thao tác phím
Đối với văn bản nhập bằng bàn phím ảo trên màn hình (IME) chẳng hạn như EditText, ứng dụng sẽ hoạt động như dự tính trên ChromeOS mà nhà phát triển không phải làm gì thêm. Đối với các tổ hợp phím khung không thể đoán trước được, ứng dụng sẽ cần phải tự xử lý hành vi. Điều này đặc biệt đúng đối với các ứng dụng có chế độ xem tuỳ chỉnh.
Một số ví dụ là ứng dụng trò chuyện sử dụng phím enter để gửi tin nhắn, ứng dụng nghe nhìn bắt đầu/dừng phát bằng phím dấu cách và các trò chơi điều khiển di chuyển bằng các phím w, a, s và d.
Hầu hết các ứng dụng đều ghi đè sự kiện onKeyUp và thêm hành vi dự kiến cho mỗi mã phím nhận được, như sau.
override fun onKeyUp(keyCode: Int, event: KeyEvent): Boolean { return when (keyCode) { KeyEvent.KEYCODE_ENTER -> { sendChatMessage() true } KeyEvent.KEYCODE_SPACE -> { playOrPauseMedia() true } else -> super.onKeyUp(keyCode, event) } }
Khi dùng onKeyUp, ứng dụng sẽ không nhận được nhiều sự kiện nếu một phím được nhấn giữ hoặc thả chậm. Các trò chơi và ứng dụng tính toán người dùng nhấn và giữ phím có thể tìm sự kiện onKeyDown.
Tuỳ thuộc vào nhu cầu của ứng dụng, việc ghi đè onKeyUp cho toàn bộ Hoạt động thường cung cấp hành vi cần thiết. Nếu cần, bạn có thể thêm onKeyListener vào một khung hiển thị cụ thể. Ví dụ: một ứng dụng chỉ có thể nghe phím Enter trong EditText cụ thể, chứ không phải Activity, để chỉ triển khai chức năng gửi khi người dùng đang nhập vào hộp trò chuyện.
Khi thêm tính năng hỗ trợ bàn phím, hãy làm theo Tài liệu xử lý bàn phím của Android.
Lối tắt
Bạn nên sử dụng các phím tắt thông thường như ctrl, alt và shift trong môi trường máy tính. Nếu một ứng dụng không triển khai đầy đủ, người dùng sẽ cảm thấy khó chịu và trải nghiệm bị gián đoạn. Người dùng nâng cao cũng đánh giá cao các phím tắt cho các tác vụ thường dùng trong ứng dụng. Phím tắt giúp ứng dụng dễ sử dụng hơn và đem lại sự khác biệt của nó đối với ứng dụng không có phím tắt.
Một số phím tắt phổ biến bao gồm lưu (ctrl+s), hoàn tác (ctrl+z) và làm lại (ctrl+shift+z). Để biết ví dụ về một số phím tắt nâng cao, hãy xem danh sách phím tắt VLC Media Player.
Bạn có thể triển khai phím tắt bằng cách sử dụng dispatchKeyShortcutEvent. Thao tác này sẽ chặn mọi tổ hợp phím meta (alt, ctrl và shift) đối với một mã khoá cụ thể. Để kiểm tra một khoá meta cụ thể, hãy sử dụng KeyEvent.isCtrlPressed(), KeyEvent.isShiftPressed(), KeyEvent.isAltPressed() hoặc KeyEvent.hasModifiers().
Việc tách mã phím tắt khỏi các thao tác tổ hợp phím khác (chẳng hạn như onKeyUp hoặc onKeyDown) có thể giúp việc duy trì mã dễ dàng hơn và duy trì việc chấp nhận mặc định các khoá meta khi không cần phải triển khai kiểm tra khoá meta theo cách thủ công trong tất cả trường hợp. Việc cho phép tất cả các tổ hợp phím meta cũng có thể thuận tiện hơn cho những người dùng quen với bố cục bàn phím và hệ điều hành khác.
override fun dispatchKeyShortcutEvent(event: KeyEvent): Boolean { return when (event.keyCode) { KeyEvent.KEYCODE_O -> { openFile() // Ctrl+O, Shift+O, Alt+O true } KeyEvent.KEYCODE_Z-> { if (event.isCtrlPressed) { if (event.isShiftPressed) { redoLastAction() // Ctrl+Shift+Z pressed true } else { undoLastAction() // Ctrl+Z pressed true } } } else -> { return super.dispatchKeyShortcutEvent(event) } } }
Bạn cũng có thể triển khai phím tắt trong onKeyUp bằng cách kiểm tra KeyEvent.isCtrlPressed(), KeyEvent.isShiftPressed() hoặc KeyEvent.isAltPressed() theo cách tương tự. Điều này có thể dễ dàng duy trì hơn nếu hành vi meta thay đổi nhiều hơn hành vi ứng dụng so với phím tắt. Ví dụ: khi w có nghĩa là "đi bộ về phía trước" và shift+w có nghĩa là "chạy về phía trước".
override fun onKeyUp(keyCode: Int, event: KeyEvent): Boolean { return when(keyCode) { KeyEvent.KEYCODE_W-> { if (event.isShiftPressed) { if (event.isCtrlPressed) { flyForward() // Ctrl+Shift+W pressed true } else { runForward() // Shift+W pressed true } } else { walkForward() // W pressed } } else -> super.onKeyUp(keyCode, event) } }
Hỗ trợ chuột và bàn di chuột
ChromeOS tự động xử lý hầu hết các sự kiện chuột và bàn di chuột để chúng hoạt động như các sự kiện chạm trên điện thoại Android. Điều này bao gồm cả thao tác di chuyển bằng bánh xe chuột/bàn di chuột bằng hai ngón tay. Hầu hết các ứng dụng thường chỉ cần xử lý 3 sự kiện tập trung vào máy tính: Nhấp chuột phải, Di chuột và Kéo và thả.
Nhấp chuột phải
Mọi thao tác khiến ứng dụng hiển thị trình đơn theo bối cảnh, chẳng hạn như thao tác nhấn và giữ một mục trong danh sách, cũng phải phản ứng với các sự kiện nhấp chuột phải. Để xử lý các sự kiện nhấp chuột phải, ứng dụng cần đăng ký View.OnContextClickListener. Để biết thông tin chi tiết về cách tạo một trình đơn theo bối cảnh, hãy xem tài liệu về trình đơn theo bối cảnh của Android
yourView.setOnContextClickListener { view -> showContextMenu() true }
Lưu ý: mọi khung hiển thị đã được đăng ký cho một trình đơn theo bối cảnh bằng cách sử dụng Activity.registerForContextMenu() sẽ tự động hoạt động với cả thao tác nhấn và giữ cũng như nhấp chuột phải mà không cần đăng ký trình xử lý nhấp chuột theo bối cảnh.
Khoảng cách di
Các nhà phát triển có thể khiến bố cục ứng dụng của họ trông gọn gàng và dễ sử dụng hơn bằng cách xử lý các sự kiện di chuột. Điều này đặc biệt đúng với chế độ xem tuỳ chỉnh. Hai ví dụ phổ biến nhất về vấn đề này là:
- Cho người dùng biết nếu một phần tử có hành vi tương tác chẳng hạn như có thể nhấp hoặc chỉnh sửa bằng cách thay đổi biểu tượng con trỏ chuột
- Thêm phản hồi bằng hình ảnh vào các mục trong một danh sách lớn hoặc dạng lưới khi con trỏ đang di chuột qua các mục đó
// Change the icon to a "hand" pointer on hover, // Highlight the view by changing the background. yourView.setOnHoverListener { view, _ -> addVisualHighlighting(true) view.pointerIcon = PointerIcon.getSystemIcon(applicationContext, PointerIcon.TYPE_HAND) false // listener did not consume the event. }
Kéo và thả
Trong môi trường nhiều cửa sổ, người dùng muốn có thể kéo và thả các mục giữa các ứng dụng. Điều này đúng với các thiết bị ChromeOS cũng như máy tính bảng, điện thoại và thiết bị có thể gập lại ở chế độ chia đôi màn hình.
Nhà phát triển nên cân nhắc xem liệu người dùng có khả năng kéo các mục vào ứng dụng của họ hay không. Một số ví dụ phổ biến bao gồm: trình chỉnh sửa ảnh phải nhận được ảnh, trình phát âm thanh sẽ phải nhận được tệp âm thanh và chương trình vẽ sẽ phải nhận được ảnh.
Để thêm tính năng kéo và thả, hãy làm theo tài liệu Kéo và thả của Android, sau đó xem bài đăng này trên blog ChromeOS.
Những điều cần đặc biệt lưu ý đối với ChromeOS
-
Để xử lý các tệp từ ứng dụng Files trên ChromeOS, hãy tìm loại MIME
application/x-arc-uri-list -
Hãy nhớ yêu cầu quyền bằng cách sử dụng
requestDragAndDropPermissionsđể truy cập vào các mục được kéo vào từ bên ngoài ứng dụng -
Một mục phải gắn cờ
View.DRAG_FLAG_GLOBALđể được kéo vào các ứng dụng khác
Hỗ trợ chọn nhiều
Nếu ứng dụng của bạn có danh sách hoặc lưới, hãy cân nhắc xem người dùng có được hưởng lợi từ việc hỗ trợ lựa chọn nhiều mục hay không. Trải nghiệm chọn nhiều mục chất lượng cao bằng chuột và bàn di chuột thường bao gồm các tính năng như chọn theo dải. Việc tự triển khai có thể gặp nhiều khó khăn, nhưng bạn có thể sử dụng thư viện Lựa chọn Recyclerview.
Hỗ trợ con trỏ nâng cao
Các ứng dụng xử lý đầu vào bằng chuột và bàn di chuột nâng cao phải tuân theo tài liệu Android cho View.onGenericMotionEvent() và sử dụng MotionEvent.getSource() để phân biệt giữa SOURCE_MOUSE và SOURCE_TOUCHSCREEN.
Hãy kiểm tra MotionEvent để triển khai hành vi bắt buộc:
-
Chuyển động tạo ra
ACTION_HOVER_MOVEsự kiện -
Các nút tạo ra
ACTION_BUTTON_PRESSvàACTION_BUTTON_RELEASEsự kiện. Bạn cũng có thể kiểm tra trạng thái hiện tại của tất cả các nút chuột/bàn di chuột bằng cách sử dụnggetButtonState(). -
Thao tác cuộn con lăn chuột sẽ tạo ra
ACTION_SCROLLsự kiện
Bút cảm ứng
Nhiều Chromebook có bút cảm ứng và các ứng dụng Android xử lý việc đó dưới dạng thao tác trên màn hình cảm ứng. Một số thiết bị cũng có thể có bảng vẽ USB hoặc Bluetooth, như Wacom Intuos. Các ứng dụng Android có thể nhận đầu vào bằng Bluetooth, nhưng không tương thích với đầu vào USB.
Sự kiện bút cảm ứng được báo cáo là sự kiện có màn hình cảm ứng bằng cách sử dụng View.onTouchEvent() hoặc View.onGenericMotionEvent(), và chứa một MotionEvent.getSource() thuộc loại SOURCE_STYLUS. MotionEvent cũng sẽ chứa dữ liệu bổ sung:
-
MotionEvent.getToolType()sẽ trả vềTOOL_TYPE_FINGER,TOOL_TYPE_STYLUShoặcTOOL_TYPE_ERASERtuỳ thuộc vào công cụ chạm vào bề mặt đó -
MotionEvent.getPressure()sẽ báo cáo áp lực vật lý áp dụng cho bút cảm ứng, nếu được hỗ trợ -
MotionEvent.getAxisValue()thông quaMotionEvent.AXIS_TILTvàMotionEvent.AXIS_ORIENTATION. Bạn có thể dùng các phương thức này để đọc độ nghiêng vật lý và hướng của bút cảm ứng (nếu được hỗ trợ)
Điểm trước đó
Android phân chia hàng loạt sự kiện đầu vào và phân phối chúng cho mỗi khung. Bút cảm ứng có thể báo cáo các sự kiện có tần suất cao hơn nhiều so với màn hình. Khi tạo các ứng dụng vẽ, điều quan trọng là bạn cần kiểm tra các sự kiện xảy ra trong quá khứ gần bằng cách sử dụng các API getHistorical:
-
MotionEvent.getHistoricalX() -
MotionEvent.getHistoricalY() -
MotionEvent.getHistoricalPressure() -
MotionEvent.getHistoricalAxisValue()
Tính năng chống tì tay
ChromeOS cố gắng nhận ra khi lòng bàn tay của người dùng đặt lên màn hình cảm ứng. Tuy nhiên, điều này không phải lúc nào cũng có thể xảy ra. Đôi khi, một sự kiện chạm có thể được báo cáo cho ứng dụng trước khi hệ điều hành nhận dạng sự kiện đó là lòng bàn tay. Trong trường hợp đó, thao tác chạm sẽ bị huỷ bằng cách báo cáo một sự kiện ACTION_CANCEL.
Sự kiện này cho ứng dụng biết một số thao tác chạm là không hợp lệ và ứng dụng đó sẽ huỷ tất cả các lượt tương tác do những thao tác chạm đó gây ra. Ví dụ: một ứng dụng vẽ có thể tạm thời vẽ các dòng mới ngay khi nhận được những độ trễ đó để cung cấp thời gian chờ thấp nhất, nhưng chỉ thực hiện những thao tác đó vĩnh viễn trên canvas sau khi chuỗi cảm ứng kết thúc nhanh chóng. Nếu các sự kiện chạm bị huỷ trong lúc đó, các đường kẻ tạm thời có thể bị xoá.
Lưu ý: Một cách để giảm bớt sự tiếp xúc lòng bàn tay và ngón tay không liên quan trong khi vẽ và viết trong ứng dụng là cung cấp chế độ cài đặt giao diện người dùng để tắt tính năng vẽ bằng thao tác chạm và chỉ sử dụng các sự kiện bút cảm ứng để vẽ khi ở chế độ này.
Ứng dụng ghi chú
ChromeOS có một ý định đặc biệt là hiển thị các ứng dụng ghi chú đã đăng ký cho người dùng. Để đăng ký một ứng dụng làm ứng dụng ghi chú, hãy thêm đoạn mã sau vào tệp kê khai Android:
<intent-filter> <action android:name="org.chromium.arc.intent.action.CREATE_NOTE" /> <category android:name="android.intent.category.DEFAULT" /> </intent-filter>
Khi một ứng dụng được đăng ký, người dùng có thể chọn ứng dụng đó làm ứng dụng ghi chú mặc định. Khi có yêu cầu ghi chú mới, ứng dụng sẽ tạo một ghi chú trống để sẵn sàng nhập văn bản bằng bút cảm ứng. Khi người dùng muốn chú thích một hình ảnh (chẳng hạn như ảnh chụp màn hình hoặc hình ảnh đã tải xuống), ứng dụng sẽ chạy với ClipData chứa một hoặc nhiều mục content:// có nhiều URI. Ứng dụng sẽ tạo một ghi chú sử dụng hình ảnh đính kèm đầu tiên làm hình nền và chuyển sang chế độ người dùng có thể vẽ trên màn hình bằng bút cảm ứng.
Kiểm thử ý định ghi chú không dùng bút cảm ứng
Để kiểm tra xem một ứng dụng có phản hồi chính xác các ý định ghi chú không cần dùng bút cảm ứng đang hoạt động hay không, hãy sử dụng phương thức sau để hiển thị các tuỳ chọn ghi chú:
- Chuyển sang chế độ nhà phát triển và đặt thiết bị ở chế độ có thể ghi
-
Nhấn tổ hợp phím
ctrl+alt+f2để mở một cửa sổ dòng lệnh -
Chạy lệnh
sudo vi /etc/chrome_dev.conf -
Nhấn
iđể chỉnh sửa và thêm--ash-enable-palettevào một dòng mới ở cuối tệp -
Lưu bằng cách nhấn
Escrồi nhập:,w,qvà nhấnEnter -
Nhấn tổ hợp phím
ctrl+alt+f1để quay lại giao diện người dùng ChromeOS thông thường
Lúc này, bạn sẽ thấy một trình đơn bút cảm ứng trên kệ:
- Nhấn vào nút bút cảm ứng trên kệ rồi chọn Ghi chú mới. Thao tác này sẽ mở một bản ghi chú trống
- Chụp ảnh màn hình. Trên kệ, hãy chọn nút bút cảm ứng > Chụp màn hình hoặc tải ảnh xuống. Bạn nên chọn "Chú thích hình ảnh" trong thông báo. Thao tác này sẽ mở ra ứng dụng có hình ảnh đã sẵn sàng chú thích.
Tay điều khiển trò chơi
Chromebook hỗ trợ tối đa 4 tay điều khiển trò chơi. Nhà phát triển phải sử dụng API Tay điều khiển trò chơi tiêu chuẩn của Android để xử lý các API đó.
Các nút được liên kết tới các giá trị chung theo một mối liên kết chung. Rất tiếc là không phải tất cả các nhà sản xuất tay điều khiển trò chơi đều tuân theo cùng một quy ước liên kết. Bạn có thể mang đến trải nghiệm tốt hơn nhiều nếu cho phép người dùng chọn các cách sắp xếp tay điều khiển phổ biến khác nhau.
Chế độ dịch dữ liệu đầu vào
Theo mặc định, ChromeOS cho phép bật chế độ dịch. Đối với hầu hết ứng dụng Android, chế độ này giúp các ứng dụng hoạt động như mong muốn trong môi trường máy tính. Một số ví dụ bao gồm việc tự động cho phép lăn chuột bằng hai ngón tay trên bàn di chuột, cuộn con lăn chuột và ánh xạ toạ độ màn hình thô đến toạ độ cửa sổ. Nhìn chung, các nhà phát triển ứng dụng không cần thiết phải tự triển khai bất kỳ hành vi nào trong số này.
Nếu một ứng dụng triển khai hành vi nhập dữ liệu tuỳ chỉnh, chẳng hạn như xác định một thao tác chụm bàn di chuột bằng hai ngón tay tuỳ chỉnh, hoặc các bản dịch đầu vào này không cung cấp các sự kiện nhập như ứng dụng mong đợi, bạn có thể tắt chế độ dịch đầu vào bằng cách thêm thẻ sau vào tệp kê khai Android:
<uses-feature android:name="android.hardware.type.pc" android:required="false" />