Жесты в Jetpack Compose: основы

Как это обычно происходит с Jetpack Compose, применение жестов к представлению теперь проще, чем раньше, с помощью XML.

Благодаря Jetpack Compose реализовать жесты стало проще, чем когда-либо. Единственное, что нам нужно, чтобы назначить действие жесту, — это Composable и лямбда.

Мы увидим, как добавить эту функциональность с примерами кода для Composable , представляющего вертикальные часы.

Как добавить вертикальные жесты

Для добавления жестов нам понадобятся модификаторы.

В этом случае для распознавания вертикального свайпа вверх или вниз необходим модификатор scrollable, который принимает ориентацию жеста и состояние.

Это состояние обеспечивается rememberScrollableState, а его аргумент delta говорит нам, представляет ли жест прокрутку вниз или прокрутку вверх. Если аргумент delta отрицательный, то пользователь прокручивает вверх, и вы можете себе представить, что произойдет, если delta будет положительным.

Это имеет смысл, поскольку пользовательский интерфейс определяется двумя осями координат, которые имеют точку (0,0) в верхнем левом углу.

Здесь у вас есть пример кода с реализованным модификатором scrollable.

.scrollable(
    orientation = Orientation.Vertical,
    state = rememberScrollableState { delta ->
      when {
        delta < 0 -> onScrollUp(delta)
        delta > 0 -> onScrollDown(delta)
        else -> {}
      }
      delta
    }
)

Как добавить горизонтальные жесты

Здесь применяется тот же принцип. Мы используем модификатор scrollable, но с указанием горизонтальной ориентации.

Следуя тому, что мы сказали ранее о том, где находится точка (0,0) в координатах, если delta положительное, выполняется свайп вправо, а если он отрицательный, мы собираемся зарегистрировать свайп влево.

Если мы хотим применить горизонтальный и вертикальный жест к одному и тому же Composable, то нам нужно будет добавить к нему модификаторы scrollable.

Вот пример горизонтального жеста.

.scrollable(
    orientation = Orientation.Horizontal,
    state = rememberScrollableState { delta ->
      when {
        delta < 0 -> onSwipeLeft(delta)
        delta > 0 -> onSwipeRight(delta)
        else -> {}
      }
      delta
    }
 ) 

Как добавить тап-жесты

Если мы хотим управлять двойным нажатием или длительным нажатием, мы должны использовать другой модификатор, в данном случае тот, который называется pointerInput.

Здесь с помощью функции detectTapGestures мы можем указать действие для каждого из различных видов касаний с помощью лямбды, как вы можете видеть в следующем примере.

.pointerInput(Unit) {
    detectTapGestures(
      onPress = {},
      onDoubleTap = {},
      onLongPress = { onLongPress() },
      onTap = { onClick() }
    )
 }

При всем этом у нас может быть следующее Composable, которое представляет собой таймер, которым можно управлять с помощью всех этих нажатий и жестов.

fun VerticalClock(
  modifier: Modifier = Modifier,
  clock: Clock,
  onClick: () -> Unit,
  onLongPress: () -> Unit,
  onScrollDown: (Float) -> Unit,
  onScrollUp: (Float) -> Unit,
  onHorizontalScroll: (Float) -> Unit
) {
 Column(
  verticalArrangement = Arrangement.Center,
  horizontalAlignment = Alignment.CenterHorizontally,
  modifier = modifier
   .fillMaxWidth()
   .pointerInput(Unit) {
    detectTapGestures(
      onPress = {},
      onDoubleTap = {},
      onLongPress = { onLongPress() },
      onTap = { onClick() }
    )
   }
   .background(MaterialTheme.colorScheme.background)
   .scrollable(
    orientation = Orientation.Vertical,
    state = rememberScrollableState { delta ->
      when {
        delta < 0 -> onScrollUp(delta)
        delta > 0 -> onScrollDown(delta)
        else -> {}
      }
      delta
    }
   )
   .scrollable(
    orientation = Orientation.Horizontal,
    state = rememberScrollableState { delta ->
      when {
         delta < 0 -> onSwipeLeft(delta)
         delta > 0 -> onSwipeRight(delta)
         else -> {}
      }
      delta
    }
   )
) {
  with(clock) {
    ClockPair(
      verticalAlignment = Alignment.Bottom,
      firstDigit = firstDigit,
      secondDigit = secondDigit
    )
    ClockPair(
      verticalAlignment = Alignment.Top,
      firstDigit = thirdDigit,
      secondDigit = fourthDigit
    )
  }
 }
}

Если вы хотите прочитать больше подобного контента и поддержать меня, не забудьте проверить мой профиль или дать Medium шанс, став участником, чтобы получить доступ к неограниченным историям от меня и других писателей. Это всего 5 долларов в месяц, и если вы используете эту ссылку, я получаю небольшую комиссию.



Повышение уровня кодирования

Спасибо, что являетесь частью нашего сообщества! Перед тем, как ты уйдешь:

  • 👏 Хлопайте за историю и подписывайтесь на автора 👉
  • 📰 Смотрите больше контента в публикации Level Up Coding
  • 🔔 Подписывайтесь на нас: Twitter | ЛинкедИн | "Новостная рассылка"

🚀👉 Присоединяйтесь к коллективу талантов Level Up и найдите прекрасную работу