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));
Yo también estoy enfrentando el mismo problema. @Marka, ¿ha encontrado alguna solución, por favor, comparta ... Gracias de antemano –
Lo sentimos @MukeshY abandonamos este enfoque por completo y optamos por un pin fijo en el mapa a través del código. –