مدیریت ورودی فیزیکی از عینک‌های صوتی و نمایشگر

دستگاه‌های 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) را برگردانید تا رویداد بتواند ازطریق ارسال عادی ادامه یابد.

کنترل اشاره «برگشتن» سیستم

وقتی صفحه‌ای به عملکرد سفارشی برگشت نیاز دارد، برنامه شما باید بااستفاده از همان APIهای Android که برای فعالیت‌های دیگر استفاده می‌کنید، مثل 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")
    }
}

بازخوانی فقط باید زمانی فعال شود که صفحه فعال باید «بازگشت» را رهگیری کند. وقتی رفتار پیش‌فرض سیستم یا پیمایش باید «بازگشت» را مدیریت کند، فراخوانی را غیرفعال یا حذف کنید.

مراحل بعدی

پس‌از پیاده‌سازی مدیریت ورودی برای این رویدادها، می‌توانید درباره مدیریت انواع دیگر رویدادهای ورودی در موضوعات زیر بیشتر بدانید: