ความเข้ากันได้ของอินพุตบนหน้าจอขนาดใหญ่

ในอุปกรณ์หน้าจอขนาดใหญ่ ผู้ใช้มักจะโต้ตอบกับแอปโดยใช้แป้นพิมพ์ เมาส์ แทร็กแพด สไตลัส หรือเกมแพด หากต้องการเปิดใช้แอปให้ยอมรับอินพุตจากอุปกรณ์ภายนอก ให้ทำดังนี้

  • ทดสอบการรองรับแป้นพิมพ์พื้นฐาน เช่น Ctrl+Z เพื่อเลิกทำ Ctrl+C เพื่อคัดลอก และ Ctrl+S เพื่อบันทึก ดูรายการแป้นพิมพ์ลัดเริ่มต้นได้ที่หัวข้อจัดการการทำงานของแป้นพิมพ์
  • ทดสอบการรองรับแป้นพิมพ์ขั้นสูง เช่น การไปยังส่วนต่างๆ ด้วยแป้นพิมพ์โดยใช้แป้น Tab และแป้นลูกศร การยืนยันการป้อนข้อความด้วยแป้น Enter และการเล่นและหยุดชั่วคราวด้วยแป้นเว้นวรรคในแอปสื่อ
  • ทดสอบการโต้ตอบพื้นฐานของเมาส์ ซึ่งรวมถึงการคลิกขวาเพื่อเปิดเมนูตามบริบท การเปลี่ยนไอคอนเมื่อวางเมาส์เหนือ และเหตุการณ์การเลื่อนลูกกลิ้งเมาส์หรือแทร็กแพดในคอมโพเนนต์ที่กำหนดเอง
  • ทดสอบอุปกรณ์อินพุตเฉพาะแอป เช่น สไตลัส เกมคอนโทรลเลอร์ และตัวควบคุม MIDI ของแอปเพลง
  • พิจารณาการรองรับอินพุตขั้นสูงที่อาจทำให้แอปโดดเด่นในสภาพแวดล้อมเดสก์ท็อป เช่น ทัชแพดเป็นครอสเฟดเดอร์สำหรับแอปดีเจ การจับเมาส์สำหรับเกม และแป้นพิมพ์ลัดสำหรับผู้ใช้ที่เน้นแป้นพิมพ์

แป้นพิมพ์

วิธีที่แอปตอบสนองต่อการป้อนข้อมูลด้วยแป้นพิมพ์ส่งผลต่อประสบการณ์ของผู้ใช้หน้าจอขนาดใหญ่ การป้อนข้อมูลด้วยแป้นพิมพ์มี 3 ประเภท ได้แก่ การนำทาง การกดแป้นพิมพ์ และแป้นพิมพ์ลัด

การไปยังส่วนต่างๆ โดยใช้แป้นพิมพ์มักไม่ค่อยมีการนำไปใช้ในแอปที่เน้นการสัมผัส แต่ผู้ใช้คาดหวังว่าจะใช้ได้เมื่อใช้แอปและมีแป้นพิมพ์อยู่ตรงหน้า การไปยังส่วนต่างๆ ด้วยแป้นพิมพ์อาจเป็นสิ่งจำเป็นในโทรศัพท์ แท็บเล็ต อุปกรณ์แบบพับได้ และอุปกรณ์เดสก์ท็อปสำหรับผู้ใช้ที่มีความต้องการด้านการช่วยเหลือพิเศษ

สำหรับแอปจำนวนมาก เฟรมเวิร์ก Android จะจัดการการไปยังส่วนต่างๆ ด้วยปุ่มลูกศรและปุ่ม Tab โดยอัตโนมัติ ตัวอย่างเช่น Composable บางรายการจะโฟกัสได้โดยค่าเริ่มต้น เช่น Button หรือ Composable ที่มีตัวแก้ไข clickable โดยทั่วไปแล้ว การไปยังส่วนต่างๆ ด้วยแป้นพิมพ์ควรทำงานได้โดยไม่ต้องมีโค้ดเพิ่มเติม หากต้องการเปิดใช้การไปยังส่วนต่างๆ ด้วยแป้นพิมพ์สำหรับ Composable ที่กำหนดเองซึ่งไม่สามารถโฟกัสได้โดยค่าเริ่มต้น ให้เพิ่มตัวแก้ไข focusable ดังนี้

var color by remember { mutableStateOf(Green) }
Box(
    Modifier
        .background(color)
        .onFocusChanged { color = if (it.isFocused) Blue else Green }
        .focusable()
) {
    Text("Focusable 1")
}

ดูข้อมูลเพิ่มเติมได้ที่การทำให้ Composable โฟกัสได้

เมื่อเปิดใช้โฟกัส เฟรมเวิร์ก Android จะสร้างการแมปการนําทางสําหรับคอมโพเนนต์ที่โฟกัสได้ทั้งหมดตามตําแหน่งของคอมโพเนนต์ ซึ่งมักจะทำงานได้ตามที่คาดไว้ และไม่จำเป็นต้องพัฒนาเพิ่มเติม

อย่างไรก็ตาม Compose ไม่ได้กำหนดรายการถัดไปที่ถูกต้องสำหรับการไปยังส่วนต่างๆ ด้วยแท็บสำหรับ Composable ที่ซับซ้อน เช่น แท็บและรายการเสมอไป เช่น เมื่อ Composable รายการใดรายการหนึ่งเป็นแบบเลื่อนในแนวนอนที่มองเห็นได้ไม่ครบถ้วน

หากต้องการควบคุมลักษณะการโฟกัส ให้เพิ่มตัวแก้ไข focusGroup ลงใน Composable หลักของคอลเล็กชัน Composable โฟกัสจะย้ายไปที่กลุ่ม จากนั้นจะย้ายผ่านกลุ่มก่อนที่จะย้ายไปยังคอมโพเนนต์ที่โฟกัสได้ถัดไป เช่น

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")
}

หรือจะลบล้าง Callback onKeyUp() และเพิ่มลักษณะการทำงานที่คาดไว้สำหรับคีย์โค้ดแต่ละรายการที่ได้รับก็ได้ ดังนี้

kotlin 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 จะเกิดขึ้นเมื่อมีการปล่อยแป้น การใช้ Callback จะช่วยป้องกันไม่ให้แอปต้องประมวลผลเหตุการณ์ 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 ที่มีเมธอดที่ประมวลผลเหตุการณ์การเคลื่อนไหว โดยส่งเมธอดเป็น Lambda onTouchEvent ของตัวแก้ไข pointerInteropFilter ดังนี้

@Composable
@OptIn(ExperimentalComposeUiApi::class)
fun DrawArea(modifier: Modifier = Modifier) {
   Canvas(modifier = modifier
       .clipToBounds()
       .pointerInteropFilter {
           viewModel.processMotionEvent(it)
       }

   ) {
       // Drawing code here.
   }
}

ออบเจ็กต์ MotionEvent มีข้อมูลเกี่ยวกับเหตุการณ์ดังนี้

คะแนนย้อนหลัง

Android จะจัดกลุ่มเหตุการณ์อินพุตและส่งเหตุการณ์เหล่านั้น 1 ครั้งต่อเฟรม สไตลัสสามารถรายงานเหตุการณ์ที่ความถี่สูงกว่าจอแสดงผลมาก เมื่อสร้างแอปวาดภาพ ให้ตรวจสอบเหตุการณ์ที่อาจเกิดขึ้นในอดีตที่ผ่านมาโดยใช้ API getHistorical ดังนี้

การปฏิเสธการสัมผัสจากฝ่ามือ

เมื่อผู้ใช้วาด เขียน หรือโต้ตอบกับแอปโดยใช้สไตลัส บางครั้งผู้ใช้จะแตะหน้าจอด้วยฝ่ามือ ระบบอาจรายงานการโต้ตอบแบบสัมผัส (ตั้งค่าเป็น ACTION_DOWN หรือ ACTION_POINTER_DOWN) ไปยังแอปก่อนที่ระบบจะจดจำและละเว้นการสัมผัสโดยไม่ตั้งใจด้วยฝ่ามือ

Android จะยกเลิกการโต้ตอบแบบสัมผัสด้วยฝ่ามือโดยการส่ง MotionEvent หากแอปได้รับ ACTION_CANCEL ให้ยกเลิกท่าทางสัมผัส หากแอปได้รับ ACTION_POINTER_UP ให้ตรวจสอบว่าได้ตั้งค่า FLAG_CANCELED ไว้หรือไม่ หากเป็นเช่นนั้น ให้ยกเลิกท่าทางสัมผัส

อย่าตรวจสอบเฉพาะ FLAG_CANCELED ใน Android 13 (ระดับ API 33) ขึ้นไป ระบบจะตั้งค่า FLAG_CANCELED สำหรับเหตุการณ์ ACTION_CANCEL แต่ระบบจะไม่ตั้งค่าแฟล็กใน 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:// แอปควรสร้างโน้ตที่ใช้รูปภาพแรกที่แนบมาเป็นภาพพื้นหลัง และเข้าสู่โหมดที่ผู้ใช้สามารถวาดบนหน้าจอด้วยสไตลัสได้

ทดสอบ Intent การจดโน้ตโดยไม่ใช้สไตลัส

หากต้องการทดสอบว่าแอปตอบสนองต่อ Intent การจดโน้ตอย่างถูกต้องโดยไม่มีสไตลัสที่ใช้งานอยู่หรือไม่ ให้ใช้วิธีต่อไปนี้เพื่อแสดงตัวเลือกการจดโน้ตใน ChromeOS

  1. เปลี่ยนเป็นโหมดนักพัฒนาซอฟต์แวร์และทำให้อุปกรณ์เขียนได้
  2. กด Ctrl+Alt+F2 เพื่อเปิดเทอร์มินัล
  3. เรียกใช้คำสั่ง sudo vi /etc/chrome_dev.conf
  4. กด i เพื่อแก้ไขและเพิ่ม --ash-enable-palette ลงในบรรทัดใหม่ที่ท้ายไฟล์
  5. บันทึกโดยกด Esc แล้วพิมพ์ :, w, q และกด Enter
  6. กด Ctrl+Alt+F1 เพื่อกลับไปยัง UI ของ ChromeOS ปกติ
  7. ออกจากระบบแล้วลงชื่อเข้าสู่ระบบอีกครั้ง

เมนูสไตลัสควรจะอยู่บนแถบแล้ว:

  • แตะปุ่มสไตลัสบนแถบและเลือกโน้ตใหม่ ซึ่งจะเปิดโน้ตภาพวาดเปล่าขึ้นมา
  • จับภาพหน้าจอ จากแถบ ให้เลือกปุ่มสไตลัส > จับภาพหน้าจอหรือดาวน์โหลดรูปภาพ คุณควรเห็นตัวเลือกใส่คำอธิบายประกอบรูปภาพในการแจ้งเตือน ซึ่งควรเปิดแอปพร้อมรูปภาพที่พร้อมใส่คำอธิบายประกอบ

การรองรับเมาส์และทัชแพด

โดยทั่วไปแล้ว แอปส่วนใหญ่จำเป็นต้องจัดการเหตุการณ์ที่เน้นหน้าจอขนาดใหญ่เพียง 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

การรองรับตัวชี้ขั้นสูง

แอปที่จัดการอินพุตจากเมาส์และทัชแพดขั้นสูงควรใช้ตัวแก้ไข 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" />

แหล่งข้อมูลเพิ่มเติม