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:
- Recibiendo la pantalla ambigua del cielo mientras que carga el mapa de google
- Activación de un evento de mapa (como un clic de marcador) en Google Maps Android V2
- Mostrar barra de herramientas para el marcador de Google Maps automáticamente
- Múltiples marcadores con texto en Google Maps API v2
- ¿Debo usar MapView o MapFragment
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?
- Definición de un CameraUpdate con LatLngBounds con diferentes valores de relleno
- BadParcelableException en el código de google maps
- ¿Crear un marcador sin agregarlo al mapa?
- Marcador personalizado en google maps en android con vector icono de activo
- Google Maps Android API v2 - Interactive InfoWindow (como en los mapas originales de google google)
- Mapa de Google para android mi botón personalizado de ubicación
- Los marcadores se mueven al realizar el zoom con Google Maps Android API v2
- El tamaño del mapa IllegalStateException no debe ser 0
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(); } } });