ความเข้ากันได้ของอินพุต

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

นักพัฒนาแอปที่ต้องการให้แอปทำงานได้ดีกับอินพุตใน ChromeOS และอุปกรณ์ Android อื่นๆ ที่มีหน้าจอขนาดใหญ่ควรพิจารณาการเพิ่มประสิทธิภาพต่อไปนี้

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

แป้นพิมพ์

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

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

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

yourView.isFocusable = true

หรือจะตั้งค่าแอตทริบิวต์ focusable ในไฟล์เลย์เอาต์ก็ได้ โดยทำดังนี้

android:focusable="true"

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

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

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

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

การกดแป้นพิมพ์

สำหรับการป้อนข้อความที่แป้นพิมพ์เสมือนบนหน้าจอ (IME) จะจัดการ เช่น EditText แอปควรทำงานตามที่คาดไว้ใน ChromeOS โดยที่นักพัฒนาแอปไม่ต้องทำอะไรเพิ่มเติม สำหรับปุ่มกดที่เฟรมเวิร์กคาดการณ์ไม่ได้ แอปจะต้องจัดการลักษณะการทำงานด้วยตนเอง โดยเฉพาะอย่างยิ่งสำหรับแอปที่มีมุมมองที่กำหนดเอง

ตัวอย่างเช่น แอปแชทที่ใช้ปุ่ม Enter เพื่อส่งข้อความ แอปสื่อที่เริ่ม/หยุดเล่นด้วยปุ่ม Space และเกมที่ควบคุมการเคลื่อนไหวด้วยปุ่ม w, a, s และ d

แอปส่วนใหญ่จะลบล้างเหตุการณ์ 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 ได้

การลบล้าง onKeyUp สำหรับทั้ง Activity มักจะให้ลักษณะการทำงานที่ต้องการ ทั้งนี้ขึ้นอยู่กับความต้องการของแอป หากจำเป็น คุณสามารถเพิ่มonKeyListenerลงในข้อมูลพร็อพเพอร์ตี้ที่เฉพาะเจาะจงแทนได้ ตัวอย่างเช่น แอปอาจรับฟังเฉพาะแป้น Enter ใน EditText ที่เฉพาะเจาะจงเท่านั้น ไม่ใช่ใน Activity เพื่อใช้ฟังก์ชันการส่งเมื่อผู้ใช้พิมพ์ในช่องแชทเท่านั้น

เมื่อเพิ่มการรองรับแป้นพิมพ์ ให้ทำตามเอกสารประกอบการจัดการแป้นพิมพ์ของ Android

ทางลัด

คาดว่าจะมีแป้นพิมพ์ลัดที่ใช้ ctrl, alt และ shift ทั่วไปในสภาพแวดล้อมบนเดสก์ท็อป หากแอปไม่ได้ใช้ฟีเจอร์เหล่านี้ ผู้ใช้อาจรู้สึกหงุดหงิดและได้รับประสบการณ์ที่ไม่ดี นอกจากนี้ ผู้ใช้ขั้นสูงยังชื่นชอบแป้นพิมพ์ลัดสำหรับงานเฉพาะแอปที่ใช้บ่อยด้วย ทางลัดช่วยให้แอปใช้งานง่ายขึ้นและแตกต่างจากแอปที่ไม่มีทางลัด

แป้นพิมพ์ลัดที่ใช้กันโดยทั่วไป ได้แก่ บันทึก (ctrl+s) เลิกทำ (ctrl+z) และทำซ้ำ (ctrl+shift+z) ตัวอย่างแป้นพิมพ์ลัดขั้นสูงเพิ่มเติมบางส่วน โปรดดูรายการแป้นพิมพ์ลัดของ VLC Media Player

คุณใช้ dispatchKeyShortcutEvent เพื่อสร้างทางลัดได้ ซึ่งจะสกัดกั้นการผสมคีย์เมตาทั้งหมด (alt, ctrl และ shift) สำหรับรหัสคีย์ที่กำหนด หากต้องการตรวจสอบเมตาคีย์ที่เฉพาะเจาะจง ให้ใช้ KeyEvent.isCtrlPressed(), KeyEvent.isShiftPressed(), KeyEvent.isAltPressed() หรือ KeyEvent.hasModifiers()

การแยกโค้ดแป้นพิมพ์ลัดจากการจัดการการกดแป้นอื่นๆ (เช่น onKeyUp หรือ onKeyDown) จะช่วยให้การบำรุงรักษาโค้ดง่ายขึ้น และยังคงการยอมรับเริ่มต้นของปุ่ม Meta โดยไม่ต้องใช้การตรวจสอบปุ่ม Meta ด้วยตนเองในทุกกรณี การอนุญาตให้ใช้การผสมปุ่มเมตาทั้งหมดอาจสะดวกกว่าสำหรับผู้ใช้ที่คุ้นเคยกับเลย์เอาต์แป้นพิมพ์และระบบปฏิบัติการที่แตกต่างกัน

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

นอกจากนี้ คุณยังใช้ทางลัดใน onKeyUp ได้ด้วยโดยการตรวจสอบ KeyEvent.isCtrlPressed(), KeyEvent.isShiftPressed() หรือ KeyEvent.isAltPressed() ในลักษณะเดียวกัน ซึ่งอาจดูแลรักษาง่ายกว่าหากลักษณะการทำงานระดับเมตาเป็นการแก้ไขลักษณะการทำงานของแอปมากกว่าทางลัด เช่น เมื่อ w หมายถึง "เดินหน้า" และ shift+w หมายถึง "วิ่งไปข้างหน้า"

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

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

ChromeOS จะจัดการเหตุการณ์ของเมาส์และแทร็กแพดส่วนใหญ่โดยอัตโนมัติเพื่อให้ทำงานเหมือนเหตุการณ์แบบสัมผัสในโทรศัพท์ Android ซึ่งรวมถึงการเลื่อนด้วยทัชแพด/ล้อเมาส์ 2 นิ้ว โดยทั่วไปแล้ว แอปส่วนใหญ่จะจัดการเหตุการณ์ที่เน้นเดสก์ท็อปเพียง 3 รายการ ได้แก่ คลิกขวา วางเมาส์ และลากและวาง

คลิกขวา

การดำเนินการใดๆ ที่ทำให้แอปแสดงเมนูตามบริบท เช่น การกดรายการในรายการค้างไว้ ควรตอบสนองต่อเหตุการณ์การคลิกขวาด้วย หากต้องการจัดการเหตุการณ์คลิกขวา แอปควรลงทะเบียน View.OnContextClickListener ดูรายละเอียดเกี่ยวกับการสร้างเมนูตามบริบทได้ในเอกสารประกอบเกี่ยวกับเมนูตามบริบทของ Android

yourView.setOnContextClickListener { view ->
  showContextMenu()
  true
}

หมายเหตุ: มุมมองใดก็ตามที่ลงทะเบียนสำหรับเมนูบริบทโดยใช้ Activity.registerForContextMenu() ควรทำงานร่วมกับการกดค้างและการคลิกขวาโดยอัตโนมัติโดยไม่ต้องลงทะเบียนเครื่องมือฟังการคลิกบริบท

วางเมาส์

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

  • ระบุให้ผู้ใช้ทราบว่าองค์ประกอบมีลักษณะการทำงานแบบอินเทอร์แอกทีฟ เช่น คลิกได้หรือแก้ไขได้ โดยการเปลี่ยนไอคอนเคอร์เซอร์เมาส์
  • เพิ่มการตอบกลับด้วยภาพไปยังรายการในรายการหรือตารางกริดขนาดใหญ่เมื่อวางเคอร์เซอร์เหนือรายการ
// 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.
}

ลากและวาง

ในสภาพแวดล้อมแบบหลายหน้าต่าง ผู้ใช้คาดหวังว่าจะสามารถลากและวางรายการระหว่างแอปได้ ซึ่งรวมถึงอุปกรณ์ ChromeOS ตลอดจนแท็บเล็ต โทรศัพท์ และอุปกรณ์แบบพับได้ในโหมดแยกหน้าจอ

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

หากต้องการเพิ่มการรองรับการลากและวาง ให้ทำตามเอกสารประกอบการลากและวางของ Android และดูบล็อกโพสต์เกี่ยวกับ ChromeOS นี้

ข้อควรพิจารณาพิเศษสำหรับ ChromeOS

  • หากต้องการจัดการไฟล์จากแอปไฟล์ของ ChromeOS ให้มองหาประเภท MIME application/x-arc-uri-list
  • อย่าลืมขอสิทธิ์โดยใช้ requestDragAndDropPermissions เพื่อเข้าถึงรายการที่ลากจากภายนอกแอป
  • รายการต้องมีธง View.DRAG_FLAG_GLOBAL เพื่อลากไปยังแอปพลิเคชันอื่นๆ

การรองรับการเลือกหลายรายการ

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

ตัวอย่างการเลือกหลายรายการในแถบด้วยเมาส์และเคอร์เซอร์

การรองรับเคอร์เซอร์ขั้นสูง

แอปที่จัดการอินพุตจากเมาส์และทัชแพดขั้นสูงควรทำตามเอกสารประกอบของ Android สำหรับ View.onGenericMotionEvent() และใช้ MotionEvent.getSource() เพื่อแยกความแตกต่างระหว่าง SOURCE_MOUSE กับ SOURCE_TOUCHSCREEN

ตรวจสอบ MotionEvent เพื่อใช้ลักษณะการทำงานที่จำเป็น

  • การเคลื่อนไหวจะสร้างเหตุการณ์ ACTION_HOVER_MOVE
  • ปุ่มจะสร้างเหตุการณ์ ACTION_BUTTON_PRESS และ ACTION_BUTTON_RELEASE นอกจากนี้ คุณยังตรวจสอบสถานะปัจจุบันของปุ่มเมาส์/แทร็กแพดทั้งหมดได้โดยใช้ getButtonState()
  • การเลื่อนล้อของเมาส์จะสร้างเหตุการณ์ ACTION_SCROLL

สไตลัส

Chromebook หลายรุ่นมาพร้อมกับสไตลัส และแอป Android จะจัดการสไตลัสเป็นการป้อนข้อมูลด้วยหน้าจอสัมผัส อุปกรณ์บางอย่างอาจมีแท็บเล็ตวาดภาพแบบ USB หรือบลูทูธด้วย เช่น Wacom Intuos แอป Android รับอินพุตบลูทูธได้ แต่จะใช้กับอินพุต USB ไม่ได้

ระบบจะรายงานเหตุการณ์สไตลัสเป็นเหตุการณ์หน้าจอสัมผัสโดยใช้ View.onTouchEvent() หรือ View.onGenericMotionEvent() และมี MotionEvent.getSource() ประเภท SOURCE_STYLUS MotionEvent จะมีข้อมูลเพิ่มเติมต่อไปนี้ด้วย

จุดที่เคยใช้ในอดีต

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

  • MotionEvent.getHistoricalX()
  • MotionEvent.getHistoricalY()
  • MotionEvent.getHistoricalPressure()
  • MotionEvent.getHistoricalAxisValue()

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

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

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

หมายเหตุ: วิธีหนึ่งในการลดเหตุการณ์ฝ่ามือและนิ้วที่ไม่เกี่ยวข้องในแอปวาดภาพและเขียนคือการตั้งค่า UI ที่ปิดใช้การวาดโดยใช้การสัมผัส และใช้เฉพาะเหตุการณ์สไตลัสสำหรับการวาดเมื่ออยู่ในโหมดนี้

แอปจดบันทึก

ChromeOS มี Intent พิเศษที่แสดงแอปจดโน้ตที่ลงทะเบียนไว้ต่อผู้ใช้ หากต้องการลงทะเบียนแอปเป็นแอปจดบันทึก ให้เพิ่มข้อมูลต่อไปนี้ลงในไฟล์ Manifest ของ Android

<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 ในการจดบันทึกอย่างถูกต้องหรือไม่โดยไม่มีสไตลัสที่ใช้งานอยู่ ให้ใช้วิธีต่อไปนี้เพื่อแสดงตัวเลือกการจดบันทึก

  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 ปกติ

ตอนนี้คุณควรเห็นเมนูสไตลัสในชั้นวางแล้ว

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

เกมคอนโทรลเลอร์

Chromebook รองรับตัวควบคุมเกมสูงสุด 4 ตัว นักพัฒนาแอปควรใช้ Game Controller API มาตรฐานของ Android เพื่อจัดการ

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

โหมดแปลอินพุต

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

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

<uses-feature android:name="android.hardware.type.pc"
              android:required="false" />