как реализовать индикатор положения для лицевой панели (Galaxy Watch 4 Classic) Wear OS 3.0 (Jetpack compose)?

Они знают, как реализовать прокрутку безелем (Galaxy Watch 4 Classic) в Wear OS 3.0 с Jetpack Compose.

В документации упоминается использование ScalingLazyListState или ScrollState, но до сих пор прокрутка с вращающейся лицевой панелью моего устройства не была распознана.

если у кого-то есть информация или пример, это мне очень поможет.

1 ответ

Он будет поддерживаться чисто в будущем.

В качестве обходного пути/хака вы можете использовать следующий подход

https://github.com/joreilly/PeopleInSpace/pull/84/files

      /**
 * Dispatcher to link rotary event to [ScrollableState].
 * The instance should be set up by calling [RotaryEventHandlerSetup] function.
 */
class RotaryEventDispatcher(
    var scrollState: ScrollableState? = null
) {
    suspend fun onRotate(delta: Float): Float? =
        scrollState?.scrollBy(delta)
}

/**
 * Custom rotary event setup (Currently, Column / LazyColumn doesn't handle rotary event.)
 * Refer to https://developer.android.com/training/wearables/user-input/rotary-input
 */
@Composable
fun RotaryEventHandlerSetup(rotaryEventDispatcher: RotaryEventDispatcher) {
    val view = LocalView.current
    val context = LocalContext.current
    val scope = rememberCoroutineScope()

    view.requestFocus()
    view.setOnGenericMotionListener { _, event ->
        if (event?.action != MotionEvent.ACTION_SCROLL ||
            !event.isFromSource(InputDeviceCompat.SOURCE_ROTARY_ENCODER)
        ) {
            return@setOnGenericMotionListener false
        }

        val delta = -event.getAxisValue(MotionEventCompat.AXIS_SCROLL) *
            ViewConfigurationCompat.getScaledVerticalScrollFactor(
                ViewConfiguration.get(context), context
            )
        scope.launch {
            rotaryEventDispatcher.onRotate(delta)
        }
        true
    }
}
Другие вопросы по тегам