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

دستگاه‌های XR قابل اجرا
این راهنما به شما کمک می‌کند تا برای این نوع دستگاه‌های XR تجربه ایجاد کنید.
صوتی و
عینک نمایش

برای دریافت و پردازش ورودی کاربر که به activity پیش‌بینی‌شده‌ی برنامه‌ی شما ارسال می‌شود، یا برای پیاده‌سازی رفتارهای سفارشی تاچ‌پد، از ورودی‌های غیرمستقیم اشاره‌گر استفاده کنید . برای مدیریت انواع دیگر رویدادها (مانند عملکرد دوربین)، به بخش‌های بعدی این راهنما مراجعه کنید.

کنترل حرکات دوربین

هر زمان که کاربر دکمه دوربین دستگاه را فشار می‌دهد، سیستم یک رویداد ورودی را به عنوان یک اکشن ProjectedInputEvent.ProjectedInputAction.TOGGLE_APP_CAMERA به activity پیش‌بینی‌شده برنامه شما ارسال می‌کند. برنامه شما می‌تواند این اکشن را با استفاده از یک dispatcher اختصاصی مشاهده کند:

@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 برای بررسی رویدادهای حرکتی عمومی که به activity پیش‌بینی‌شده‌ی برنامه‌ی شما ارسال می‌شوند، استفاده کنید. رویدادهای حرکتی عمومی در مرز activity ارسال می‌شوند و نیازی به کامپوننت 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 برمی‌گرداند که activity عمداً رویداد را مصرف کند. در غیر این صورت، مقدار super.dispatchGenericMotionEvent(ev) را برمی‌گرداند تا رویداد بتواند از طریق ارسال عادی ادامه یابد.

مدیریت ژست برگشت سیستم

وقتی یک صفحه نمایش نیاز به رفتار بازگشت سفارشی دارد، برنامه شما باید ژست بازگشت عینک را با استفاده از همان APIهای اندروید که برای سایر فعالیت‌ها مانند OnBackPressedDispatcher و OnBackPressedCallback استفاده می‌کنید، مدیریت کند.

ژست کاربر به نوع عینک بستگی دارد:

  • روی عینک‌های نمایشی، کشیدن انگشت به پایین روی صفحه لمسی، حرکت سیستمی «برگشت» را اجرا می‌کند.
  • در عینک‌های صوتی، کشیدن انگشت به عقب روی صفحه لمسی، حرکت سیستمی «برگشت» را اجرا می‌کند.

زمانی که صفحه فعلی نیاز به قطع کردن Back دارد، مانند بستن یک لایه یا نمایش تأیید خروج، یک callback برگشتی ثبت کنید.

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

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

مراحل بعدی

پس از پیاده‌سازی مدیریت ورودی برای این رویدادها، می‌توانید در مباحث زیر درباره مدیریت انواع دیگر رویدادهای ورودی اطلاعات بیشتری کسب کنید: