التعامل مع الإدخال المادي من النظارات الصوتية ونظارات بشاشة عرض

أجهزة XR المشمولة
تساعدك هذه الإرشادات في إنشاء تجارب لهذه الأنواع من أجهزة XR.
نظارات الصوت والعرض

لاستلام ومعالجة بيانات أدخلها المستخدم التي يتم تسليمها إلى النشاط المعروض في تطبيقك، أو لتنفيذ سلوكيات لوحة لمس مخصّصة، استخدِم إدخالات المؤشر غير المباشرة. للتعامل مع أنواع الأحداث الأخرى (مثل إجراء الكاميرا)، اطّلِع على الأقسام التالية في هذا الدليل.

التعامل مع إجراء الكاميرا

عندما يضغط المستخدم على زر الكاميرا في الجهاز، يسلّم النظام حدث إدخال إلى النشاط المعروض في تطبيقك كإجراء 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 ما يلي:

ليست كل القيم ذات صلة بكل إجراء. افحص الإجراء والمصدر قبل التعامل مع حدث أولي كإيماءة مكتملة.

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

يجب تفعيل دالة ردّ النداء فقط عندما يجب أن تعترض الشاشة النشطة إيماءة الرجوع. عطِّل دالة ردّ النداء أو أزِلها عندما يجب أن يتعامل السلوك التلقائي للنظام أو التنقّل مع إيماءة الرجوع.

الخطوات التالية

بعد تنفيذ معالجة الإدخال لهذه الأحداث، يمكنك الاطّلاع على مزيد من المعلومات حول معالجة أنواع أحداث الإدخال الأخرى في المواضيع التالية: