หากต้องการบันทึกและประมวลผลข้อมูลที่ผู้ใช้ป้อนซึ่งส่งไปยังกิจกรรมที่แสดงผล ของแอป หรือหากต้องการใช้ลักษณะการทำงานของทัชแพดที่กำหนดเอง ให้ใช้ข้อมูลจากตัวชี้ทางอ้อม หากต้องการจัดการเหตุการณ์ประเภทอื่นๆ (เช่น การดำเนินการของกล้อง) โปรดดูส่วนต่อไปนี้ในคู่มือนี้
จัดการการดำเนินการของกล้อง
เมื่อใดก็ตามที่ผู้ใช้กดปุ่มกล้องของอุปกรณ์ ระบบจะส่งอินพุต
เหตุการณ์ไปยังกิจกรรมที่แสดงผลของแอปเป็นการดำเนินการ
ProjectedInputEvent.ProjectedInputAction.TOGGLE_APP_CAMERA แอปของคุณสามารถสังเกตการดำเนินการนี้ได้โดยใช้ตัวส่งสัญญาณเฉพาะ ดังนี้
@OptIn(ExperimentalProjectedApi::class) class CameraActionInputSnippetActivity : ComponentActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) // Observe hardware camera action events when RESUMED lifecycleScope.launch { repeatOnLifecycle(Lifecycle.State.RESUMED) { withContext(Dispatchers.Default) { try { val projectedActivity = ProjectedActivityCompat.create(this@CameraActionInputSnippetActivity) try { projectedActivity.projectedInputEvents.collect { inputEvent -> if (inputEvent.inputAction == TOGGLE_APP_CAMERA) { withContext(Dispatchers.Main) { onCameraActionTriggered() } } } } finally { projectedActivity.close() } } catch (e: CancellationException) { throw e } catch (e: Exception) { Log.w("CameraActionSnippet", "ProjectedActivityCompat unavailable: ${e.message}") } } } } setContent { GlimmerTheme { TouchpadInputSnippet( onTap = { Log.i("CameraActionSnippet", "Touchpad tapped") } ) } } } private fun onCameraActionTriggered() { Log.i("CameraActionSnippet", "Camera action button double-pressed!") } }
ตรวจสอบเหตุการณ์การเคลื่อนไหวทั่วไป
ใช้ dispatchGenericMotionEvent เพื่อตรวจสอบเหตุการณ์การเคลื่อนไหวทั่วไปที่ส่ง
ไปยังกิจกรรมที่แสดงผลของแอป เหตุการณ์การเคลื่อนไหวทั่วไปจะส่งที่ขอบเขตของกิจกรรมและไม่จำเป็นต้องมีคอมโพเนนต์ Jetpack Compose Glimmer ที่โฟกัส
MotionEvent อาจมีข้อมูลต่อไปนี้
- การดำเนินการที่มาสก์ไว้ เช่น
ACTION_DOWN,ACTION_MOVEหรือACTION_UP - พิกัดของตัวชี้ เช่น
AXIS_X,AXIS_YหรือAXIS_Z - ข้อมูลอุปกรณ์และแหล่งที่มา เช่น รหัสอุปกรณ์ และ แหล่งที่มา
ไม่ใช่ทุกค่าที่จะมีความหมายสำหรับการดำเนินการทุกอย่าง ตรวจสอบการดำเนินการและแหล่งที่มาก่อนที่จะถือว่าเหตุการณ์ดิบเป็นท่าทางสัมผัสที่เสร็จสมบูรณ์
class MotionGestureInputSnippetActivity : ComponentActivity() { override fun dispatchGenericMotionEvent(ev: MotionEvent): Boolean { val actionName = when (ev.actionMasked) { MotionEvent.ACTION_DOWN -> "ACTION_DOWN" // First contact with the glasses touchpad MotionEvent.ACTION_MOVE -> "ACTION_MOVE" // Contact moving across the glasses touchpad MotionEvent.ACTION_UP -> "ACTION_UP" // Contact lifted from the glasses touchpad else -> "ACTION_${ev.actionMasked}" } Log.d( "MotionGestureSnippet", "MotionEvent: action=$actionName x=${ev.x} y=${ev.y}" ) // Delegate to super unless intentionally consuming the event return super.dispatchGenericMotionEvent(ev) } }
ส่งคืน true ก็ต่อเมื่อกิจกรรมใช้เหตุการณ์โดยเจตนา
มิฉะนั้น ให้ส่งคืน super.dispatchGenericMotionEvent(ev) เพื่อให้เหตุการณ์ดำเนินการต่อผ่านการส่งสัญญาณตามปกติ
จัดการท่าทางสัมผัสย้อนกลับของระบบ
เมื่อหน้าจอต้องการลักษณะการทำงานย้อนกลับที่กำหนดเอง แอปของคุณควรจัดการท่าทางสัมผัสย้อนกลับของแว่นตา
โดยใช้ Android API เดียวกันกับที่ใช้สำหรับกิจกรรมอื่นๆ เช่น
OnBackPressedDispatcher และ OnBackPressedCallback
ท่าทางผู้ใช้จะขึ้นอยู่กับประเภทแว่นตา ดังนี้
- ในแว่นตาที่มีจอแสดงผล การปัดลงบนทัชแพดจะทำท่าทางสัมผัสย้อนกลับของระบบ
- ในแว่นตาที่มีระบบเสียง การปัดกลับบนทัชแพดจะทำท่าทางสัมผัสย้อนกลับของระบบ
ลงทะเบียนการเรียกกลับย้อนกลับเมื่อหน้าจอปัจจุบันต้องสกัดกั้นการย้อนกลับ เช่น การปิดการวางซ้อนหรือการแสดงการยืนยันการออก
class BackGestureInputSnippetActivity : ComponentActivity() { private val backCallback = object : OnBackPressedCallback(true) { override fun handleOnBackPressed() { onBackGestureReceived() } } override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) // Register back gesture callback with Activity's onBackPressedDispatcher onBackPressedDispatcher.addCallback(this, backCallback) } private fun onBackGestureReceived() { Log.i("BackGestureSnippet", "System back gesture intercepted") } }
ควรเปิดใช้การเรียกกลับก็ต่อเมื่อหน้าจอที่ใช้งานอยู่ควรสกัดกั้นการย้อนกลับ ปิดใช้หรือนำการเรียกกลับออกเมื่อลักษณะการทำงานเริ่มต้นของระบบหรือการนำทางควรจัดการการย้อนกลับ
ขั้นตอนถัดไป
หลังจากใช้การจัดการอินพุตสำหรับเหตุการณ์เหล่านี้แล้ว คุณสามารถดูข้อมูลเพิ่มเติมเกี่ยวกับการจัดการเหตุการณ์อินพุตประเภทอื่นๆ ได้ในหัวข้อต่อไปนี้
- ดูข้อมูลเพิ่มเติมเกี่ยวกับอินพุต UI ได้ที่ โฟกัสใน Jetpack Compose Glimmer และ จัดการอินพุตจากตัวชี้ทางอ้อม
- สำหรับเหตุการณ์อินพุตที่แสดงผล โปรดดู
ProjectedActivityCompat,ProjectedInputEventและProjectedInputEvent.ProjectedInputAction - สำหรับอินพุตและการนำทางของแพลตฟอร์ม โปรดดู
MotionEventและ ให้ การนำทางย้อนกลับที่กำหนดเอง