旋转输入是用户与可穿戴设备进行交互的另一种方法。您必须处理此类型的输入,因为您的用户甚至会在不知不觉中期望此输入。
当前,用户可以通过3种方式对智能手表进行旋转输入:皇冠,物理表圈,触摸挡板。所有这些选项在处理输入时对我们来说都是透明的,也就是说,对于此输入的简单处理,我们不需要知道用户使用哪个用于与我们的应用程序进行交互。
所以,让我们看看如何使用ScalingLazyColumn
和Picker
处理此操作的一些示例。
ðâ€以下示例使用了作曲家的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%工作。
基金会图书馆和钟表学家的旋转输入回调仍处于实验状态,因此很快就可以改变并改进。
参考
代码
您可以在我的存储库中检查这些和更多示例
Vnicius / rotary-input-samples
示例代码显示旋转输入在磨损OS上的用法与组合â
Rotary Input Samples
Sample codes showing the usage of Rotary input on Wear OS with Compose ⌚︎
Samples
-
Basic Example-此示例包含带有
ScalingLazyColumn
和Picker
的rotart输入的基本句柄。