Creación de OnDragListener para Google Map v2 Fragment

Estoy intentando fijar un oyente del onDrag para un fragmento del mapa de google, pero no puedo conseguir el acontecimiento del arrastrar para encender. Como el mapa no admite eventos de arrastre directamente, intento implementar un oyente de arrastrar para la vista. Sé sobre el evento onMarkerDrag, pero eso no me sirve ya que no estoy tratando de mover los marcadores.

La razón de atrapar eventos de arrastrar mapas es doble:

Primero para detectar si el usuario ha explorado el mapa. Si no, me gusta mantener su ubicación en la pantalla, y animar a su ubicación si no está en el mapa. Si han explorado el mapa, supongo que saben lo que quieren ver y forzar la ubicación en la pantalla. (Esto parece algo que debería incluirse en la API)

La segunda razón para atrapar es permitir a los usuarios dibujar líneas y polígonos en el mapa. Puedo hacer esto con eventos onTap (añadir puntos), pero me gustaría poder dejarlos a mano alzada también.

Mi código se ve así:

actividad principal:

mMap = ((MapFragment) getFragmentManager().findFragmentById(R.id.map)).getMap(); setUpMapIfNeeded(); mMapView = findViewById(R.id.map); myMapDragListener = new MapDragListener(); mMapView.setOnDragListener(myMapDragListener); 

El oyente:

 public class MapDragListener implements OnDragListener { /** * */ public MapDragListener() { super(); say.logCat("MapDragListener: I'm ALIVE!!!!"); } private AkamaiAnnounce say = new AkamaiAnnounce(); private boolean inDrag; private boolean hasPanned=false; @Override public boolean onDrag(View v, DragEvent event) { say.logCat("MapDragListener.onDrag: " + event.toString()); //String dotTAG = (String) getTag(); if (event.getLocalState() != this) { return false; } boolean myResult = true; int action = event.getAction(); float x = event.getX(); float y = event.getY(); switch (action) { case DragEvent.ACTION_DRAG_STARTED: inDrag = true; break; case DragEvent.ACTION_DRAG_LOCATION: break; case DragEvent.ACTION_DRAG_ENTERED: break; case DragEvent.ACTION_DRAG_EXITED: break; case DragEvent.ACTION_DROP: myResult = false; break; case DragEvent.ACTION_DRAG_ENDED: inDrag = false; // change color of original dot back hasPanned=true; break; default: myResult = false; break; } return false; //return myResult; } public boolean hasPanned() { return hasPanned; } public void setHasPanned(boolean hasPanned) { this.hasPanned = hasPanned; } } 

El mapa funciona bien. El oyente instancia, pero mi evento onDrag nunca se activa. ¿Algunas ideas?

1) Crear una clase de contenedor:

 public class MapWrapperLayout extends FrameLayout { public interface OnDragListener { public void onDrag(MotionEvent motionEvent); } private OnDragListener mOnDragListener; public MapWrapperLayout(Context context) { super(context); } @Override public boolean dispatchTouchEvent(MotionEvent ev) { if (mOnDragListener != null) { mOnDragListener.onDrag(ev); } return super.dispatchTouchEvent(ev); } public void setOnDragListener(OnDragListener mOnDragListener) { this.mOnDragListener = mOnDragListener; } } 

2) Crear una subclase de la clase MapFragment:

 public class CustomMapFragment extends SupportMapFragment { private View mOriginalView; private MapWrapperLayout mMapWrapperLayout; @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { mOriginalView = super.onCreateView(inflater, container, savedInstanceState); mMapWrapperLayout = new MapWrapperLayout(getActivity()); mMapWrapperLayout.addView(mOriginalView); return mMapWrapperLayout; } @Override public View getView() { return mOriginalView; } public void setOnDragListener(MapWrapperLayout.OnDragListener onDragListener) { mMapWrapperLayout.setOnDragListener(onDragListener); } 

3.1) Finalmente, en su actividad:

  // Google map init block CustomMapFragment customMapFragment = ((CustomMapFragment) getSupportFragmentManager().findFragmentById(R.id.map)); customMapFragment.setOnDragListener(new MapWrapperLayout.OnDragListener() { @Override public void onDrag(MotionEvent motionEvent) { Log.d("ON_DRAG", String.format("ME: %s", motionEvent)); // Handle motion event: } }); GoogleMap map = customMapFragment.getMap(); 

3.2) … y en su diseño:

 <fragment android:id="@+id/map" android:layout_width="match_parent" android:layout_height="match_parent" android:name="your.package.CustomMapFragment"/> 

Para arrastrar al receptor de eventos un fragmento que contiene googleMap, se puede usar el método debajo de google. Podemos obtener la posición de destino del mapa.

 googleMap.setOnCameraIdleListener(new GoogleMap.OnCameraIdleListener() { @Override public void onCameraIdle() { Log.e(TAG,"==camera idle=="+ googleMap.getCameraPosition().target); } }); googleMap.setOnCameraMoveStartedListener(new GoogleMap.OnCameraMoveStartedListener() { @Override public void onCameraMoveStarted(int reason) { if (reason ==REASON_GESTURE) { isMaptouched=true; Toast.makeText(getActivity(), "The user gestured on the map.", Toast.LENGTH_SHORT).show(); } else if (reason ==REASON_API_ANIMATION) { Toast.makeText(getActivity(), "The user tapped something on the map.", Toast.LENGTH_SHORT).show(); } else if (reason ==REASON_DEVELOPER_ANIMATION) { Toast.makeText(getActivity(), "The app moved the camera.", Toast.LENGTH_SHORT).show(); } } }); 
  • Cómo actualizar los marcadores en el mapa en android?
  • Android - Google Maps API v2 - NoClassDefFoundError
  • Marcadores de mapa con texto en Google Maps Android API v2
  • Android: Google Maps no se muestra
  • Google Maps Android MapView v2: deshabilita el zoom
  • Uso de PlaceFilter para Android con la API de Google Places
  • Cómo personalizar el diseño del cuadro de diálogo de widget de PlaceAutocomplete a lugares de la lista
  • Zoom sobre la ruta específica google map
  • Captura de pantalla de GoogleMap Android API V2
  • Android - Extensiones de Google Maps - IllegalArgumentException
  • Escuchar nivel de zoom en google maps v2 en android
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.