ในอุปกรณ์หน้าจอขนาดใหญ่ ผู้ใช้มักจะโต้ตอบกับแอปโดยใช้แป้นพิมพ์ เมาส์ ทัชแพด สไตลัส หรือเกมแพด หากต้องการเปิดใช้แอปให้ยอมรับอินพุตจากอุปกรณ์ภายนอก ให้ทำดังนี้
- ทดสอบการรองรับแป้นพิมพ์พื้นฐาน เช่น Ctrl+Z สำหรับการเลิกทำ Ctrl+C สำหรับการคัดลอก และ Ctrl+S สำหรับการบันทึก ดูรายการแป้นพิมพ์ลัดเริ่มต้นได้ที่ส่วนจัดการการดำเนินการของแป้นพิมพ์
- ทดสอบการรองรับแป้นพิมพ์ขั้นสูง เช่น การไปยังส่วนต่างๆ ของแป้นพิมพ์ด้วยปุ่ม Tab และปุ่มลูกศร การยืนยันการป้อนข้อความด้วยปุ่ม Enter และการเล่นและหยุดชั่วคราวด้วยแป้น Spacebar ในแอปสื่อ
- ทดสอบการโต้ตอบของเมาส์ขั้นพื้นฐาน ซึ่งรวมถึงการคลิกขวาเพื่อเปิดเมนูบริบท การเปลี่ยนแปลงไอคอนเมื่อวางเมาส์เหนือ และเหตุการณ์การเลื่อนด้วยเม้าส์หรือแทร็กแพดในคอมโพเนนต์ที่กําหนดเอง
- ทดสอบอุปกรณ์อินพุตเฉพาะแอป เช่น สไตลัส เกมคอนโทรลเลอร์ และตัวควบคุม MIDI ของแอปเพลง
- พิจารณารองรับอินพุตขั้นสูงที่อาจทำให้แอปโดดเด่นในสภาพแวดล้อมเดสก์ท็อป เช่น ใช้ทัชแพดเป็นครอสเฟดเดอร์สำหรับแอปดีเจ การจับภาพเมาส์สำหรับเกม และแป้นพิมพ์ลัดสำหรับผู้ใช้ที่เน้นแป้นพิมพ์
แป้นพิมพ์
วิธีที่แอปตอบสนองต่อการป้อนข้อมูลด้วยแป้นพิมพ์ส่งผลต่อประสบการณ์ของผู้ใช้บนหน้าจอขนาดใหญ่ อินพุตจากแป้นพิมพ์มี 3 ประเภท ได้แก่ การนําทาง การกดแป้น และแป้นพิมพ์ลัด
การไปยังรายการต่างๆ
การนำทางด้วยแป้นพิมพ์ไม่ค่อยมีการใช้งานในแอปที่เน้นการสัมผัส แต่ผู้ใช้จะคาดหวังเมื่อใช้แอปและมืออยู่บนแป้นพิมพ์ การไปยังส่วนต่างๆ ด้วยแป้นพิมพ์อาจจำเป็นในโทรศัพท์ แท็บเล็ต อุปกรณ์แบบพับ และเดสก์ท็อปสำหรับผู้ใช้ที่ต้องการการช่วยเหลือพิเศษ
สําหรับแอปจํานวนมาก เฟรมเวิร์ก Android จะจัดการการไปยังส่วนต่างๆ ด้วยปุ่มลูกศรและปุ่ม Tab โดยอัตโนมัติ ตัวอย่างเช่น คอมโพสิเบิลบางรายการจะโฟกัสได้โดยค่าเริ่มต้น เช่น Button
หรือคอมโพสิเบิลที่มีตัวแก้ไข clickable
โดยปกติแล้ว การไปยังส่วนต่างๆ ด้วยแป้นพิมพ์ควรใช้งานได้โดยไม่ต้องมีโค้ดเพิ่มเติม หากต้องการเปิดใช้การไปยังส่วนต่างๆ ด้วยแป้นพิมพ์สำหรับคอมโพสิชันที่กำหนดเองซึ่งโฟกัสไม่ได้โดยค่าเริ่มต้น ให้เพิ่มตัวแก้ไข focusable
ดังนี้
var color by remember { mutableStateOf(Green) } Box( Modifier .background(color) .onFocusChanged { color = if (it.isFocused) Blue else Green } .focusable() ) { Text("Focusable 1") }
ดูข้อมูลเพิ่มเติมได้ที่การทําให้คอมโพสิเบิลโฟกัสได้
เมื่อเปิดใช้โฟกัส เฟรมเวิร์ก Android จะสร้างการแมปการนําทางสําหรับคอมโพเนนต์ที่โฟกัสได้ทั้งหมดตามตําแหน่ง ซึ่งโดยปกติแล้วจะทํางานตามที่คาดไว้และไม่จำเป็นต้องมีการพัฒนาเพิ่มเติม
อย่างไรก็ตาม Compose อาจไม่ได้ระบุรายการถัดไปที่ถูกต้องเสมอไปสำหรับการไปยังส่วนต่างๆ ของคอมโพสิชันที่ซับซ้อน เช่น แท็บและรายการ ในกรณีที่คอมโพสิชันรายการใดรายการหนึ่งเลื่อนแนวนอนและมองเห็นได้ไม่เต็ม
หากต้องการควบคุมลักษณะการโฟกัส ให้เพิ่มตัวแก้ไข focusGroup
ไปยังคอมโพสิเบิลหลักของคอลเล็กชันคอมโพสิเบิล โฟกัสจะย้ายไปยังกลุ่ม จากนั้นจะย้ายไปทั่วทั้งกลุ่มก่อนที่จะไปยังคอมโพเนนต์ถัดไปที่โฟกัสได้ ตัวอย่างเช่น
Row {
Column(Modifier.focusGroup()) {
Button({}) { Text("Row1 Col1") }
Button({}) { Text("Row2 Col1") }
Button({}) { Text("Row3 Col1") }
}
Column(Modifier.focusGroup()) {
Button({}) { Text("Row1 Col2") }
Button({}) { Text("Row2 Col2") }
Button({}) { Text("Row3 Col2") }
}
}
ดูข้อมูลเพิ่มเติมได้ที่ให้การนำทางที่สอดคล้องกันด้วยกลุ่มเป้าหมาย
ทดสอบการเข้าถึงองค์ประกอบ UI ทั้งหมดของแอปโดยใช้แป้นพิมพ์เท่านั้น องค์ประกอบที่ใช้บ่อยควรเข้าถึงได้โดยไม่ต้องใช้เมาส์หรือการป้อนข้อมูลด้วยการสัมผัส
โปรดทราบว่าการรองรับแป้นพิมพ์อาจจำเป็นสำหรับผู้ใช้ที่มีความต้องการด้านการช่วยเหลือพิเศษ
การกดแป้นพิมพ์
สําหรับการป้อนข้อความที่จะจัดการโดยแป้นพิมพ์เสมือนบนหน้าจอ (IME) เช่น
TextField
แอปควรทํางานตามที่คาดไว้บนอุปกรณ์หน้าจอขนาดใหญ่โดยไม่ต้องมีการพัฒนาเพิ่มเติม สําหรับการกดแป้นพิมพ์ที่เฟรมเวิร์กคาดการณ์ไม่ได้ แอปจะต้องจัดการลักษณะการทํางานด้วยตนเอง โดยเฉพาะอย่างยิ่งสำหรับแอปที่มีมุมมองที่กำหนดเอง
ตัวอย่างบางส่วน ได้แก่ แอปรับแชทที่ใช้แป้น Enter เพื่อส่งข้อความ แอปสื่อที่เริ่มและหยุดเล่นด้วยแป้น Spacebar และเกมที่ควบคุมการเคลื่อนไหวด้วยแป้น w, a, s และ d
คุณสามารถจัดการการกดแป้นพิมพ์แต่ละครั้งด้วยตัวแก้ไข onKeyEvent
ซึ่งจะรับ Lambda ที่เรียกใช้เมื่อคอมโพเนนต์ที่แก้ไขได้รับเหตุการณ์การกดแป้นพิมพ์
พร็อพเพอร์ตี้ KeyEvent#type
ช่วยให้คุณระบุได้ว่าเหตุการณ์เป็นการกดแป้น (KeyDown
) หรือการปล่อยแป้น (KeyUp
) ดังนี้
Box(
modifier = Modifier.focusable().onKeyEvent {
if(
it.type == KeyEventType.KeyUp &&
it.key == Key.S
) {
doSomething()
true
} else {
false
}
}
) {
Text("Press S key")
}
หรือจะลบล้างการเรียกกลับ onKeyUp()
และเพิ่มลักษณะการทำงานที่คาดไว้สำหรับคีย์โค้ดแต่ละรายการที่ได้รับก็ได้ โดยทำดังนี้
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) } }
เหตุการณ์ onKeyUp
เกิดขึ้นเมื่อมีการปล่อยแป้น การใช้การเรียกกลับจะช่วยป้องกันไม่ให้แอปต้องประมวลผลเหตุการณ์ onKeyDown
หลายรายการหากมีการกดแป้นค้างไว้หรือปล่อยช้าๆ เกมและแอปที่ต้องตรวจจับเวลาที่กดแป้นหรือว่าผู้ใช้กดแป้นค้างไว้หรือไม่ สามารถฟังเหตุการณ์ onKeyDown
และจัดการเหตุการณ์ onKeyDown
ซ้ำได้เอง
ดูข้อมูลเพิ่มเติมได้ที่จัดการการดําเนินการของแป้นพิมพ์
ทางลัด
แป้นพิมพ์ลัดทั่วไปที่มีแป้น Ctrl, Alt, Shift และ Meta จะใช้ได้เมื่อใช้แป้นพิมพ์ฮาร์ดแวร์ หากแอปไม่มีการใช้แป้นพิมพ์ลัด ผู้ใช้อาจได้รับประสบการณ์การใช้งานที่น่าหงุดหงิด ผู้ใช้ขั้นสูงยังชื่นชอบแป้นพิมพ์ลัดสำหรับงานเฉพาะแอปที่ใช้บ่อยด้วย ทางลัดช่วยให้แอปใช้งานได้ง่ายขึ้นและแตกต่างจากแอปที่ไม่มีทางลัด
แป้นพิมพ์ลัดทั่วไปบางรายการ ได้แก่ Ctrl+S (บันทึก), Ctrl+Z (เลิกทำ) และ Ctrl+Shift+Z (ทำซ้ำ) ดูรายการแป้นพิมพ์ลัดเริ่มต้นได้ที่หัวข้อจัดการการดําเนินการของแป้นพิมพ์
ออบเจ็กต์ KeyEvent
มีแอตทริบิวต์ต่อไปนี้ซึ่งระบุว่ามีการกดแป้นแปรสภาพหรือไม่
เช่น
Box(
Modifier.onKeyEvent {
if (it.isAltPressed && it.key == Key.A) {
println("Alt + A is pressed")
true
} else {
false
}
}
.focusable()
)
ดูข้อมูลเพิ่มเติมได้ที่
สไตลัส
อุปกรณ์หน้าจอขนาดใหญ่จำนวนมากมาพร้อมกับสไตลัส แอป Android จะจัดการปากกาสไตลัสเป็นการป้อนข้อมูลด้วยหน้าจอสัมผัส อุปกรณ์บางเครื่องอาจมีแท็บเล็ตวาดภาพแบบ USB หรือบลูทูธด้วย เช่น Wacom Intuos แอป Android รับอินพุตบลูทูธได้ แต่ไม่รับอินพุต USB
หากต้องการเข้าถึงวัตถุ MotionEvent
ของสไตลัส ให้เพิ่มตัวแก้ไข pointerInteropFilter
ลงในพื้นผิวการวาด ใช้คลาส ViewModel
ที่มีเมธอดที่ประมวลผลเหตุการณ์การเคลื่อนไหว โดยส่งเมธอดเป็น onTouchEvent
lambda ของข้อบังคับ pointerInteropFilter
ดังนี้
@Composable
@OptIn(ExperimentalComposeUiApi::class)
fun DrawArea(modifier: Modifier = Modifier) {
Canvas(modifier = modifier
.clipToBounds()
.pointerInteropFilter {
viewModel.processMotionEvent(it)
}
) {
// Drawing code here.
}
}
ออบเจ็กต์ MotionEvent
มีข้อมูลเกี่ยวกับเหตุการณ์ ดังนี้
MotionEvent#getToolType()
จะแสดงผลเป็นTOOL_TYPE_FINGER
,TOOL_TYPE_STYLUS
หรือTOOL_TYPE_ERASER
โดยขึ้นอยู่กับเครื่องมือที่สัมผัสกับจอแสดงผลMotionEvent#getPressure()
รายงานแรงกดดันทางกายภาพที่กดลงบนปากกาสไตลัส (หากรองรับ)MotionEvent#getAxisValue()
พร้อมMotionEvent.AXIS_TILT
และMotionEvent.AXIS_ORIENTATION
ระบุการเอียงและการวางแนวของสไตลัส (หากรองรับ)
จุดที่ผ่านมา
Android จะจัดกลุ่มเหตุการณ์อินพุตและส่งเหตุการณ์ดังกล่าว 1 ครั้งต่อเฟรม ปากกาสไตลัสสามารถรายงานเหตุการณ์ได้บ่อยกว่าจอแสดงผล เมื่อสร้างแอปวาดภาพ ให้ตรวจสอบเหตุการณ์ที่อาจเกิดขึ้นในช่วงที่ผ่านมาโดยใช้ getHistorical
API ต่อไปนี้
MotionEvent#getHistoricalX()
MotionEvent#getHistoricalY()
MotionEvent#getHistoricalPressure()
MotionEvent#getHistoricalAxisValue()
การปฏิเสธฝ่ามือ
เมื่อผู้ใช้วาด เขียน หรือโต้ตอบกับแอปโดยใช้สไตลัส บางครั้งผู้ใช้อาจแตะหน้าจอด้วยฝ่ามือ ระบบจะรายงานเหตุการณ์การสัมผัส (ตั้งค่าเป็น ACTION_DOWN
หรือ ACTION_POINTER_DOWN
) ไปยังแอปของคุณได้ก่อนที่จะจดจำและละเว้นการสัมผัสด้วยฝ่ามือโดยไม่ตั้งใจ
Android จะยกเลิกเหตุการณ์การแตะด้วยฝ่ามือโดยการส่ง MotionEvent
หากแอปได้รับ ACTION_CANCEL
ให้ยกเลิกท่าทางสัมผัส หากแอปได้รับ ACTION_POINTER_UP
ให้ตรวจสอบว่าได้ตั้งค่า FLAG_CANCELED
ไว้หรือไม่ หากใช่ ให้ยกเลิกท่าทาง
อย่าตรวจสอบเฉพาะ FLAG_CANCELED
ใน Android 13 (API ระดับ 33) ขึ้นไป ระบบจะตั้งค่า FLAG_CANCELED
สําหรับเหตุการณ์ ACTION_CANCEL
แต่จะไม่ตั้งค่า Flag ใน Android เวอร์ชันที่ต่ำกว่า
Android 12
ใน Android 12 (API ระดับ 32) และต่ำกว่า การตรวจจับการปฏิเสธฝ่ามือจะเป็นไปได้สำหรับเหตุการณ์การแตะด้วยปลายนิ้วเพียงนิ้วเดียวเท่านั้น หากการสัมผัสด้วยฝ่ามือเป็นเคอร์เซอร์เพียงอย่างเดียว ระบบจะยกเลิกเหตุการณ์โดยการตั้งค่า ACTION_CANCEL
ในออบเจ็กต์เหตุการณ์การเคลื่อนไหว หากเคอร์เซอร์อื่นๆ อยู่ต่ำ ระบบจะตั้งค่าเป็น ACTION_POINTER_UP
ซึ่งไม่เพียงพอที่จะตรวจจับการปฏิเสธฝ่ามือ
Android 13
ใน Android 13 (API ระดับ 33) ขึ้นไป หากการสัมผัสด้วยฝ่ามือเป็นเคอร์เซอร์เพียงอย่างเดียว ระบบจะยกเลิกเหตุการณ์โดยตั้งค่า ACTION_CANCEL
และ FLAG_CANCELED
ในออบเจ็กต์เหตุการณ์การเคลื่อนไหว หากเคอร์เซอร์อื่นๆ อยู่ต่ำ ระบบจะตั้งค่าเป็น ACTION_POINTER_UP
และ FLAG_CANCELED
เมื่อใดก็ตามที่แอปของคุณได้รับเหตุการณ์การเคลื่อนไหวที่มี ACTION_POINTER_UP
ให้ตรวจสอบ FLAG_CANCELED
เพื่อดูว่าเหตุการณ์บ่งบอกถึงการปฏิเสธฝ่ามือ (หรือการยกเลิกเหตุการณ์อื่นๆ) หรือไม่
แอปการจดบันทึก
ChromeOS มี Intent พิเศษที่แสดงแอปจดโน้ตที่ลงทะเบียนไว้ให้ผู้ใช้ หากต้องการลงทะเบียนแอปเป็นแอปเทมเพลตโน้ต ให้เพิ่มข้อมูลต่อไปนี้ลงในไฟล์ Manifest ของแอป
<intent-filter>
<action android:name="org.chromium.arc.intent.action.CREATE_NOTE" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
เมื่อลงทะเบียนแอปกับระบบแล้ว ผู้ใช้จะเลือกแอปนั้นเป็นแอปจดบันทึกเริ่มต้นได้ เมื่อมีการขอโน้ตใหม่ แอปควรสร้างโน้ตเปล่าที่พร้อมสำหรับการป้อนข้อมูลด้วยสไตลัส เมื่อผู้ใช้ต้องการกำกับเนื้อหาในรูปภาพ (เช่น ภาพหน้าจอหรือรูปภาพที่ดาวน์โหลด) แอปจะเปิดขึ้นพร้อมClipData
ที่มีรายการอย่างน้อย 1 รายการที่มี URI content://
แอปควรสร้างโน้ตที่ใช้รูปภาพที่แนบมารูปแรกเป็นภาพพื้นหลังและเข้าสู่โหมดที่ผู้ใช้วาดบนหน้าจอด้วยสไตลัสได้
ทดสอบความตั้งใจในการจดบันทึกโดยไม่ต้องใช้สไตลัส
[TBD remove section.]
หากต้องการทดสอบว่าแอปตอบสนองต่อความตั้งใจในการจดบันทึกโดยไม่ใช้ปากกาสไตลัสแบบมีแบตเตอรี่อย่างถูกต้องหรือไม่ ให้ใช้วิธีต่อไปนี้เพื่อแสดงตัวเลือกการจดบันทึกใน ChromeOS
- เปลี่ยนไปใช้โหมดนักพัฒนาซอฟต์แวร์และทำให้อุปกรณ์เขียนได้
- กด Ctrl+Alt+F2 เพื่อเปิดเทอร์มินอล
- เรียกใช้คําสั่ง
sudo vi /etc/chrome_dev.conf
- กด
i
เพื่อแก้ไขและเพิ่ม--ash-enable-palette
ไปยังบรรทัดใหม่ท้ายไฟล์ - บันทึกโดยกด Esc แล้วพิมพ์ :, w, q แล้วกด Enter
- กด Ctrl+Alt+F1 เพื่อกลับไปที่ UI ของ ChromeOS ปกติ
- ออกจากระบบแล้วลงชื่อเข้าใช้อีกครั้ง
ตอนนี้เมนูสไตลัสควรอยู่บนชั้นวางแล้ว
- แตะปุ่มสไตลัสบนชั้นวาง แล้วเลือกโน้ตใหม่ ซึ่งจะเป็นการเปิดโน้ตภาพวาดเปล่า
- ถ่ายภาพหน้าจอ จากชั้นวาง ให้เลือกปุ่มสไตลัส > จับภาพหน้าจอ หรือดาวน์โหลดรูปภาพ คุณควรเห็นตัวเลือกกำกับเนื้อหารูปภาพในการแจ้งเตือน ซึ่งจะเป็นการเปิดแอปพร้อมรูปภาพที่พร้อมกำกับเนื้อหา
การรองรับเมาส์และทัชแพด
โดยทั่วไปแล้ว แอปส่วนใหญ่ต้องจัดการเหตุการณ์ที่เน้นหน้าจอขนาดใหญ่เพียง 3 รายการเท่านั้น ได้แก่ คลิกขวา วางเมาส์เหนือ และลากและวาง
คลิกขวา
การดำเนินการใดๆ ที่ทําให้แอปแสดงเมนูตามบริบท เช่น การแตะรายการในรายการค้างไว้ ควรตอบสนองต่อเหตุการณ์คลิกขวาด้วย
หากต้องการจัดการเหตุการณ์คลิกขวา แอปควรลงทะเบียน View.OnContextClickListener
ดังนี้
Box(modifier = Modifier.fillMaxSize()) {
AndroidView(
modifier = Modifier.fillMaxSize(),
factory = { context ->
val rootView = FrameLayout(context)
val onContextClickListener =
View.OnContextClickListener { view ->
showContextMenu()
true
}
rootView.setOnContextClickListener(onContextClickListener)
rootView
},
)
}
ดูรายละเอียดการสร้างเมนูตามบริบทได้ที่หัวข้อสร้างเมนูตามบริบท
วางเมาส์
คุณทำให้เลย์เอาต์แอปดูเรียบร้อยและใช้งานได้ง่ายขึ้นได้ด้วยการจัดการเหตุการณ์การโฮเวอร์ โดยเฉพาะอย่างยิ่งสำหรับคอมโพเนนต์ที่กําหนดเอง
ตัวอย่างที่พบบ่อยที่สุด 2 ตัวอย่างมีดังนี้
- บ่งชี้ให้ผู้ใช้ทราบว่าองค์ประกอบมีลักษณะการทำงานแบบอินเทอร์แอกทีฟหรือไม่ เช่น คลิกได้หรือแก้ไขได้ โดยการเปลี่ยนไอคอนเคอร์เซอร์เมาส์
- การเพิ่มการตอบกลับด้วยภาพให้กับรายการในรายการหรือตารางกริดขนาดใหญ่เมื่อเคอร์เซอร์วางอยู่เหนือรายการ
ลากและวาง
ในสภาพแวดล้อมแบบหลายหน้าต่าง ผู้ใช้คาดหวังว่าจะลากและวางรายการต่างๆ ระหว่างแอปได้ ซึ่งรวมถึงอุปกรณ์เดสก์ท็อป รวมถึงแท็บเล็ต โทรศัพท์ และอุปกรณ์แบบพับได้ในโหมดแยกหน้าจอ
พิจารณาว่าผู้ใช้มีแนวโน้มที่จะลากรายการต่างๆ ไปยังแอปหรือไม่ เช่น โปรแกรมแต่งภาพควรได้รับรูปภาพ เครื่องเล่นเสียงควรได้รับไฟล์เสียง และโปรแกรมวาดภาพควรได้รับรูปภาพ
หากต้องการเพิ่มการรองรับการลากและวาง โปรดดูหัวข้อ การลากและวาง และอ่านบล็อกโพสต์Android ใน ChromeOS - การใช้การลากและวาง
ข้อควรพิจารณาพิเศษสำหรับ ChromeOS
- อย่าลืมขอสิทธิ์จาก
requestDragAndDropPermissions()
เพื่อเข้าถึงรายการที่ลากมาจากภายนอกแอป รายการต้องมี Flag
View.DRAG_FLAG_GLOBAL
จึงจะลากไปยังแอปพลิเคชันอื่นๆ ได้
การรองรับเคอร์เซอร์ขั้นสูง
แอปที่จัดการอินพุตของเมาส์และทัชแพดขั้นสูงควรใช้ตัวแก้ไข
pointerInput
เพื่อรับ PointerEvent
@Composable private fun LogPointerEvents(filter: PointerEventType? = null) { var log by remember { mutableStateOf("") } Column { Text(log) Box( Modifier .size(100.dp) .background(Color.Red) .pointerInput(filter) { awaitPointerEventScope { while (true) { val event = awaitPointerEvent() // handle pointer event if (filter == null || event.type == filter) { log = "${event.type}, ${event.changes.first().position}" } } } } ) } }
ตรวจสอบออบเจ็กต์ PointerEvent
เพื่อพิจารณาสิ่งต่อไปนี้
PointerType
: เมาส์ สไตลัส การสัมผัส และอื่นๆ จากPointerEvent#changes
PointerEventType
: การดำเนินการของเคอร์เซอร์ เช่น การกด เลื่อน เลื่อน และปล่อย
เกมคอนโทรลเลอร์
อุปกรณ์ Android บางรุ่นที่มีหน้าจอขนาดใหญ่รองรับตัวควบคุมเกมได้สูงสุด 4 ตัว ใช้ API ตัวควบคุมเกม Android มาตรฐานเพื่อจัดการตัวควบคุมเกม (ดูการรองรับตัวควบคุมเกม)
ปุ่มของเกมคอนโทรลเลอร์จะแมปกับค่าทั่วไปตามการแมปทั่วไป แต่ผู้ผลิตเกมคอนโทรลเลอร์บางรายไม่ได้ใช้รูปแบบการแมปเดียวกัน คุณสามารถมอบประสบการณ์การใช้งานที่ดีขึ้นมากหากอนุญาตให้ผู้ใช้เลือกการแมปคอนโทรลเลอร์ยอดนิยมแบบต่างๆ ดูข้อมูลเพิ่มเติมที่ประมวลผลการกดปุ่มเกมแพด
โหมดการแปลอินพุต
ChromeOS จะเปิดใช้โหมดการแปลภาษาสำหรับการป้อนข้อมูลโดยค่าเริ่มต้น สําหรับแอป Android ส่วนใหญ่ โหมดนี้จะช่วยให้แอปทํางานตามที่คาดไว้ในสภาพแวดล้อมเดสก์ท็อป ตัวอย่างบางส่วน ได้แก่ การเปิดใช้การเลื่อนด้วย 2 นิ้วบนทัชแพด การเลื่อนด้วยเม้าส์ และการแมปพิกัดการแสดงผลดิบกับพิกัดของหน้าต่างโดยอัตโนมัติ โดยทั่วไปแล้ว นักพัฒนาแอปไม่จำเป็นต้องใช้ลักษณะการทำงานเหล่านี้ด้วยตนเอง
หากแอปใช้ลักษณะการป้อนข้อมูลที่กำหนดเอง เช่น การกําหนดการกระทําการบีบสองนิ้วบนทัชแพด หรือการเปลี่ยนรูปแบบการป้อนข้อมูลเหล่านี้ไม่ได้ให้เหตุการณ์การป้อนข้อมูลตามที่แอปคาดไว้ คุณสามารถปิดใช้โหมดการเปลี่ยนรูปแบบการป้อนข้อมูลได้โดยเพิ่มแท็กต่อไปนี้ลงในไฟล์ Manifest ของ Android
<uses-feature
android:name="android.hardware.type.pc"
android:required="false" />