2012-10-06 7 views
5

He estado trabajando duro en este momento y he buscado en Google y SO, pero parece que no puedo encontrar a nadie más que me informe tal problema (podría haberlo perdido).Android Map Marker on Longpress se traza debajo del área que en realidad tiene LongPressed (en API 15)

Tengo una clase Mapview personalizada que escucha longpress entre otros y la estoy usando para trazar marcadores en mi mapa. Traza bien en API-8. Pero en API-15, el marcador se compensa aproximadamente 2 cm por debajo de donde el dedo del usuario está haciendo la pulsación larga. Esto se observa tanto para el dispositivo real (samsung s2) como para el emulador de eclipse. También se observa el área de los dedos presionada con tiempo contra el área marcada (compensada por aproximadamente 2 cm) en todos los niveles de zoom.

Aquí es mi Mapview personalizado Clase (tirón de alguna parte):

public class MyCustomMapView extends MapView { 
public interface OnLongpressListener { 
    public void onLongpress(MapView view, GeoPoint longpressLocation); 
} 

static final int LONGPRESS_THRESHOLD = 500; 
private GeoPoint lastMapCenter; 

private Timer longpressTimer = new Timer(); 
private MyCustomMapView.OnLongpressListener longpressListener; 


public MyCustomMapView(Context context, String apiKey) { 
    super(context, apiKey); 
} 

public MyCustomMapView(Context context, AttributeSet attrs) { 
    super(context, attrs); 
} 

public MyCustomMapView(Context context, AttributeSet attrs, int defStyle) { 
    super(context, attrs, defStyle); 
} 

public void setOnLongpressListener(MyCustomMapView.OnLongpressListener listener) { 
    longpressListener = listener; 
} 

@Override 
public boolean onTouchEvent(MotionEvent event) { 
    handleLongpress(event); 

    return super.onTouchEvent(event); 
} 

private void handleLongpress(final MotionEvent event) { 

    if (event.getAction() == MotionEvent.ACTION_DOWN) { 
     // Finger has touched screen. 
     longpressTimer = new Timer(); 
     longpressTimer.schedule(new TimerTask() { 
      @Override 
      public void run() { 

       GeoPoint longpressLocation = getProjection().fromPixels((int)event.getX(), (int)event.getY()); 

       /* 
       * Fire the listener. We pass the map location 
       * of the longpress as well, in case it is needed 
       * by the caller. 
       */ 
       longpressListener.onLongpress(MyCustomMapView.this, longpressLocation); 
      } 

     }, LONGPRESS_THRESHOLD); 

     lastMapCenter = getMapCenter(); 
    } 

    if (event.getAction() == MotionEvent.ACTION_MOVE) { 

     if (!getMapCenter().equals(lastMapCenter)) { 
      // User is panning the map, this is no longpress 
      longpressTimer.cancel(); 
     } 

     lastMapCenter = getMapCenter(); 
    } 

    if (event.getAction() == MotionEvent.ACTION_UP) { 
     // User has removed finger from map. 
     longpressTimer.cancel(); 
    } 

     if (event.getPointerCount() > 1) { 
        // This is a multitouch event, probably zooming. 
      longpressTimer.cancel(); 
     } 
} 

y así es como llamo a la clase anterior:

custom_marker = getResources().getDrawable(R.drawable.marker3); 
custom_marker.setBounds(-custom_marker.getIntrinsicWidth(), -custom_marker.getIntrinsicHeight(), 0, 0); 
customSitesOverlay = new CustomSitesOverlay(custom_marker); 
mapView.getOverlays().add(customSitesOverlay); 
customSitesOverlay.addOverlay(new OverlayItem(longpressLocation, "User Marker", id)); 
+0

Yo también estoy enfrentando el mismo problema. @Marka, ¿ha encontrado alguna solución, por favor, comparta ... Gracias de antemano –

+0

Lo sentimos @MukeshY abandonamos este enfoque por completo y optamos por un pin fijo en el mapa a través del código. –

Respuesta

1

Se ve como un problema setBounds. Está configurando los límites del marcador para centrar en la esquina inferior derecha de dibujable. ¿Es ese el comportamiento intencionado?

puede establecer el marcador para centrar en la parte inferior central (que es el tipo más habitual o marcadores) establecer los límites a:

custom_marker.setBounds(-custom_marker.getIntrinsicWidth()/2, -custom_marker.getIntrinsicHeight(), custom_marker.getIntrinsicWidth()/2, 0); 

buena suerte.

+0

Gracias @Luis, pero el uso de su solución todavía resulta en el mismo comportamiento. También intenté variar estos parámetros en mi búsqueda de respuestas (se me olvidó mencionar que en el mensaje lo siento). Además, estoy obteniendo el comportamiento deseado en la configuración original usando API 8. Es solo en API 15 que este comportamiento se observa actualmente (no lo he probado en otras versiones). –

+0

No debería obtener el mismo comportamiento que establecería dos límites diferentes para el dibujable. Si está obteniendo el mismo comportamiento, definitivamente tiene un problema de límites. Recuerdo que alguien informaba sobre un problema similar, que después de una actividad de llamada los límites del drawable se perdían, pero para el momento no se aceptaba ninguna solución. – Luis

+0

¡Derecha @luis! Estaba siendo anulado con configuraciones en la clase CustomSitesOverlay. Pero he intentado eliminarlo y tengo un trazado de marcadores en la actividad real de la pulsación larga y todavía estoy devolviendo la colocación correcta de marcadores en el área presionada para API Nivel 8 (y un dispositivo HTC) y una compensación de aproximadamente 2 cm (el marcador se traza 2 cm por debajo área presionada) para API nivel 15 (y un dispositivo Samsung S2). El error de 2 cm ocurre en todos los niveles de zoom también. –

Cuestiones relacionadas