لاستلام ومعالجة بيانات أدخلها المستخدم التي يتم تسليمها إلى النشاط المعروض في تطبيقك، أو لتنفيذ سلوكيات لوحة لمس مخصّصة، استخدِم إدخالات المؤشر غير المباشرة. للتعامل مع أنواع الأحداث الأخرى (مثل إجراء الكاميرا)، اطّلِع على الأقسام التالية في هذا الدليل.
التعامل مع إجراء الكاميرا
عندما يضغط المستخدم على زر الكاميرا في الجهاز، يسلّم النظام حدث إدخال إلى النشاط المعروض في تطبيقك كإجراء
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) حتى يتمكّن الحدث من مواصلة عملية الإرسال العادية.
التعامل مع إيماءة الرجوع في النظام
عندما تحتاج شاشة إلى سلوك رجوع مخصّص، يجب أن يتعامل تطبيقك مع إيماءة الرجوع في النظارات باستخدام واجهات برمجة التطبيقات نفسها التي تستخدمها للأنشطة الأخرى، مثل 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") } }
يجب تفعيل دالة ردّ النداء فقط عندما يجب أن تعترض الشاشة النشطة إيماءة الرجوع. عطِّل دالة ردّ النداء أو أزِلها عندما يجب أن يتعامل السلوك التلقائي للنظام أو التنقّل مع إيماءة الرجوع.
الخطوات التالية
بعد تنفيذ معالجة الإدخال لهذه الأحداث، يمكنك الاطّلاع على مزيد من المعلومات حول معالجة أنواع أحداث الإدخال الأخرى في المواضيع التالية:
- لمزيد من المعلومات حول إدخال واجهة المستخدم، اطّلِع على التركيز في Jetpack Compose Glimmer والتعامل مع إدخالات المؤشر غير المباشرة.
- بالنسبة إلى أحداث الإدخال المعروضة، اطّلِع على
ProjectedActivityCompatوProjectedInputEventوProjectedInputEvent.ProjectedInputAction. - بالنسبة إلى إدخال النظام الأساسي والتنقّل، اطّلِع على
MotionEventوتقديم تنقّل مخصّص للرجوع.