как реализовать индикатор положения для лицевой панели (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
}
}