磨损OS的旋转输入与作曲
#android #jetpackcompose #组成 #wearos

旋转输入是用户与可穿戴设备进行交互的另一种方法。您必须处理此类型的输入,因为您的用户甚至会在不知不觉中期望此输入。

当前,用户可以通过3种方式对智能手表进行旋转输入:皇冠,物理表圈,触摸挡板。所有这些选项在处理输入时对我们来说都是透明的,也就是说,对于此输入的简单处理,我们不需要知道用户使用哪个用于与我们的应用程序进行交互。

所以,让我们看看如何使用ScalingLazyColumnPicker处理此操作的一些示例。

ðâ€以下示例使用了作曲家的1.1.0-rc01版本,用于佩戴OS

ScapingLazyColumn

首先,为了使手柄旋转输入,组件必须具有焦点。我们可以通过手动要求将重点放在组件中来实现这一目标。因此,让我们创建一个焦点的实例:

val focusRequester = remember { FocusRequester() }

然后在我们的ScalingLazyColumn中设置此:

ScalingLazyColumn(
    modifier = Modifier
        .focusRequester(focusRequester)
        .focusable(),
    {...}
){
    {...}
}

接下来,我们需要强制焦点的要求。

LaunchedEffect(Unit){
    focusRequester.requestFocus() 
}

现在,我们的ScalingLazyColumn将始终具有重点。手柄尚未完成,现在我们需要对旋转输入进行实际反应,然后滚动我们的列表。

首先,我们需要一个ScalingLazyListState的实例,并使用修饰符onRotaryScrollEvent来收听旋转输入。请注意,我们需要使用Coroutine范围执行此滚动。

val focusRequester = remember **{** FocusRequester() **}**
val scrollState = rememberScalingLazyListState()
val coroutineScope = rememberCoroutineScope()

ScalingLazyColumn(
    modifier = Modifier
                .onRotaryScrollEvent {
            coroutineScope.launch {
                scrollState.scrollBy(it.verticalScrollPixels)
            }
            true // it means that we are handling the event with this callback
        }
        .focusRequester(focusRequester)
        .focusable(),
        state = scrollState,
    {...}
){
    {...}
}

LaunchedEffect(Unit){
    focusRequester.requestFocus() 
}

仅此而已。使用小配置,ScalingLazyColumn对旋转输入反应。

选择器

对于Picker组件,设置基本相同:

val pickerState = rememberPickerState(
    initialNumberOfOptions = 100,
    initiallySelectedOption = 50
)
val focusRequester = remember { FocusRequester() }
val coroutineScope = rememberCoroutineScope()

Picker(
    state = pickerState,
    contentDescription = pickerState.selectedOption.toString(),
    modifier = Modifier
        .onRotaryScrollEvent{
                    coroutineScope.launch{
                        pickerState.scrollBy(it.verticalScrollPixels)
                    }
                    true
                }
                .focusRequester(focusRequester)
          .focusable()
        {...}
    ) {
        {...}
    }

    LaunchedEffect(Unit) {
        focusRequester.requestFocus()
    }

结论

您注意到一些事情:

  • 没有触觉反馈
    • 如果您测试了处理此输入的其他应用程序,您会在滚动过程中注意到触觉反馈,可悲的是,这不是自动的,您需要手动执行此操作或使用 Horologist
  • 选择器没有捕捉到所选项目
    • 使用这种方法有时,采摘器不会捕捉到所选项目,您可以使用 Horologist 进行改进,但是通过我的测试,它无法100%工作。

基金会图书馆和钟表学家的旋转输入回调仍处于实验状态,因此很快就可以改变并改进。

参考

代码

您可以在我的存储库中检查这些和更多示例

GitHub logo Vnicius / rotary-input-samples

示例代码显示旋转输入在磨损OS上的用法与组合â

Rotary Input Samples

Sample codes showing the usage of Rotary input on Wear OS with Compose ⌚︎

Samples

  • Basic Example-此示例包含带有ScalingLazyColumnPicker的rotart输入的基本句柄。