мое рабочее решение этой проблемы - использование невидимого слоя над видом с дочерними элементами следующим образом:
<RelativeLayout
android:id="@+id/contentLayout"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_above="@+id/linearLayout"
android:layout_alignStart="@+id/linearLayout"
android:layout_alignParentTop="true"> ... </RelativeLayout>
<View
android:id="@+id/gesture_view"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_above="@+id/linearLayout"
android:layout_alignStart="@+id/linearLayout"
android:layout_alignParentTop="true"
android:focusable="true"
android:focusableInTouchMode="true" />
где contentLayout
содержит несколько дочерних элементов, включая некоторые кнопки.
Второй шаг - перехват событий касания на этом gesture_view
и передача их на linearLayout
и мой код GestureDetector (аналогичный тому, который вы указали в вопросе) следующим образом:
gesture_view.setOnTouchListener { _, event ->
contentLayout.dispatchTouchEvent(event)
gestureListener.onTouch(event)
true
}
Обратите внимание, вы должны быть осторожны с тем, как вы доставляете события в представление за gesture_view
. Просто contentLayout#onTouch
не будет работать. Это должно быть contentLayout.dispatchTouchEvent