2009-11-20 10 views

Respuesta

3

¿Está utilizando un MapActivity? Aquí está el código que he utilizado:

MapView mapView = (MapView)findViewById(R.id.map); 
Projection projection = mapView.getProjection(); 
int y = mapView.getHeight()/2; 
int x = mapView.getWidth()/2; 

GeoPoint geoPoint = projection.fromPixels(x, y); 
double centerLatitude = (double)geoPoint.getLatitudeE6()/(double)1E6; 
double centerLongitude = (double)geoPoint.getLongitudeE6()/(double)1E6; 

sí es necesario añadir un código similar a esto también:

@Override 
public boolean dispatchTouchEvent(MotionEvent event) 
{ 
    boolean result = super.dispatchTouchEvent(event); 
    if (event.getAction() == MotionEvent.ACTION_UP) 
     reload_map_data(); /// call the first block of code here 
    return result; 
} 
+0

¿esto manejar la "aventura" en el mapa sigue moviendo un poco retirado si arrojarlo (después de levantar el dedo) –

+0

Hola gracias por la marcc respuesta, pero Necesito encontrar una manera de detectar cuando la animación de pan se detiene para que Puedo usar tu código de cálculo central en ese punto. – vamsibm

12

También he estado buscando una solución "hizo extremo arrastre" que detecta el mapa centro en el momento justo después de que el mapa terminó de moverse. Yo no lo he encontrado, por lo que he hecho esta sencilla aplicación que no funciona bien:

private class MyMapView extends MapView { 

    private GeoPoint lastMapCenter; 
    private boolean isTouchEnded; 
    private boolean isFirstComputeScroll; 

    public MyMapView(Context context, String apiKey) { 
     super(context, apiKey); 
     this.lastMapCenter = new GeoPoint(0, 0); 
     this.isTouchEnded = false; 
     this.isFirstComputeScroll = true; 
    } 
    @Override 
    public boolean onTouchEvent(MotionEvent event) { 
     if (event.getAction() == MotionEvent.ACTION_DOWN) 
      this.isTouchEnded = false; 
     else if (event.getAction() == MotionEvent.ACTION_UP) 
      this.isTouchEnded = true; 
     else if (event.getAction() == MotionEvent.ACTION_MOVE) 
      this.isFirstComputeScroll = true; 
     return super.onTouchEvent(event); 
    } 
    @Override 
    public void computeScroll() { 
     super.computeScroll(); 
     if (this.isTouchEnded && 
      this.lastMapCenter.equals(this.getMapCenter()) && 
      this.isFirstComputeScroll) { 
      // here you use this.getMapCenter() (e.g. call onEndDrag method) 
      this.isFirstComputeScroll = false; 
     } 
     else 
      this.lastMapCenter = this.getMapCenter(); 
    } 
} 

Eso es todo, espero que ayude! o/

+0

Esto funcionó, esta debería ser la respuesta aceptada. – Federico

0

Desde agosto de 2016 Maps para Android es capaz de detectar eventos tales como onCameraMoveStarted (y las razones para el movimiento, por ejemplo, REASON_GESTURE, REASON_DEVELOPER_ANIMATION.

El siguiente código (en su mayoría tomada de la docs) da una idea de lo que puede lograr:?.

public class MyCameraActivity extends FragmentActivity implements 
     OnCameraMoveStartedListener, 
     OnCameraMoveListener, 
     OnCameraMoveCanceledListener, 
     OnCameraIdleListener, 
     OnMapReadyCallback { 

    private GoogleMap mMap; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_my_camera); 

     SupportMapFragment mapFragment = 
      (SupportMapFragment) getSupportFragmentManager() 
        .findFragmentById(R.id.map); 
     mapFragment.getMapAsync(this); 
    } 

    @Override 
    public void onMapReady(GoogleMap map) { 
     mMap = map; 

     mMap.setOnCameraIdleListener(this); 
     mMap.setOnCameraMoveStartedListener(this); 
     mMap.setOnCameraMoveListener(this); 
     mMap.setOnCameraMoveCanceledListener(this); 

     // Show Sydney on the map. 
     mMap.moveCamera(CameraUpdateFactory 
       .newLatLngZoom(new LatLng(-33.87365, 151.20689), 10)); 
    } 

    @Override 
    public void onCameraMoveStarted(int reason) { 

     if (reason == OnCameraMoveStartedListener.REASON_GESTURE) { 
      Toast.makeText(this, "The user gestured on the map.", 
          Toast.LENGTH_SHORT).show(); 
     } else if (reason == OnCameraMoveStartedListener 
           .REASON_API_ANIMATION) { 
      Toast.makeText(this, "The user tapped something on the map.", 
          Toast.LENGTH_SHORT).show(); 
     } else if (reason == OnCameraMoveStartedListener 
           .REASON_DEVELOPER_ANIMATION) { 
      Toast.makeText(this, "The app moved the camera.", 
          Toast.LENGTH_SHORT).show(); 
     } 
    } 

    @Override 
    public void onCameraMove() { 
     Toast.makeText(this, "The camera is moving.", 
         Toast.LENGTH_SHORT).show(); 
    } 

    @Override 
    public void onCameraMoveCanceled() { 
     Toast.makeText(this, "Camera movement canceled.", 
         Toast.LENGTH_SHORT).show(); 
    } 

    @Override 
    public void onCameraIdle() { 
     Toast.makeText(this, "The camera has stopped moving.", 
         Toast.LENGTH_SHORT).show(); 
     // Here you get the camera center 
     GeoPoint geoPoint = projection.fromPixels(mMap.getHeight()/2, mMap.getWidth()/2); 
     double centerLat = (double)geoPoint.getLatitudeE6()/(double)1E6; 
     double centerLng = (double)geoPoint.getLongitudeE6()/(double)1E6; 
    } 
} 
Cuestiones relacionadas