Evitar que un ScrollView intercepte los eventos de un GoogleMap
Cuando tenemos un GoogleMap
dentro de un ScrollView
, al hacer gestos táctiles sobre el mapa, el ScrollView
interceptará aquellos que sean propios del scroll, sin tener en cuenta que el mapa puede estar procesándolos.
Para evitar que el ScrollView
robe estos eventos, tenemos que colocar una vista encima del mapa a la cual le vamos a poner un OnTouchListener
que inhabilite el scroll y transmita los movimientos al mapa. Hay que hacerlo así porque parece ser que la vista con el mapa ignora cualquier listener que le pongamos.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
<ScrollView android:id="@+id/scroll" android:layout_width="match_parent" android:layout_height="match_parent"> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content"> <FrameLayout android:layout_width="match_parent" android:layout_height="300dp"> <FrameLayout android:id="@+id/mapa" android:layout_width="match_parent" android:layout_height="match_parent" /> <View android:id="@+id/interceptador" android:layout_width="match_parent" android:layout_height="match_parent" /> </FrameLayout> </LinearLayout> </ScrollView> |
1 2 3 4 5 6 |
interceptador.setOnTouchListener { _, event -> val evitarScroll = event?.action != MotionEvent.ACTION_UP scroll.requestDisallowInterceptTouchEvent(evitarScroll) mapa.onTouchEvent(event) false } |
ACTION_UP
, porque cuando es ACTION_UP
, la acción habrá finalizado, por lo que, en ese caso, volvemos a habilitar el scroll.