Join FlipAndroid.COM Telegram Group: https://t.me/joinchat/F_aqThGkhwcLzmI49vKAiw


Manejo de eventos táctiles en SurfaceView sobre Maps API v2

Tengo problemas con la creación de un controlador de eventos que se activará mientras el usuario mueve el mapa. Hay un OnCameraChangeListener , pero se activa después de que el mapa se detiene.

He creado SurfaceView sobre Maps, y ahora no tengo idea de cómo manejar el evento OnGestureListener de OnGestureListener .

  • Android: Evento de clic de botón
  • ¿Por qué está mostrando el acelerador de emulador Intel x86 (instalador de HAXM) no compatible con Windows?
  • Cómo deshabilitar la función de rotación de mapas en el fragmento de mapa de Android
  • ¿Cómo mantener sincronizados los datos de una aplicación de Android en varios dispositivos?
  • Enviar datos al receptor de difusión del administrador de alarmas
  • ¿Puede un dispositivo Android actuar como iBeacon?
  • Aquí está el código de ejemplo:

     SurfaceView sv = new SView(); sv.setZOrderOnTop(true); mapView.addView(sv); 

     public class SView extends SurfaceView implements Runnable, android.view.GestureDetector.OnGestureListener { ... @Override public boolean onTouchEvent(MotionEvent event) { //this worked in Overlay in Maps API v1 if(gestureDetector.onTouchEvent(event)) { return true; } return false; } ... @Override public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) { Log.i("test","onScroll"); return false; } ... } 

    Si establezco return true en onTouchEvent , onScroll se llama, pero no puedo mover el Map (lo cual es obvio, el evento se consume), y no sé cómo enviar eventos hasta el objeto Map.

    ¿Alguien sabe cómo actualizar SurfaceView mientras Map se mueve?

  • ¿Cómo crear scripts de Renderscript en Android Studio y hacerlos funcionar?
  • Android Studio APK Analyzer para las compilaciones de depuración
  • Android Volley Request Identidad onErrorResponse Sección
  • Cómo añadir un botón Google +1 en la aplicación para Android
  • Recursos de documentación confusos de proxy de Android
  • ¿Pueden varias aplicaciones de Android compartir un único proceso y contexto de aplicación?
  • 2 Solutions collect form web for “Manejo de eventos táctiles en SurfaceView sobre Maps API v2”

    He implementado alguna otra solución para resolver este problema. Lo que hice – es que coloque mi GoogleMap dentro de la costumbre RelativeLayout. Después de que onInterceptTouchEvent callback funciona como un encanto y mapa subyacente recibe eventos táctiles como se esperaba

    Aquí está mi xml:

     <com.my.package.name.map.MapRelativeLayout android:id="@+id/map_root_layout" android:layout_width="match_parent" android:layout_height="match_parent"> <fragment android:id="@+id/map" android:layout_width="match_parent" android:layout_height="match_parent" class="com.google.android.gms.maps.SupportMapFragment"/> </com.my.package.name.map.MapRelativeLayout> 

    Y el diseño relativo personalizado:

     package com.my.package.name.map; import android.content.Context; import android.util.AttributeSet; import android.view.GestureDetector; import android.view.MotionEvent; import android.widget.RelativeLayout; public class MapRelativeLayout extends RelativeLayout { private GestureDetector gestureDetector; public MapRelativeLayout(Context context, AttributeSet attrs) { super(context, attrs); gestureDetector = new GestureDetector(context, new GestureListener()); } @Override public boolean onInterceptTouchEvent(MotionEvent ev) { gestureDetector.onTouchEvent(ev); return false; } private class GestureListener extends GestureDetector.SimpleOnGestureListener { @Override public boolean onDown(MotionEvent e) { return true; } @Override public boolean onDoubleTap(MotionEvent e) { return false; } @Override public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) { return false; } @Override public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) { //do whatever you want here return false; } } } 

    Desde: Android ListView: la sustitución de las causas de desplazamiento no se ejecutan

    ¿Ha intentado llamar a super.onTouchEvent(event) en su método onTouchEvent ?

    Editar – Creo que desea devolver false también en su método onScroll .

    Entonces su método onTouchEvent debe ser:

     @Override public boolean onTouchEvent(MotionEvent event) { if (gestureDetector.onTouchEvent(event)) { return true; } return super.onTouchEvent(event); } 

    Otros posibles enlaces útiles:

    • Android: cómo saber si una vista se desplaza
    • Añadir GestureOverlayView a mi clase SurfaceView, ¿cómo agregar a la jerarquía de vista?
    • Android onFling no responde
    • OnGestureListener onDown método nunca se llama
    • Anulación de onTouchEvent que compite con ScrollView
    FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.