Как обрабатывать несколько событий касания в одном и том же действии в Jetpack Compose?

#android #kotlin #android-jetpack-compose

Вопрос:

Я пытаюсь установить некоторые различия в сенсорных взаимодействиях на одном экране в проекте создания jetpack. Однако установка pointerFilter модификатора в контейнер главного экрана автоматически переопределяет любые другие кликабельные составные элементы внутри него. См. Код ниже для примера:

     setContent {
        val context = LocalContext.current //only to be used in toasts
        Box(
            modifier = Modifier
                .background(Color.Gray)
                .fillMaxSize()
                .pointerInteropFilter {
                    if (it.action == MotionEvent.ACTION_UP) {
                        Toast
                            .makeText(context, "ENTIRE SCREEN RELEASED!", Toast.LENGTH_SHORT)
                            .show()
                    }
                    true
                }
        ) {
            Button(onClick = {
                Toast.makeText(context, "BUTTON CLICKED!", Toast.LENGTH_SHORT).show()
            }) {
                Text(text = "BUTTON")
            }
        }
    }
 

Выполнение этого в основном приводит к тому, что любая кликабельная композиция не работает, как в примере Button . Кроме того, обратите внимание, что я рассматриваю Box его как свой «экран», как только я настрою его на максимальный размер (это лучший способ обрабатывать щелчки по экрану в jetpack compose?).

Затем, как сделать даже весь экран ( Box ?) и его дочерние элементы кликабельными и обрабатывать его события?

Комментарии:

1. Возможно, вы сможете добиться того, чего хотите с Modifier.pointerInput{} помощью . Предполагается, что pointerInteropFilter используется для событий движения очень низкого уровня.

2. Спасибо за понимание, pointerInput хорошо поработали!

Ответ №1:

Особая благодарность @Rafsanjani за его понимание использования модификатора.pointerInput{}.

Чтобы получить решение для обработки событий с несколькими составными элементами, я просто добавил модификаторы следующим образом:

 setContent {
    val context = LocalContext.current //only to be used in toasts
    Box(
        modifier = Modifier
            .background(Color.Gray)
            .fillMaxSize()
            .pointerInput(key1 = "someStringKey?") {
                detectTapGestures(onPress = {
                    if (tryAwaitRelease()) {
                        Toast.makeText(context, "MAIN SCREEN RELEASED!", Toast.LENGTH_SHORT).show()
                    }
                })
            }
    ) {
        Button(onClick = {
            Toast.makeText(context, "BUTTON CLICKED!", Toast.LENGTH_SHORT).show()
        }) {
            Text(text = "BUTTON")
        }
    }
}
 

Это в основном обрабатывает различные события для Box (составного, который заполняет максимальный размер) и кнопки.