Wprowadzanie obrotowe z funkcją tworzenia

Obrotowe dane wejściowe odnoszą się do elementów znajdujących się w zegarku, które kręcą się lub obracają. Wł. użytkownicy poświęcają średnio kilka sekund na interakcję z zegarkiem. Ty może zwiększyć wygodę użytkowników, umożliwiając im korzystanie z narzędzia Rotary Enter mogą szybko wykonywać różne zadania.

W większości zegarków jest to możliwe dzięki 3 głównym źródłom pokrętła (RSB) oraz fizyczną ramkę lub okrągłą ramkę dotykową w strefie dotyku wokół ekranu. Choć oczekiwane działanie może się różnić w zależności od typ danych wejściowych. Pamiętaj, aby obsługiwać pokrętło w przypadku wszystkich niezbędnych interakcji.

Przewiń

Większość użytkowników oczekuje, że aplikacje będą obsługiwać gest przewijania. Podczas przewijania treści strony w odpowiedzi na interakcje z obrotem ekranu. Opinia wizualna może zawierać wskaźniki pozycji przy przewijaniu w pionie lub wskaźniki strony.

ScalingLazyColumn i Picker domyślnie obsługują gest przewijania, o ile trzeba umieścić te komponenty wewnątrz elementu Scaffold. Scaffold zapewnia podstawową strukturę układu aplikacji na Wear OS i ma już miejsce na wskaźnik przewijania. Do wyświetlić postęp przewijania, utwórz wskaźnik pozycji na podstawie jak w tym fragmencie kodu:

val listState = rememberScalingLazyListState()
Scaffold(
    positionIndicator = {
        PositionIndicator(scalingLazyListState = listState)
    }
) {
    // ...
}

Działanie przyciągania dla ScalingLazyColumn możesz skonfigurować za pomocą: ScalingLazyColumnDefaults.snapFlingBehavior, jak w poniższym przykładzie fragment kodu:

val listState = rememberScalingLazyListState()
Scaffold(
    positionIndicator = {
        PositionIndicator(scalingLazyListState = listState)
    }
) {

    val state = rememberScalingLazyListState()
    ScalingLazyColumn(
        modifier = Modifier.fillMaxWidth(),
        state = state,
        flingBehavior = ScalingLazyColumnDefaults.snapFlingBehavior(state = state)
    ) {
        // Content goes here
        // ...
    }
}

Działania niestandardowe

Możesz też tworzyć działania niestandardowe, które reagują na pokrętło w Twojej aplikacji. Dla: Na przykład pokrętło powinno być używane do powiększania i pomniejszania treści lub sterowania głośnością multimediów .

Jeśli komponent natywnie nie obsługuje zdarzeń przewijania, takich jak wolumin możesz samodzielnie obsługiwać zdarzenia przewijania.

// VolumeScreen.kt

val focusRequester: FocusRequester = remember { FocusRequester() }

Column(
    modifier = Modifier
        .fillMaxSize()
        .onRotaryScrollEvent {
            // handle rotary scroll events
            true
        }
        .focusRequester(focusRequester)
        .focusable(),
) { ... }

Utwórz niestandardowy stan zarządzany w modelu widoku danych i używane niestandardowe wywołanie zwrotne do przetwarzania zdarzeń przewijania pokrętłem.

// VolumeViewModel.kt

object VolumeRange(
    public val max: Int = 10
    public val min: Int = 0
)

val volumeState: MutableStateFlow<Int> = ...

fun onVolumeChangeByScroll(pixels: Float) {
    volumeState.value = when {
        pixels > 0 -> min (volumeState.value + 1, VolumeRange.max)
        pixels < 0 -> max (volumeState.value - 1, VolumeRange.min)
    }
}

Dla uproszczenia w poprzednim przykładzie użyto wartości pikseli, które, jeśli mogą być zbyt wrażliwe.

Wywołanie zwrotne po otrzymaniu zdarzeń, jak pokazano w tym fragmencie.

val focusRequester: FocusRequester = remember { FocusRequester() }
val volumeState by volumeViewModel.volumeState.collectAsState()

Column(
    modifier = Modifier
        .fillMaxSize()
        .onRotaryScrollEvent {
            volumeViewModel
                .onVolumeChangeByScroll(it.verticalScrollPixels)
            true
        }
        .focusRequester(focusRequester)
        .focusable(),
) { ... }