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

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

  • ทดสอบการรองรับแป้นพิมพ์พื้นฐาน เช่น 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 มีข้อมูลเกี่ยวกับเหตุการณ์ ดังนี้

จุดที่ผ่านมา

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

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

เมื่อผู้ใช้วาด เขียน หรือโต้ตอบกับแอปโดยใช้สไตลัส บางครั้งผู้ใช้อาจแตะหน้าจอด้วยฝ่ามือ ระบบจะรายงานเหตุการณ์การสัมผัส (ตั้งค่าเป็น 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

  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" />

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